// ===================================================== // API.js โ€” Mekanisme Fetch Data Beasiswa (terpusat) // ----------------------------------------------------- // Alur: coba API remote (Directus publik) โ†’ jika gagal, // fallback ke berkas lokal `data/beasiswa.json`. // // Data remote dinormalisasi ke skema UI yang sama dengan // data lokal agar filter.js dan popup.js tidak perlu berubah. // ===================================================== (function (global) { 'use strict'; const CONFIG = { baseUrl: 'https://api.ifuntanhub.dev', collection: '/items/beasiswa', localSource: 'data/beasiswa.json', }; // Normalise status remote โ†’ nilai yang dipakai UI function normalizeStatus(s) { if (!s) return 'Ditutup'; const lower = s.toLowerCase(); if (lower === 'dibuka' || lower === 'buka') return 'Buka'; if (lower === 'ditutup') return 'Ditutup'; return s; // "Segera Dibuka" atau nilai lain: tampilkan apa adanya } // Petakan satu item Directus ke skema yang diharapkan filter.js / popup.js function normalizeItem(item) { const parts = [item.jenjang, item.negara, item.tipe_pendanaan].filter(Boolean); return { id: String(item.id), nama: item.nama || '', status: normalizeStatus(item.status), kategori: item.tipe_pendanaan || '', thumbnail: '', deskripsi_singkat: parts.join(' ยท ') || 'Info beasiswa tersedia di sumber resmi.', tanggal_buka: item.tanggal_buka || '', tanggal_tutup: item.tenggat_waktu || '', url_sumber: item.url || '', syarat_umum: [], kontak: '', tags: parts, }; } async function fetchRemote() { const res = await fetch(CONFIG.baseUrl + CONFIG.collection); if (!res.ok) throw new Error(`API merespons HTTP ${res.status}`); const json = await res.json(); return (json.data || []).map(normalizeItem); } async function fetchLocal() { const res = await fetch(CONFIG.localSource); if (!res.ok) throw new Error(`Gagal memuat data lokal (HTTP ${res.status})`); const json = await res.json(); return Array.isArray(json) ? json : json.data || []; } async function getBeasiswa() { try { const data = await fetchRemote(); return { data, source: 'remote' }; } catch (err) { console.warn('[BeasiswaAPI] API remote gagal, fallback ke data lokal:', err.message); const data = await fetchLocal(); return { data, source: 'local' }; } } global.BeasiswaAPI = { config: CONFIG, getBeasiswa, fetchRemote, fetchLocal }; })(window);