/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor'; import gotongRoyongState from '@/app/admin/(dashboard)/_state/lingkungan/gotong-royong'; import colors from '@/con/colors'; import ApiFetch from '@/lib/api-fetch'; import { ActionIcon, Box, Button, Group, Image, Loader, Paper, Select, 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 { useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; function CreateKegiatanDesa() { const router = useRouter(); const stateKegiatanDesa = useProxy(gotongRoyongState.kegiatanDesa); const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); useEffect(() => { stateKegiatanDesa.findMany.load(); gotongRoyongState.kategoriKegiatan.findMany.load(); }, []); 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 ( stateKegiatanDesa.create.form.judul?.trim() !== '' && !isHtmlEmpty(stateKegiatanDesa.create.form.deskripsiSingkat) && stateKegiatanDesa.create.form.partisipan !== null && stateKegiatanDesa.create.form.partisipan >= 0 && stateKegiatanDesa.create.form.tanggal !== null && stateKegiatanDesa.create.form.lokasi?.trim() !== '' && !isHtmlEmpty(stateKegiatanDesa.create.form.deskripsiLengkap) && stateKegiatanDesa.create.form.kategoriKegiatanId?.trim() !== '' && file !== null ); }; const resetForm = () => { stateKegiatanDesa.create.form = { judul: '', deskripsiSingkat: '', deskripsiLengkap: '', tanggal: new Date(), lokasi: '', partisipan: 0, imageId: '', kategoriKegiatanId: '', }; setPreviewImage(null); setFile(null); }; const handleSubmit = async () => { try { setIsSubmitting(true); if (!file) { return toast.warn('Silakan pilih file gambar terlebih dahulu'); } const res = await ApiFetch.api.fileStorage.create.post({ file, name: file.name, }); const uploaded = res.data?.data; if (!uploaded?.id) { return toast.error('Gagal mengunggah gambar, silakan coba lagi'); } stateKegiatanDesa.create.form.imageId = uploaded.id; await stateKegiatanDesa.create.create(); resetForm(); router.push('/admin/lingkungan/gotong-royong/kegiatan-desa'); } catch (error) { console.error('Error creating kegiatan desa:', error); toast.error('Gagal membuat kegiatan desa'); } finally { setIsSubmitting(false); } }; return ( {/* Header */} Tambah Kegiatan Desa {/* Form */} {/* Upload Gambar */} Gambar Kegiatan { 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 (maks 5MB) {previewImage && ( Preview Gambar { setPreviewImage(null); setFile(null); }} style={{ boxShadow: '0 2px 6px rgba(0,0,0,0.15)', }} > )} {/* Input Form */} (stateKegiatanDesa.create.form.judul = e.target.value)} required /> Deskripsi Singkat (stateKegiatanDesa.create.form.deskripsiSingkat = val)} /> { const value = Number(e.target.value); if (value >= 0) { stateKegiatanDesa.create.form.partisipan = value; } }} label="Partisipan" placeholder="Masukkan jumlah partisipan" required /> { const dateValue = e.currentTarget.value; stateKegiatanDesa.create.form.tanggal = dateValue ? new Date(dateValue) : new Date(); }} required /> (stateKegiatanDesa.create.form.lokasi = e.target.value)} required /> Deskripsi Lengkap (stateKegiatanDesa.create.form.deskripsiLengkap = val)} />