/* eslint-disable react-hooks/exhaustive-deps */ 'use client'; import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import programKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/program-kesehatan/programKesehatan'; import colors from '@/con/colors'; import ApiFetch from '@/lib/api-fetch'; import { ActionIcon, Box, Button, Group, Image, Loader, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } 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 EditProgramKesehatan() { const programKesehatanState = useProxy(programKesehatan); const router = useRouter(); const params = useParams(); const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [formData, setFormData] = useState({ name: '', deskripsiSingkat: '', deskripsi: '', imageId: '', }); const [originalData, setOriginalData] = useState({ name: '', deskripsiSingkat: '', deskripsi: '', imageId: '', imageUrl: '' }); // 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() !== '' && !isHtmlEmpty(formData.deskripsiSingkat) && !isHtmlEmpty(formData.deskripsi) ); }; // Load data awal useEffect(() => { const loadData = async () => { const id = params?.id as string; if (!id) return; try { const data = await programKesehatanState.edit.load(id); if (!data) return; setFormData({ name: data.name || '', deskripsiSingkat: data.deskripsiSingkat || '', deskripsi: data.deskripsi || '', imageId: data.imageId || '', }); setOriginalData({ name: data.name || '', deskripsiSingkat: data.deskripsiSingkat || '', deskripsi: data.deskripsi || '', imageId: data.imageId || '', imageUrl: data.image?.link || '', }); if (data?.image?.link) setPreviewImage(data.image.link); } catch (err) { console.error(err); toast.error('Gagal memuat data program kesehatan'); } }; loadData(); }, [params?.id]); // Handler input controlled const handleChange = (key: keyof typeof formData, value: string) => { setFormData((prev) => ({ ...prev, [key]: value })); }; const handleResetForm = () => { setFormData({ name: originalData.name, deskripsiSingkat: originalData.deskripsiSingkat, deskripsi: originalData.deskripsi, imageId: originalData.imageId, }); setPreviewImage(originalData.imageUrl || null); setFile(null); toast.info("Form dikembalikan ke data awal"); }; // Submit form const handleSubmit = async () => { try { setIsSubmitting(true); const updatedForm = { ...programKesehatanState.edit.form, ...formData }; // Upload file kalau ada if (file) { const res = await ApiFetch.api.fileStorage.create.post({ file, name: file.name }); const uploaded = res.data?.data; if (!uploaded?.id) return toast.error('Gagal upload gambar'); updatedForm.imageId = uploaded.id; } programKesehatanState.edit.form = updatedForm; await programKesehatanState.edit.update(); toast.success('Program kesehatan berhasil diperbarui!'); router.push('/admin/kesehatan/program-kesehatan'); } catch (err) { console.error(err); toast.error('Terjadi kesalahan saat memperbarui program kesehatan'); } finally { setIsSubmitting(false); } }; return ( Edit Program Kesehatan {[ { label: 'Judul', key: 'name', placeholder: 'Masukkan judul' }, ].map((field) => ( handleChange(field.key as keyof typeof formData, e.target.value)} required /> ))} Deskripsi Singkat handleChange('deskripsiSingkat', val)} /> Deskripsi handleChange('deskripsi', val)} /> Gambar { const selectedFile = files[0]; if (!selectedFile) return; setFile(selectedFile); setPreviewImage(URL.createObjectURL(selectedFile)); }} onReject={() => toast.error('File tidak valid.')} maxSize={5 * 1024 ** 2} accept={{ 'image/*': ['.jpeg', '.jpg', '.png', '.webp'] }} >
Drag gambar ke sini atau klik untuk pilih file Maksimal 5MB dan harus format gambar
{previewImage && ( Preview { setPreviewImage(null); setFile(null); }} style={{ boxShadow: '0 2px 6px rgba(0,0,0,0.15)', }} > )}
{/* Tombol Simpan */}
); } export default EditProgramKesehatan;