'use client' import colors from '@/con/colors'; import { ActionIcon, Alert, Box, Button, Center, Group, Image, Paper, Stack, Text, TextInput, Title, Loader } from '@mantine/core'; import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; import profileLandingPageState from '@/app/admin/(dashboard)/_state/landing-page/profile'; import ApiFetch from '@/lib/api-fetch'; import { Dropzone } from '@mantine/dropzone'; import { IconAlertCircle, IconArrowBack, IconImageInPicture, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { toast } from 'react-toastify'; function EditPejabatDesa() { const allState = useProxy(profileLandingPageState.pejabatDesa); const params = useParams(); const router = useRouter(); // Local form state const [formData, setFormData] = useState({ name: '', position: '', imageId: '' }); const [originalData, setOriginalData] = useState({ name: '', position: '', imageId: "", imageUrl: "", }); // UI states const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); // Load data on mount useEffect(() => { const loadData = async () => { const id = params?.id as string; if (!id) { toast.error("ID tidak valid"); router.push("/admin/landing-page/profil/pejabat-desa"); return; } try { const profileData = await profileLandingPageState.pejabatDesa.findUnique.load(id); if (profileData) { // isi form awal const newForm = { name: profileData.name || "", position: profileData.position || "", imageId: profileData.imageId || "", }; setFormData(newForm); // simpan juga versi original setOriginalData({ ...newForm, imageUrl: profileData.image?.link || "", }); setPreviewImage(profileData.image?.link || null); } } catch (error) { console.error("Error loading program inovasi:", error); toast.error( error instanceof Error ? error.message : "Gagal mengambil data program inovasi" ); } }; loadData(); return () => profileLandingPageState.pejabatDesa.edit.reset(); }, [params?.id, router]); // Handle input change const handleChange = (field: string, value: string) => { setFormData(prev => ({ ...prev, [field]: value })); }; // Submit form const handleSubmit = async () => { if (isSubmitting || !formData.name.trim()) { toast.error("Nama wajib diisi"); return; } setIsSubmitting(true); try { let imageId = formData.imageId; // Upload file jika ada if (file) { const uploadResponse = await ApiFetch.api.fileStorage.create.post({ file, name: file.name }); const uploaded = uploadResponse.data?.data; if (!uploaded?.id) { toast.error("Gagal upload gambar"); return; } imageId = uploaded.id; } // Ensure we have the ID from the URL const id = params?.id as string; if (!id) { throw new Error("ID tidak ditemukan"); } // Update global state with the ID and form data profileLandingPageState.pejabatDesa.edit.id = id; profileLandingPageState.pejabatDesa.edit.form = { ...formData, imageId: imageId || '', // Ensure imageId is always a string }; const success = await profileLandingPageState.pejabatDesa.edit.submit(); if (success) { toast.success("Berhasil menyimpan perubahan"); router.push("/admin/landing-page/profil/pejabat-desa"); } } catch (error) { console.error("Error submitting form:", error); toast.error("Gagal menyimpan profile"); } finally { setIsSubmitting(false); } }; const handleResetForm = () => { setFormData({ name: originalData.name, position: originalData.position, imageId: originalData.imageId, }); setPreviewImage(originalData.imageUrl || null); setFile(null); toast.info("Form dikembalikan ke data awal"); }; const handleBack = () => router.back(); // Loading if (allState.edit.loading) { return (
Memuat data profile...
); } // Error if (allState.edit.error) { return ( } color="red"> Error {allState.edit.error} ); } return ( Edit Pejabat Desa Edit Profile Pejabat Desa {/* Nama Field */} Nama Perbekel} placeholder="Masukkan nama perbekel" value={formData.name} onChange={(e) => handleChange('name', e.currentTarget.value)} error={!formData.name && "Nama wajib diisi"} /> {/* Posisi Field */} Posisi} placeholder="Masukkan posisi" value={formData.position} onChange={(e) => handleChange('position', e.currentTarget.value)} error={!formData.position && "Posisi wajib diisi"} /> {/* File Upload */} 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)', }} > )} {/* Preview */} Preview Gambar {previewImage ? ( Profile preview ) : (
Tidak ada gambar
)}
{/* Submit */}
); } export default EditPejabatDesa;