'use client'; import colors from '@/con/colors'; import ApiFetch from '@/lib/api-fetch'; import { ActionIcon, Box, Button, Group, Loader, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import ExifOrientationImg from 'react-exif-orientation-img'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import CreateEditor from '../../../_com/createEditor'; import desaDigitalState from '../../../_state/inovasi/desa-digital'; export default function CreateDesaDigital() { const stateDesaDigital = useProxy(desaDigitalState); const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); const router = useRouter(); const [isSubmitting, setIsSubmitting] = useState(false); // 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 ( stateDesaDigital.create.form.name?.trim() !== '' && !isHtmlEmpty(stateDesaDigital.create.form.deskripsi) && file !== null ); }; const resetForm = () => { stateDesaDigital.create.form = { name: '', deskripsi: '', imageId: '', }; setPreviewImage(null); setFile(null); }; const handleSubmit = async () => { if (!file) { return toast.warn('Silakan pilih file gambar terlebih dahulu'); } try { setIsSubmitting(true); const uploadRes = await ApiFetch.api.fileStorage.create.post({ file, name: file.name, }); const uploaded = uploadRes.data?.data; if (!uploaded?.id) { return toast.error('Gagal mengunggah gambar'); } stateDesaDigital.create.form.imageId = uploaded.id; const success = await stateDesaDigital.create.create(); if (success) { resetForm(); router.push('/admin/inovasi/desa-digital-smart-village'); } } catch (error) { console.error('Error in handleSubmit:', error); toast.error('Terjadi kesalahan saat menyimpan data'); } finally { setIsSubmitting(false); } }; return ( {/* Header dengan tombol kembali */} Tambah Desa Digital Smart Village {/* Card Form */} {/* Input Nama */} (stateDesaDigital.create.form.name = e.target.value)} radius="md" withAsterisk /> {/* Deskripsi */} Deskripsi { stateDesaDigital.create.form.deskripsi = val; }} /> {/* Upload Gambar */} Gambar Desa Digital { 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" style={{ border: '2px dashed #cfd8dc', backgroundColor: '#fafafa', transition: 'background-color 0.2s ease, border-color 0.2s ease', }} > Seret gambar atau klik untuk memilih file (maks 5MB) {/* Preview */} {previewImage && ( { setPreviewImage(null); setFile(null); }} style={{ boxShadow: '0 2px 6px rgba(0,0,0,0.15)', }} > )} {/* Tombol Submit */} {/* Tombol Batal */} {/* Tombol Simpan */} ); }