'use client' import { LayoutNavbarNew, TEMA } from '@/module/_global'; import LayoutModal from '@/module/_global/layout/layout_modal'; import { useHookstate } from '@hookstate/core'; import { Box, Button, Group, Image, Paper, rem, Text, TextInput } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; import _ from 'lodash'; import { useRouter } from 'next/navigation'; import { useRef, useState } from 'react'; import toast from 'react-hot-toast'; import { funCreateBanner } from '../lib/api_banner'; import { title } from 'process'; function CreateBanner() { const router = useRouter(); const [isModal, setModal] = useState(false); const tema = useHookstate(TEMA) const [loadingKonfirmasi, setLoadingKonfirmasi] = useState(false) const [listData, setListData] = useState({ title: "", image: "" }); const [imgForm, setImgForm] = useState() const openRef = useRef<() => void>(null) const [img, setIMG] = useState() const [touched, setTouched] = useState({ title: false, image: false }) async function onSubmit(val: boolean) { if (!imgForm || !listData.title) { toast.error("Mohon lengkapi semua data"); } try { setLoadingKonfirmasi(true) const fd = new FormData() fd.append("file", imgForm) fd.append("data", JSON.stringify( { title: listData.title, image: listData.image } )) const res = await funCreateBanner(fd); if (res.success) { toast.success(res.message); router.push('/banner') } else { toast.error(res.message); setModal(false); } } catch (error) { toast.error("Error"); } finally { setLoadingKonfirmasi(false) setModal(false); } } function onCheck() { const cek = checkAll() if (!cek) return false setModal(true) } function checkAll() { let nilai = true if (listData.title == "") { setTouched(touched => ({ ...touched, title: true })) nilai = false } if (!imgForm) { setTouched(touched => ({ ...touched, image: true })) nilai = false } return nilai } function onValidation(kategori: string, val: any) { if (kategori == 'title') { setListData({ ...listData, title: val }) if (val === "") { setTouched({ ...touched, title: true }) } else { setTouched({ ...touched, title: false }) } } else if (kategori == 'image') { if (imgForm) { setTouched({ ...touched, image: true }) } else { setTouched({ ...touched, image: false }) } } } return ( { if (!files || _.isEmpty(files)) return toast.error('Tidak ada gambar yang dipilih') const file = files[0] setImgForm(file) const buffer = URL.createObjectURL(new Blob([new Uint8Array(await files[0].arrayBuffer())])) setIMG(buffer) onValidation('image', files[0]) }} activateOnClick={false} maxSize={1 * 1024 ** 2} accept={['image/png', 'image/jpeg', 'image/heic']} onReject={(files) => { return toast.error('File yang diizinkan: .png, .jpg, dan .heic dengan ukuran maksimal 1 MB') }} onClick={() => openRef.current?.()} > { img ? :
Klik Untuk Upload Image Mohon unggah gambar dalam resolusi 1535 x 450 piksel untuk memastikan tampilan sesuai dengan kebutuhan desain.
}
{touched.image && !imgForm && ( Silahkan Pilih Gambar )} { setListData({ ...listData, title: e.target.value }) onValidation('title', e.target.value) }} styles={{ input: { border: `1px solid ${touched.title ? 'red' : "#D6D8F6"}`, borderRadius: 10, }, }} required size='md' error={ touched.title && ( listData.title == "" ? "Judul Banner Tidak Boleh Kosong" : null ) } />
setModal(false)} description="Apakah anda yakin ingin menambahkan banner ini?" onYes={(val) => { if (val) { onSubmit(val); } else { setModal(false); } }} />
); } export default CreateBanner;