/* eslint-disable react-hooks/exhaustive-deps */ "use client"; import sdgsDesa from "@/app/admin/(dashboard)/_state/landing-page/sdgs-desa"; 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"; export default function EditKolaborasiInovasi() { const sdgsState = useProxy(sdgsDesa); const router = useRouter(); const params = useParams(); const [formData, setFormData] = useState({ name: "", jumlah: "", imageId: "", }); const [isSubmitting, setIsSubmitting] = useState(false); const [originalData, setOriginalData] = useState({ name: "", jumlah: "", imageId: "", imageUrl: "", }); const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); // Load data sdgs desa by id useEffect(() => { const loadKolaborasi = async () => { const id = params?.id as string; if (!id) return; try { const data = await sdgsState.edit.load(id); if (data) { // isi form awal const newForm = { name: data.name || "", jumlah: data.jumlah || "", imageId: data.imageId || "", }; setFormData(newForm); // simpan juga versi original setOriginalData({ ...newForm, imageUrl: data.image?.link || "", }); setPreviewImage(data.image?.link || null); } } catch (error) { console.error("Error loading sdgs desa:", error); toast.error("Gagal memuat data sdgs desa"); } }; loadKolaborasi(); }, [params?.id]); const handleResetForm = () => { setFormData({ name: originalData.name, jumlah: originalData.jumlah, imageId: originalData.imageId, }); setPreviewImage(originalData.imageUrl || null); setFile(null); toast.info("Form dikembalikan ke data awal"); }; const handleInputChange = (field: keyof typeof formData, value: string) => { setFormData((prev) => ({ ...prev, [field]: value })); }; const handleSubmit = async () => { try { setIsSubmitting(true); let imageId = formData.imageId; // Upload file baru jika 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"); imageId = uploaded.id; } // Update global state hanya saat submit sdgsState.edit.form = { ...sdgsState.edit.form, ...formData, imageId }; await sdgsState.edit.update(); toast.success("sdgs desa berhasil diperbarui!"); router.push("/admin/landing-page/SDGs"); } catch (error) { console.error("Error updating sdgs desa:", error); toast.error("Terjadi kesalahan saat memperbarui sdgs desa"); } finally { setIsSubmitting(false); } }; return ( Edit Sdgs Desa Gambar Program Inovasi { 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 {/* ✅ Preview gambar + tombol X */} {previewImage && ( Preview Gambar {/* Tombol hapus (pojok kanan atas) */} { setPreviewImage(null); setFile(null); }} style={{ boxShadow: '0 2px 6px rgba(0,0,0,0.15)', }} > )} handleInputChange("name", e.target.value)} required /> handleInputChange("jumlah", e.target.value)} required type="number" /> {/* Tombol Batal */} {/* Tombol Simpan */} ); }