/* ============================================================ js/auth.js — Login / Logout / Role management v2.1 ============================================================ */ window.appAuth = { loggedIn: false, nama: '', role: '' }; window.checkAuthState = async function () { try { var res = await fetch('php/check_auth.php', { cache: 'no-store' }); var data = await res.json(); window.appAuth.loggedIn = !!data.loggedIn; window.appAuth.nama = data.nama || ''; window.appAuth.role = data.role || ''; } catch (e) { window.appAuth = { loggedIn: false, nama: '', role: '' }; } window.renderAuthBar(); if (!window.appAuth.loggedIn) { window.openLoginModal(); } }; /* ── Render auth area di navbar ── */ window.renderAuthBar = function () { var area = document.getElementById('auth-area'); if (!area) return; area.innerHTML = ''; /* Clean up old nav buttons */ var navMenus = document.getElementById('nav-menus'); if (navMenus) { ['btn-pesan-nav','btn-laporan-mgr-nav'].forEach(function(id) { var el = document.getElementById(id); if (el) el.remove(); }); } if (!window.appAuth.loggedIn) { /* Show Masuk button */ var btnMasuk = document.createElement('button'); btnMasuk.className = 'nav-btn'; btnMasuk.id = 'btn-masuk-nav'; btnMasuk.innerHTML = ' Masuk'; btnMasuk.onclick = window.openLoginModal; area.appendChild(btnMasuk); } else { /* Role chip */ var chip = document.createElement('span'); var isPimpinan = window.appAuth.role === 'pimpinan_daerah'; chip.className = 'role-chip ' + (isPimpinan ? 'pimpinan' : 'pengurus'); chip.innerHTML = isPimpinan ? ' Pimpinan' : ' Pengurus'; area.appendChild(chip); var name = document.createElement('span'); name.className = 'auth-name'; name.textContent = window.appAuth.nama; area.appendChild(name); /* Pengurus: add Pesan & Laporan buttons to nav-menus */ if (window.appAuth.role === 'pengurus_masjid' && navMenus) { var btnMsg = document.createElement('button'); btnMsg.className = 'nav-btn msg-btn'; btnMsg.id = 'btn-pesan-nav'; btnMsg.innerHTML = ' Pesan '; btnMsg.onclick = window.openPesanPanel; navMenus.appendChild(btnMsg); var btnLap = document.createElement('button'); btnLap.className = 'nav-btn mgr-btn'; btnLap.id = 'btn-laporan-mgr-nav'; btnLap.innerHTML = ' Laporan '; btnLap.onclick = window.openLaporanPanel; navMenus.appendChild(btnLap); } var btnLogout = document.createElement('button'); btnLogout.className = 'nav-btn logout-btn'; btnLogout.id = 'btn-logout-nav'; btnLogout.innerHTML = ' Keluar'; btnLogout.onclick = window.doLogout; area.appendChild(btnLogout); } window.updateToolbarForRole(); if (window.pollLaporanNotification) window.pollLaporanNotification(); if (window.pollPesanNotification) window.pollPesanNotification(); }; /* ── Role-based toolbar control ── */ window.updateToolbarForRole = function () { var editBtn = document.getElementById('luminaModeEdit'); var menuKeluarga = document.getElementById('menu-tambah-keluarga'); var menuIbadah = document.getElementById('menu-tambah-ibadah'); var isPengurus = window.appAuth && window.appAuth.loggedIn && window.appAuth.role === 'pengurus_masjid'; if (isPengurus) { if (editBtn) editBtn.style.display = 'block'; if (menuKeluarga) menuKeluarga.style.display = 'flex'; if (menuIbadah) menuIbadah.style.display = 'flex'; } else { if (editBtn) editBtn.style.display = 'none'; if (menuKeluarga) menuKeluarga.style.display = 'none'; if (menuIbadah) menuIbadah.style.display = 'none'; if (window.appState && window.appState.mode === 'edit') window.setMode('view'); } }; /* ── Open login modal ── */ window.openLoginModal = function () { var overlay = document.getElementById('modal-login'); if (!overlay) return; document.getElementById('login-username').value = ''; document.getElementById('login-password').value = ''; document.getElementById('login-error').textContent = ''; overlay.style.display = 'flex'; document.getElementById('login-username').focus(); // Do not allow closing }; /* ── Login submit ── */ window.doLogin = async function (e) { e.preventDefault(); var btn = document.getElementById('btn-submit-login'); var errEl = document.getElementById('login-error'); var uname = document.getElementById('login-username').value.trim(); var pass = document.getElementById('login-password').value; if (!uname || !pass) { errEl.textContent = 'Username dan password wajib diisi.'; errEl.style.display = 'block'; return; } btn.disabled = true; btn.textContent = 'Masuk...'; errEl.textContent = ''; errEl.style.display = 'none'; try { var res = await fetch('php/login.php', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ username: uname, password: pass }) }); var data = await res.json(); if (data.success) { window.appAuth = { loggedIn: true, nama: data.nama, role: data.role }; document.getElementById('modal-login').style.display = 'none'; window.renderAuthBar(); window.loadAllData(); window.showToast('Selamat datang, ' + data.nama + '!', 'success'); } else { errEl.textContent = data.error || 'Login gagal.'; errEl.style.display = 'block'; } } catch (err) { errEl.textContent = 'Koneksi gagal: ' + err.message; errEl.style.display = 'block'; } finally { btn.disabled = false; btn.innerHTML = 'Masuk Sekarang '; } }; /* ── Logout ── */ window.doLogout = async function () { await fetch('php/logout.php', { cache: 'no-store' }); window.appAuth = { loggedIn: false, nama: '', role: '' }; window.renderAuthBar(); if (window.appState && window.appState.mode === 'edit') window.setMode('view'); window.loadAllData(); window.openLoginModal(); window.showToast('Anda telah keluar.', 'info'); }; /* ── Toggle Password Visibility ── */ window.togglePassword = function () { var passInput = document.getElementById('login-password'); var eyeIcon = document.getElementById('login-password-eye'); if (passInput.type === 'password') { passInput.type = 'text'; eyeIcon.classList.remove('fa-eye'); eyeIcon.classList.add('fa-eye-slash'); } else { passInput.type = 'password'; eyeIcon.classList.remove('fa-eye-slash'); eyeIcon.classList.add('fa-eye'); } };