// ==========================================
// PATCH SINKRONISASI CLOUDFLARE X APPS SCRIPT
// ==========================================
function apiFetch(action, payload = {}) {
if (PREVIEW_MODE) return Promise.resolve();
return fetch(APP_URL, {
method: 'POST',
body: JSON.stringify({ action: action, payload: payload })
}).then(res => res.json()).catch(err => console.error("API Error", err));
}
async function loadDataDariServer() {
if (PREVIEW_MODE) return;
try {
const [resUsers, resPresensi, resTabungan, resEvents, resMitra] = await Promise.all([
apiFetch('getUsers'), apiFetch('getPresensi'), apiFetch('getTabungan'), apiFetch('getEvents'), apiFetch('getMitra')
]);
if (resUsers && resUsers.users) mockUsers = resUsers.users;
if (resPresensi && resPresensi.data) mockPresensi = resPresensi.data;
if (resTabungan && resTabungan.data) mockTabungan = resTabungan.data;
if (resEvents && resEvents.data) mockEvents = resEvents.data;
if (resMitra && resMitra.data) mockMitra = resMitra.data;
if(activeTab) switchTab(activeTab);
} catch(e) {}
}
const oriLogin = handleLogin;
handleLogin = function(e) {
e.preventDefault();
const u = e.target.username.value.trim();
const p = e.target.password.value.trim();
if (PREVIEW_MODE) return oriLogin(e);
showToast('Sedang verifikasi ke server...', 'info');
fetch(APP_URL, { method: 'POST', body: JSON.stringify({ action: 'login', payload: { username: u, password: p } }) })
.then(res => res.json())
.then(res => {
if (res.status === 'success') {
currentUser = res.user;
if (e.target.rememberMe && e.target.rememberMe.checked) localStorage.setItem('azzam_saved_user', JSON.stringify(currentUser));
showToast(`Selamat datang, ${currentUser.name}!`);
renderMainLayout();
loadDataDariServer();
} else showToast(res.message, 'error');
}).catch(() => showToast('Server tidak merespons', 'error'));
}
window.addEventListener('DOMContentLoaded', () => {
const savedUser = localStorage.getItem('azzam_saved_user');
if (savedUser) {
try {
currentUser = JSON.parse(savedUser);
renderMainLayout();
loadDataDariServer();
} catch(e) {}
}
});
const oriSaveEvent = handleSaveAgendaModal;
handleSaveAgendaModal = function(e) { oriSaveEvent(e); apiFetch('saveEvent', mockEvents[mockEvents.length-1]); }
const oriUpdateEvent = handleUpdateAgendaModal;
handleUpdateAgendaModal = function(e, id) { oriUpdateEvent(e, id); apiFetch('updateEvent', mockEvents.find(x => x.id === id)); }
deleteAgenda = function(id) {
if(confirm('Hapus agenda?')) { mockEvents = mockEvents.filter(x => x.id !== id); apiFetch('deleteEvent', {id}); renderDashboardView(document.getElementById('main-content')); showToast('Terhapus'); }
}
const oriSavePresensi = handleSavePresensiForm;
handleSavePresensiForm = function(e) { oriSavePresensi(e); const p = mockPresensi.find(x => x.date === e.target.date.value && x.userId === currentUser.id); if(p) apiFetch('savePresensi', p); }
const oriToggleVal = togglePresensiValidation;
togglePresensiValidation = function(id) { oriToggleVal(id); apiFetch('updatePresensiValidasi', {id, status: mockPresensi.find(x=>x.id===id).validated}); }
const oriCheckAll = checkAllUserPresensi;
checkAllUserPresensi = function(s) { oriCheckAll(s); apiFetch('updateSemuaValidasi', {userId: selectedAdminPegawaiId, status: s}); }
const oriSaveTab = saveTabunganToState;
saveTabunganToState = function(t, a, d, p) { oriSaveTab(t, a, d, p); apiFetch('saveTabungan', mockTabungan[mockTabungan.length-1]); }
const oriSaveMitra = handleSaveMitraModal;
handleSaveMitraModal = function(e, id) { oriSaveMitra(e, id); apiFetch(id ? 'updateMitra' : 'saveMitra', id ? mockMitra.find(m=>m.id===id) : mockMitra[mockMitra.length-1]); }
deleteMitra = function(id) { if(confirm('Hapus mitra?')) { mockMitra = mockMitra.filter(m=>m.id!==id); apiFetch('deleteMitra', {id}); renderMitraAzzamView(document.getElementById('main-content')); } }
const oriSavePegawai = handleSavePegawaiModal;
handleSavePegawaiModal = function(e, id) { oriSavePegawai(e, id); apiFetch(id ? 'updateUser' : 'saveUser', id ? mockUsers.find(u=>u.id===id) : mockUsers[mockUsers.length-1]); }
const oriToggleStatus = toggleUserStatus;
toggleUserStatus = function(id) { oriToggleStatus(id); apiFetch('updateUserStatus', {id, status: mockUsers.find(u=>u.id===id).status}); }
deletePegawai = function(id) { if(confirm('Hapus pegawai?')) { mockUsers = mockUsers.filter(u=>u.id!==id); apiFetch('deleteUser', {id}); renderKelolaPegawaiView(document.getElementById('main-content')); } }
const oriSaveProfile = handleSaveProfileForm;
handleSaveProfileForm = function(e) { oriSaveProfile(e); apiFetch('updateUser', currentUser); }