const Chat = (() => { let currentRoom = null, pollTimer = null; const DEMO_ROOMS = [ { id:1, nama:'# Koordinasi Umum' }, { id:2, nama:'# Bantuan Darurat' }, { id:3, nama:'# Distribusi Sembako' }, ]; const DEMO_MSGS = { null: [ { id:1, id_user:2, nama_lengkap:'Ahmad Fauzi', pesan:'Salam rekan-rekan semua. Ada keluarga di Gg. Mawar yang sangat butuh bantuan sembako segera.', created_at:'2025-05-13 08:00:00' }, { id:2, id_user:3, nama_lengkap:'Romo Benediktus',pesan:'Baik. Kami di Katedral juga sedang tangani kasus Ibu Maria yang sakit keras. Mohon dikoordinasikan.', created_at:'2025-05-13 08:05:00' }, { id:3, id_user:2, nama_lengkap:'Ahmad Fauzi', pesan:'Insya Allah kita distribusi bersama hari Jumat. Tolong daftarkan semua ke sistem ya.', created_at:'2025-05-13 08:10:00' }, { id:4, id_user:3, nama_lengkap:'Romo Benediktus',pesan:'Setuju. Saya sudah verifikasi laporan Ibu Maria. Status diproses.', created_at:'2025-05-13 08:15:00' }, ], 1: [{ id:5, id_user:2, nama_lengkap:'Ahmad Fauzi', pesan:'Koordinasi umum aktif. Silakan gunakan channel ini untuk diskusi lintas RI.', created_at:'2025-05-13 09:00:00' }], 2: [{ id:6, id_user:3, nama_lengkap:'Romo Benediktus', pesan:'Ada kasus darurat di Akcaya — balita gizi buruk. Butuh respons cepat.', created_at:'2025-05-14 07:00:00' }], 3: [{ id:7, id_user:2, nama_lengkap:'Ahmad Fauzi', pesan:'Jadwal distribusi sembako Ramadan: 15 Maret 2025, mulai pukul 08.00 di halaman masjid.', created_at:'2025-05-12 16:00:00' }], }; async function init() { // Load rooms let rooms = []; try { const d = await Api.get('/chat/rooms'); rooms = d?.length ? d : DEMO_ROOMS; } catch { rooms = DEMO_ROOMS; } const container = ge('chat-rooms'); container.innerHTML = ``; rooms.forEach(r => { const btn = document.createElement('button'); btn.className = 'room-btn'; btn.dataset.room = r.id; btn.textContent = r.nama; btn.onclick = function() { Chat.loadRoom(r.id, this); }; container.appendChild(btn); }); await loadRoom(null, container.firstChild); } async function loadRoom(roomId, btn) { currentRoom = roomId || null; clearInterval(pollTimer); document.querySelectorAll('.room-btn').forEach(b => b.classList.remove('active')); if (btn) btn.classList.add('active'); await fetchMessages(); pollTimer = setInterval(fetchMessages, 5000); // poll tiap 5 detik } async function fetchMessages() { let msgs = []; try { const url = currentRoom ? `/chat?room=${currentRoom}` : '/chat'; msgs = await Api.get(url); } catch { msgs = DEMO_MSGS[currentRoom] || DEMO_MSGS[null]; } renderMessages(msgs); } function renderMessages(msgs) { const box = ge('chat-messages'); const user = App.currentUser(); if (!msgs?.length) { box.innerHTML = '