'use client' /* eslint-disable react-hooks/exhaustive-deps */ import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import penghargaanState from '@/app/admin/(dashboard)/_state/desa/penghargaan'; 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 EditPenghargaan() { const statePenghargaan = useProxy(penghargaanState); const router = useRouter(); const params = useParams(); const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const [originalData, setOriginalData] = useState({ name: "", juara: "", deskripsi: "", imageId: "", imageUrl: "", }); // Lokal formData const [formData, setFormData] = useState({ name: '', juara: '', deskripsi: '', imageId: '', }); // Load data pertama kali useEffect(() => { const loadPenghargaan = async () => { const id = params?.id as string; if (!id) return; try { const data = await statePenghargaan.edit.load(id); if (data) { const newForm = { name: data.name || "", juara: data.juara || "", deskripsi: data.deskripsi || "", imageId: data.imageId || "", }; setFormData(newForm); // simpan juga versi original const imageUrl = data.image?.link || ""; setOriginalData({ ...newForm, imageUrl: imageUrl, }); setPreviewImage(imageUrl || null); } } catch (error) { console.error('Error loading penghargaan:', error); toast.error('Gagal memuat data penghargaan'); } }; loadPenghargaan(); }, [params?.id]); const handleResetForm = () => { setFormData({ name: originalData.name, juara: originalData.juara, deskripsi: originalData.deskripsi, imageId: originalData.imageId, }); setPreviewImage(originalData.imageUrl || null); setFile(null); toast.info("Form dikembalikan ke data awal"); }; // Submit const handleSubmit = async () => { try { setIsSubmitting(true); // Sync ke global state saat submit let imageId = formData.imageId; 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"); } imageId = uploaded.id; } // Update global state form (baru di sini) statePenghargaan.edit.form = { ...statePenghargaan.edit.form, name: formData.name, juara: formData.juara, deskripsi: formData.deskripsi, imageId, } await statePenghargaan.edit.update(); toast.success('Penghargaan berhasil diperbarui!'); router.push('/admin/desa/penghargaan'); } catch (error) { console.error('Error updating penghargaan:', error); toast.error('Terjadi kesalahan saat memperbarui penghargaan'); } finally { setIsSubmitting(false); } }; return ( {/* Tombol Back + Title */} Edit Penghargaan {/* Card Form */} {/* Input Judul */} setFormData((prev) => ({ ...prev, name: e.target.value }))} required /> {/* Input Juara */} setFormData((prev) => ({ ...prev, juara: e.target.value }))} required /> {/* Upload Gambar */} Gambar Penghargaan { const selectedFile = files[0]; if (selectedFile) { setFile(selectedFile); setPreviewImage(URL.createObjectURL(selectedFile)); } }} onReject={() => toast.error('File tidak valid, gunakan format gambar')} maxSize={5 * 1024 ** 2} accept={{ 'image/*': ['.jpeg', '.jpg', '.png', '.webp'] }} radius="md" p="xl" > Seret gambar atau klik untuk memilih file Maksimal 5MB, format gambar .png, .jpg, .jpeg, webp {previewImage && ( Preview Gambar {/* Tombol hapus (pojok kanan atas) */} { setPreviewImage(null); setFile(null); }} style={{ boxShadow: '0 2px 6px rgba(0,0,0,0.15)', }} > )} {/* Deskripsi */} Deskripsi setFormData((prev) => ({ ...prev, deskripsi: htmlContent })) } /> {/* Tombol Simpan */} {/* Tombol Simpan */} ); } export default EditPenghargaan;