"use client"; import { AddIcon, CloudUploadIcon, TimesIcon } from "@/components/icons"; import ArticleTable from "@/components/table/article-table"; import CategoriesTable from "@/components/table/master-categories/categories-table"; import generatedArticleIds from "@/store/generated-article-store"; import { Button, Card, Chip, Input, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Textarea, useDisclosure, } from "@heroui/react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import * as z from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Controller, useForm } from "react-hook-form"; import { Fragment, useEffect, useState } from "react"; import { getArticleByCategory } from "@/service/article"; import ReactSelect from "react-select"; import makeAnimated from "react-select/animated"; import { useDropzone } from "react-dropzone"; import { close, error, loading } from "@/config/swal"; import { createCategory, uploadCategoryThumbnail, } from "@/service/master-categories"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; const categorySchema = z.object({ id: z.number(), label: z.string(), value: z.number(), }); const createArticleSchema = z.object({ title: z.string().min(2, { message: "Judul harus diisi", }), description: z.string().min(2, { message: "Deskripsi harus diisi", }), tags: z.array(z.string()), // tags: z.array(z.string()).nonempty({ // message: "Minimal 1 tag", // }), }); interface CategoryType { id: number; label: string; value: number; } export default function MasterCategoryTable() { const router = useRouter(); const MySwal = withReactContent(Swal); const animatedComponents = makeAnimated(); const { isOpen, onOpen, onOpenChange, onClose } = useDisclosure(); const [listCategory, setListCategory] = useState([]); const [files, setFiles] = useState([]); const [refresh, setRefresh] = useState(false); const [tag, setTag] = useState(""); const formOptions = { resolver: zodResolver(createArticleSchema), defaultValues: { title: "", description: "", category: [], tags: [] }, }; const { getRootProps, getInputProps } = useDropzone({ onDrop: (acceptedFiles) => { setFiles(acceptedFiles.map((file) => Object.assign(file))); }, maxFiles: 1, }); type UserSettingSchema = z.infer; const { control, handleSubmit, formState: { errors }, setValue, getValues, watch, setError, clearErrors, } = useForm(formOptions); useEffect(() => { fetchCategory(); }, []); const fetchCategory = async () => { const res = await getArticleByCategory(); if (res?.data?.data) { setupCategory(res?.data?.data); } }; const setupCategory = (data: any) => { const temp = []; for (const element of data) { temp.push({ id: element.id, label: element.title, value: element.id, }); } setListCategory(temp); }; const onSubmit = async (values: z.infer) => { console.log("values,", values); loading(); const formData = { title: values.title, statusId: 1, parentId: 1, tags: values.tags.join(","), description: values.description, }; const response = await createCategory(formData); if (response?.error) { error(response.message); return false; } const categoryId = response?.data?.data?.id; const formFiles = new FormData(); formFiles.append("files", files[0]); const resFile = await uploadCategoryThumbnail(categoryId, formFiles); if (resFile?.error) { error(resFile.message); return false; } close(); setRefresh(!refresh); MySwal.fire({ title: "Sukses", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { } }); }; const handleRemoveFile = (file: File) => { const uploadedFiles = files; const filtered = uploadedFiles.filter((i) => i.name !== file.name); setFiles([...filtered]); }; return (
{() => ( <> Kategori Baru

Nama Kategori

( )} /> {errors?.title && (

{errors.title?.message}

)}

Deskripsi

(