/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import pencegahanKriminalitasState from '@/app/admin/(dashboard)/_state/keamanan/pencegahan-kriminalitas'; import { convertYoutubeUrlToEmbed } from '@/app/admin/(dashboard)/desa/gallery/lib/youtube-utils'; 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'; function EditPencegahanKriminalitas() { const router = useRouter(); const params = useParams(); const kriminalitasState = useProxy(pencegahanKriminalitasState); const [isSubmitting, setIsSubmitting] = useState(false); const [formData, setFormData] = useState({ judul: '', deskripsi: '', deskripsiSingkat: '', linkVideo: '', }); const [originalData, setOriginalData] = useState({ judul: '', deskripsi: '', deskripsiSingkat: '', linkVideo: '', }); // 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.judul?.trim() !== '' && !isHtmlEmpty(formData.deskripsiSingkat) && !isHtmlEmpty(formData.deskripsi) && convertYoutubeUrlToEmbed(formData.linkVideo) !== '' ); }; // load data hanya sekali pas id berubah useEffect(() => { const loadKriminalitas = async () => { const id = params?.id as string; if (!id) return; try { const data = await kriminalitasState.update.load(id); if (data) { setFormData({ judul: data.judul ?? '', deskripsi: data.deskripsi ?? '', deskripsiSingkat: data.deskripsiSingkat ?? '', linkVideo: data.linkVideo ?? '', }); setOriginalData({ judul: data.judul ?? '', deskripsi: data.deskripsi ?? '', deskripsiSingkat: data.deskripsiSingkat ?? '', linkVideo: data.linkVideo ?? '', }); } } catch (error) { console.error('Error loading pencegahan kriminalitas:', error); toast.error('Gagal memuat data pencegahan kriminalitas'); } }; loadKriminalitas(); }, [params?.id]); const embedLink = convertYoutubeUrlToEmbed(formData.linkVideo); const handleChange = (field: keyof typeof formData) => (e: React.ChangeEvent) => { setFormData((prev) => ({ ...prev, [field]: e.target.value })); }; const handleResetForm = () => { setFormData({ judul: originalData.judul, deskripsi: originalData.deskripsi, deskripsiSingkat: originalData.deskripsiSingkat, linkVideo: originalData.linkVideo, }); toast.info("Form dikembalikan ke data awal"); }; const handleSubmit = async () => { const converted = convertYoutubeUrlToEmbed(formData.linkVideo); if (!converted) { toast.error('Link YouTube tidak valid. Pastikan formatnya benar.'); return; } try { setIsSubmitting(true); // update global state saat submit kriminalitasState.update.form = { judul: formData.judul, deskripsi: formData.deskripsi, deskripsiSingkat: formData.deskripsiSingkat, linkVideo: formData.linkVideo, }; kriminalitasState.update.id = params?.id as string; await kriminalitasState.update.update(); toast.success('Pencegahan Kriminalitas berhasil diperbarui!'); router.push('/admin/keamanan/pencegahan-kriminalitas'); } catch (error) { console.error('Error updating pencegahan kriminalitas:', error); toast.error('Terjadi kesalahan saat memperbarui data'); } finally { setIsSubmitting(false); } }; return ( {/* Back button + Title */} Edit Pencegahan Kriminalitas {/* Form container */} Deskripsi setFormData((prev) => ({ ...prev, deskripsiSingkat: val })) } /> Deskripsi Lengkap setFormData((prev) => ({ ...prev, deskripsi: val })) } /> {embedLink && ( )} {/* Action button */} {/* Tombol Simpan */} ); } export default EditPencegahanKriminalitas;