/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import { IconKey } from '@/app/admin/(dashboard)/_com/iconMap'; import programKreatifState from '@/app/admin/(dashboard)/_state/inovasi/program-kreatif'; import colors from '@/con/colors'; import { Box, Button, Group, Loader, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import SelectIconProgramEdit from '../../../../_com/selectIconEdit'; interface FormProgramKreatif { name: string; deskripsi: string; slug: string; icon: string; } function EditProgramKreatifDesa() { const stateProgramKreatif = useProxy(programKreatifState); const params = useParams(); const router = useRouter(); const [isSubmitting, setIsSubmitting] = useState(false); const [formData, setFormData] = useState({ name: '', deskripsi: '', slug: '', icon: '', }); const [originalData, setOriginalData] = useState({ name: '', deskripsi: '', slug: '', icon: '', }); const [isDataChanged, setIsDataChanged] = useState(false); // Helper function to check if HTML content is empty const isHtmlEmpty = (html: string) => { // Remove all HTML tags and check if there's any text content const textContent = html.replace(/<[^>]*>/g, '').trim(); return textContent === ''; }; // Check if form is valid const isFormValid = () => { return ( formData.name?.trim() !== '' && formData.slug?.trim() !== '' && !isHtmlEmpty(formData.deskripsi) && formData.icon?.trim() !== '' ); }; // Load data hanya sekali berdasarkan params.id useEffect(() => { const loadProgramKreatif = async () => { const id = params?.id as string; if (!id) return; try { const data = await stateProgramKreatif.update.load(id); if (data) { stateProgramKreatif.update.id = id; const loadedData = { name: data.name || '', slug: data.slug || '', deskripsi: data.deskripsi || '', icon: data.icon || '', }; setFormData(loadedData); setOriginalData(loadedData); } } catch (error) { console.error('Error loading program kreatif:', error); toast.error('Gagal memuat data program kreatif'); } }; loadProgramKreatif(); }, [params?.id]); // Deteksi perubahan data useEffect(() => { const hasChanged = formData.name !== originalData.name || formData.slug !== originalData.slug || formData.deskripsi !== originalData.deskripsi || formData.icon !== originalData.icon; setIsDataChanged(hasChanged); }, [formData, originalData]); // Prevent browser back/refresh jika ada perubahan useEffect(() => { const handleBeforeUnload = (e: BeforeUnloadEvent) => { if (isDataChanged) { e.preventDefault(); e.returnValue = ''; } }; window.addEventListener('beforeunload', handleBeforeUnload); return () => window.removeEventListener('beforeunload', handleBeforeUnload); }, [isDataChanged]); const handleChange = (field: keyof FormProgramKreatif) => (value: string) => { setFormData((prev) => ({ ...prev, [field]: value })); }; const handleBackClick = () => { if (isDataChanged) { const confirmed = window.confirm( 'Anda memiliki perubahan yang belum disimpan. Apakah Anda yakin ingin keluar dari halaman ini? Semua perubahan akan hilang.' ); if (confirmed) { router.back(); } } else { router.back(); } }; const handleResetForm = () => { setFormData({ name: originalData.name, slug: originalData.slug, deskripsi: originalData.deskripsi, icon: originalData.icon, }); setOriginalData({ ...originalData, }); toast.info("Form dikembalikan ke data awal"); }; const handleSubmit = async () => { try { setIsSubmitting(true); stateProgramKreatif.update.form = { name: formData.name.trim(), deskripsi: formData.deskripsi.trim(), slug: formData.slug.trim(), icon: formData.icon.trim(), }; await stateProgramKreatif.update.submit(); // Reset isDataChanged agar tidak muncul konfirmasi setelah save setOriginalData(formData); setIsDataChanged(false); router.push('/admin/inovasi/program-kreatif-desa'); } catch (error) { console.error('Error updating program kreatif:', error); toast.error('Gagal menyimpan program kreatif'); } finally { setIsSubmitting(false); } }; return ( Edit Program Kreatif Desa handleChange('name')(e.target.value)} required /> handleChange('slug')(e.target.value)} required /> Deskripsi Ikon Program Kreatif Desa {/* Tombol Simpan */} ); } export default EditProgramKreatifDesa;