'use client' import { error } from '@/config/swal'; import { createArticle } from '@/service/article'; import { zodResolver } from '@hookform/resolvers/zod'; import { Button, Card, Chip, Input, Select, SelectItem, Selection } from '@nextui-org/react'; import JoditEditor from 'jodit-react'; import Link from 'next/link'; import { useRouter } from 'next/navigation'; import React, { ChangeEvent, 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"; 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(), }); export default function FormArticle() { 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 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" }, ] 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, 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) { 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}

*/}
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
))}
: "" }
) }