"use client"; import { close, error, loading } from "@/config/swal"; import { createArticle, getArticleByCategory } from "@/service/article"; import { zodResolver } from "@hookform/resolvers/zod"; import { Button, Card, Chip, Input, Select, SelectItem, Selection, } from "@heroui/react"; import JoditEditor from "jodit-react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import React, { ChangeEvent, useEffect, useRef, useState } from "react"; import { useForm } from "react-hook-form"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import * as z from "zod"; import ReactSelect from "react-select"; import makeAnimated from "react-select/animated"; import { saveManualContext } from "@/service/generate-article"; const articleSchema = z.object({ title: z.string().min(1, { message: "Required" }), article: z.string().min(1, { message: "Required" }), slug: z.string().min(1, { message: "Required" }), tags: z.string().min(0, { message: "Required" }).optional(), description: z.string().min(0, { message: "Required" }).optional(), }); const dummyCategory = [ { id: 1, label: "Category 1", value: "category-1", }, { id: 2, label: "Category 2", value: "category-2", }, { id: 3, label: "Category 3", value: "category-3", }, { id: 4, label: "Category 4", value: "category-4", }, { id: 5, label: "Category 5", value: "category-5", }, ]; export default function FormArticle() { const animatedComponents = makeAnimated(); const router = useRouter(); const [title, setTitle] = useState(""); const [article, setArticle] = React.useState(new Set([])); const [slug, setSlug] = useState(""); const [tags, setTags] = useState([]); const [newTags, setNewTags] = useState(""); const editor = useRef(null); const [content, setContent] = useState(""); const MySwal = withReactContent(Swal); const [selectedImages, setSelectedImages] = useState([]); const [selectedCategory, setSelectedCategory] = useState(); const [listCategory, setListCategory] = useState< { id: number; label: string; value: number }[] >([]); const formOptions = { resolver: zodResolver(articleSchema) }; type MicroIssueSchema = z.infer; const { register, control, handleSubmit, setValue, formState: { errors }, } = useForm(formOptions); const TypeId = [ { key: 1, label: "Article", }, { key: 2, label: "Magazine", }, ]; 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 handleImageChange = (event: ChangeEvent) => { if (event.target.files) { const files = Array.from(event.target.files); setSelectedImages((prevImages) => [...prevImages, ...files]); } }; const handleRemoveImage = (index: number) => { setSelectedImages((prevImages) => prevImages.filter((_, i) => i !== index)); }; // const handleSubmitImage = (event: any) => { // event.preventDefault(); // // Lakukan penanganan pengunggahan gambar di sini // if (selectedImage) { // console.log('Gambar yang dipilih:', selectedImage); // // Anda dapat melakukan pengunggahan gambar ke server di sini // } else { // console.log('Pilih gambar terlebih dahulu.'); // } // }; const handleClose = (tagsToRemove: string) => { setTags(tags.filter((tag) => tag !== tagsToRemove)); if (tags.length === 1) { setTags([]); } }; const handleAddTags = (e: any) => { if (newTags.trim() !== "") { setTags([...tags, newTags.trim()]); setNewTags(""); e.preventDefault(); } }; const handleKeyDown = (event: any) => { if (event.key === "Enter") { handleAddTags(event); } }; async function save(data: any) { const formData = { title: title, typeId: parseInt(String(Array.from(article)[0])), slug: slug, categoryId: selectedCategory[0].id, oldId: 1, tags: tags.join(","), description: content, htmlDescription: content, }; console.log("Form Data:", formData); const response = await createArticle(formData); if (response?.error) { error(response.message); return false; } successSubmit("/admin/article"); } function successSubmit(redirect: any) { MySwal.fire({ title: "Sukses", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { router.push(redirect); } }); } async function onSubmit(data: any) { MySwal.fire({ title: "Simpan Data", text: "", icon: "warning", showCancelButton: true, cancelButtonColor: "#d33", confirmButtonColor: "#3085d6", confirmButtonText: "Simpan", }).then((result) => { if (result.isConfirmed) { // diseUpload(data); save(data); } }); } const diseUpload = async (data: any) => { const request = { title: data.title, articleBody: content, metaDescription: data.title, metaTitle: data.title, mainKeyword: data.title, additionalKeywords: data.title, createdBy: "123432", style: "Informational", projectId: 2, clientId: "humasClientIdtest", lang: "id", }; loading(); const res = await saveManualContext(request); if (res.error) { res.message; return false; } close(); save(data); }; return (
setTitle(e.target.value)} label="Judul" variant="bordered" placeholder="Enter Text" labelPlacement="outside" />
{title.length === 0 && errors.title && errors.title.message}
{errors.article?.message}
{/*

{article}

*/}

Category

"!rounded-xl bg-white !border-1 !border-gray-200", }} classNamePrefix="select" onChange={setSelectedCategory} closeMenuOnSelect={false} components={animatedComponents} isClearable={true} isSearchable={true} isMulti={true} placeholder="Category ..." name="sub-module" options={listCategory} />
{(!selectedCategory || selectedCategory?.length < 1) && (

Required

)}
setSlug(e.target.value)} label="Slug" variant="bordered" placeholder="Enter Text" labelPlacement="outside" />
{slug.length === 0 && errors.slug && errors.slug.message}
setNewTags(e.target.value)} onKeyDown={handleKeyDown} placeholder="Tambahkan tag baru dan tekan Enter" />
{tags.length === 0 && errors.tags && errors.tags.message}
{tags.map((tag, index) => ( handleClose(tag)} > {tag} ))}

Description

setContent(newContent)} className="dark:text-black" />
{content.length === 0 && errors.description && errors.description.message}

Attachment (Opsional)

{selectedImages?.length > 0 ? (

Pratinjau:

{selectedImages.map((image, index) => (
handleRemoveImage(index)} > X Pratinjau Gambar
))}
) : ( "" )}
); }