/* eslint-disable react-hooks/exhaustive-deps */ 'use client'; import colors from '@/con/colors'; import { Box, Button, Group, Loader, Paper, Stack, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useCallback, useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import demografiPekerjaan from '../../../_state/ekonomi/demografi-pekerjaan'; interface FormData { pekerjaan: string; lakiLaki: number; perempuan: number; } export default function EditDemografiPekerjaan() { const router = useRouter(); const { id } = useParams() as { id: string }; const stateDemografi = useProxy(demografiPekerjaan); const [isSubmitting, setIsSubmitting] = useState(false); const [formData, setFormData] = useState({ pekerjaan: '', lakiLaki: 0, perempuan: 0, }); const [originalData, setOriginalData] = useState({ pekerjaan: '', lakiLaki: 0, perempuan: 0, }); // Check if form is valid const isFormValid = () => { return ( formData.pekerjaan?.trim() !== '' && formData.lakiLaki !== null && formData.lakiLaki >= 0 && formData.perempuan !== null && formData.perempuan >= 0 ); }; // ✅ Load data hanya sekali di awal (tidak reset form) useEffect(() => { if (!id) return; const loadData = async () => { try { setIsSubmitting(true); stateDemografi.update.id = id; await stateDemografi.findUnique.load(id); const data = stateDemografi.findUnique.data; if (data) { setFormData({ pekerjaan: data.pekerjaan ?? '', lakiLaki: Number(data.lakiLaki ?? 0), perempuan: Number(data.perempuan ?? 0), }); setOriginalData({ pekerjaan: data.pekerjaan ?? '', lakiLaki: Number(data.lakiLaki ?? 0), perempuan: Number(data.perempuan ?? 0), }); } } catch (error) { console.error('Error loading data:', error); toast.error('Gagal memuat data'); } finally { setIsSubmitting(false); } }; loadData(); }, [id]); // ✅ Handler input terkontrol (tidak buat re-render berlebihan) const handleChange = useCallback( (field: keyof FormData) => (e: React.ChangeEvent) => { const value = field === 'lakiLaki' || field === 'perempuan' ? Number(e.currentTarget.value) : e.currentTarget.value; setFormData((prev) => ({ ...prev, [field]: value })); }, [] ); const handleResetForm = () => { setFormData({ pekerjaan: originalData.pekerjaan, lakiLaki: Number(originalData.lakiLaki), perempuan: Number(originalData.perempuan), }); toast.info("Form dikembalikan ke data awal"); }; // ✅ Submit hanya update global state sekali const handleSubmit = async () => { try { setIsSubmitting(true); stateDemografi.update.id = id; stateDemografi.update.form = { ...formData }; await stateDemografi.update.submit(); toast.success('Data berhasil diperbarui'); router.push('/admin/ekonomi/demografi-pekerjaan'); } catch (error) { console.error('Error updating data:', error); toast.error('Gagal memperbarui data'); } finally { setIsSubmitting(false); } }; return ( {/* Header */} Edit Demografi Pekerjaan {/* Form Card */} {/* Tombol Simpan */} ); }