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 = '
💬 Belum ada pesan di channel ini
'; return; } const prevScroll = box.scrollHeight - box.scrollTop; box.innerHTML = msgs.map(m => { const mine = user && m.id_user == user.id; return `
${!mine ? `
${m.nama_lengkap || 'User'}
` : ''}
${escHtml(m.pesan)}
${(m.created_at||'').substring(11,16)}
`; }).join(''); // Scroll ke bawah jika sudah di bawah if (prevScroll < 200) box.scrollTop = box.scrollHeight; } async function send() { const inp = ge('chat-input'); const pesan = inp.value.trim(); if (!pesan) return; if (!App.currentUser()) { App.toast('Harus login untuk mengirim pesan','warning'); App.showModal('modal-login'); return; } inp.value = ''; try { await Api.post('/chat', { pesan, id_room: currentRoom }); await fetchMessages(); } catch(e) { App.toast(e.message,'error'); } } function escHtml(s) { return (s||'').replace(/&/g,'&').replace(//g,'>').replace(/\n/g,'
'); } return { init, loadRoom, send }; })();