// mapscreen.jsx — full-bleed civic reporting map. Exported to window. const MAP_FILTERS = [ { key: 'all', label: 'Semua', color: 'var(--s-700)' }, { key: 'kriminalitas', label: 'Kriminalitas', color: 'var(--coral)' }, { key: 'jalan', label: 'Jalan Rusak', color: 'var(--amber)' }, { key: 'traffic', label: 'Lalu Lintas', color: 'var(--blue)' }, { key: 'lingkungan', label: 'Lingkungan', color: 'var(--lime)' }, { key: 'selesai', label: 'Selesai', color: 'var(--lime-700)' }, ]; function FrostBar({ dark, children, style = {} }) { return (
{children}
); } function PinSheet({ report, dark, onClose, onDetail, onUp, upActive }) { const c = CATS[report.cat] || CATS.lainnya; return (
{report.photo ? :
}
{c.label}
{report.title}
{report.area} · {report.time}
onUp(report.id)}>
); } function MapScreen({ dark, startReport, openReport, reports = [], myUps = {}, onUp }) { const [filter, setFilter] = React.useState('all'); const [sel, setSel] = React.useState(null); const toggleUp = onUp || (() => {}); const shown = reports.filter(r => { if (filter === 'all') return true; if (filter === 'selesai') return r.status === 'selesai'; return r.cat === filter; }); const selReport = reports.find(r => r.id === sel) || null; return (
setSel(r.id)} onBlank={() => setSel(null)} showUser /> {/* top frosted search + filters */}
{MAP_FILTERS.map(f => { const active = filter === f.key; return ( ); })}
{/* floating buttons */} {!selReport && ( )} {selReport && ( setSel(null)} onDetail={openReport} onUp={toggleUp} upActive={!!myUps[selReport.id]} /> )}
); } Object.assign(window, { MapScreen, FrostBar, PinSheet, MAP_FILTERS });