const fs = require('fs'); let code = fs.readFileSync('src/components/Dashboard.js', 'utf8'); // 1. ADD MISSING STATE AND FUNCTIONS FOR USER PROVISIONING const stateIndex = code.indexOf('const [isEditMode, setIsEditMode] = useState(false);'); if (stateIndex > -1) { const userStates = ` const [showUserModal, setShowUserModal] = useState(false); const [usersList, setUsersList] = useState([]); const [userFormData, setUserFormData] = useState({ email: '', password: '', full_name: '', role: 'pic' }); const [isSubmittingUser, setIsSubmittingUser] = useState(false); const fetchUsers = async () => { try { const res = await fetch('/api/users'); if (res.ok) { const data = await res.json(); setUsersList(data.users || []); } } catch (e) { console.error('Error fetching users:', e); } }; const handleCreateUser = async (e) => { e.preventDefault(); setIsSubmittingUser(true); try { const res = await fetch('/api/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(userFormData) }); if (res.ok) { alert('User created successfully'); fetchUsers(); setUserFormData({ email: '', password: '', full_name: '', role: 'pic' }); setShowUserModal(false); } else { const data = await res.json(); alert('Failed to create user: ' + data.error); } } catch (e) { alert('Error: ' + e.message); } setIsSubmittingUser(false); }; const handleDeleteUser = async (id) => { if (!confirm('Are you sure you want to delete this user?')) return; try { const res = await fetch(\`/api/users?id=\${id}\`, { method: 'DELETE' }); if (res.ok) fetchUsers(); else alert('Failed to delete user'); } catch (e) { alert('Error deleting user'); } }; `; code = code.substring(0, stateIndex) + userStates + code.substring(stateIndex); } // 2. REMOVE isPointInPolygon AND getKecamatanForPoint code = code.replace(/const isPointInPolygon = [\s\S]*?return null;\n};\n/, ''); // 3. FIX PostGIS USAGES (remove getKecamatanForPoint calls) code = code.replace(/const calculatedKec = getKecamatanForPoint[^;]+;/g, ''); code = code.replace(/hh\.sub_district \|\| calculatedKec \|\| subDistrictsList\[idx % subDistrictsList\.length\]/g, "hh.sub_district || 'Belum Terpetakan'"); code = code.replace(/hh\.sub_district = calculatedKec \|\| hh\.sub_district \|\| subDistrictsList\[idx % subDistrictsList\.length\];/g, "hh.sub_district = hh.sub_district || 'Belum Terpetakan';"); // 4. ADD MODULAR IMPORTS const imports = `import SidebarControls from './dashboard/SidebarControls'; import StatsPanel from './dashboard/StatsPanel'; import ApprovalQueueModal from './dashboard/modals/ApprovalQueueModal'; import UserProvisioningModal from './dashboard/modals/UserProvisioningModal'; import DonationModal from './dashboard/modals/DonationModal'; import HubFormModal from './dashboard/modals/HubFormModal'; import HouseholdFormModal from './dashboard/modals/HouseholdFormModal'; `; code = code.replace("import { useRouter } from 'next/navigation';", "import { useRouter } from 'next/navigation';\n" + imports); // 5. REPLACE LEFT PANEL const leftPanelStart = code.indexOf('{/* Left Panel (Controls) */}'); const leftPanelEnd = code.indexOf('{/* Right Panel (Stats) */}'); if (leftPanelStart > -1 && leftPanelEnd > -1) { const newLeftPanel = `{/* Left Panel (Controls) */}