"use client"; import { Button, Input, Select, SelectItem, SelectSection, } from "@heroui/react"; import { FormEvent, useState } from "react"; import { Controller, useFieldArray, useForm } from "react-hook-form"; import * as z from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { close, error, loading } from "@/config/swal"; import { generateDataArticle, getGenerateKeywords, getGenerateTitle, getGenerateTopicKeywords, saveBulkArticle, } from "@/services/generate-article"; const writingStyle = [ { id: 1, name: "Friendly", }, { id: 1, name: "Professional", }, { id: 3, name: "Informational", }, { id: 4, name: "Neutral", }, { id: 5, name: "Witty", }, ]; const articleSize = [ { id: 1, name: "News (300 - 900 words)", value: "News", }, { id: 2, name: "Info (900 - 2000 words)", value: "Info", }, { id: 3, name: "Detail (2000 - 5000 words)", value: "Detail", }, ]; const formSchema = z.object({ rows: z.array( z.object({ mainKeyword: z.string().min(1, { message: "Main Keyword must be at least 2 characters.", }), title: z.string().min(1, { message: "Title must be at least 2 characters.", }), additionalKeyword: z.string().min(1, { message: "Additional Keyword must be at least 2 characters.", }), }) ), }); export default function GenerateBulkArticle(props: { articleId: (data: number[]) => void; }) { const [selectedWritingSyle, setSelectedWritingStyle] = useState("Informational"); const [selectedArticleSize, setSelectedArticleSize] = useState("News"); const [selectedLanguage, setSelectedLanguage] = useState("id"); const formOptions = { resolver: zodResolver(formSchema), defaultValues: { rows: [{ mainKeyword: "", title: "", additionalKeyword: "" }], }, }; type UserSettingSchema = z.infer; const { register, control, handleSubmit, formState: { errors }, setValue, getValues, trigger, } = useForm(formOptions); const { fields, append, remove } = useFieldArray({ control, name: "rows", }); const onSubmit = async () => { loading(); const listData = []; for (let i = 0; i < fields.length; i++) { listData.push({ title: getValues(`rows.${i}.title`), mainKeyword: getValues(`rows.${i}.mainKeyword`), additionalKeywords: getValues(`rows.${i}.additionalKeyword`), }); } const request = { style: "Friendly", website: "None", connectToWeb: true, lang: selectedLanguage, pointOfView: "0", imageSource: "Web", targetCountry: null, articleSize: selectedArticleSize, projectId: 2, data: listData, createdBy: "123123", clientId: "humasClientIdtest", }; const res = await saveBulkArticle(request); if (res.error) { error(res.message); return false; } const temp: number[] = []; res?.data?.data.map((data: any) => temp.push(data.id)); props.articleId(temp); close(); }; const generateTitle = async (keyword: string | undefined, index: number) => { if (keyword) { const req = { keyword: keyword, style: selectedWritingSyle, website: "None", connectToWeb: true, lang: selectedLanguage, pointOfView: "None", clientId: "", }; setValue(`rows.${index}.title`, "process..."); const res = await getGenerateTitle(req); const data = res?.data?.data; setValue(`rows.${index}.title`, data); } }; const generateKeywords = async ( keyword: string | undefined, index: number ) => { if (keyword) { const req = { keyword: keyword, style: selectedWritingSyle, website: "None", connectToWeb: true, lang: selectedLanguage, pointOfView: "0", clientId: "", }; setValue(`rows.${index}.additionalKeyword`, "process..."); const res = await getGenerateKeywords(req); const data = res?.data?.data; setValue(`rows.${index}.additionalKeyword`, data); } }; const processAll = async () => { let emptyMainKeyword = 0; const mainKeyword = getValues(`rows.0.mainKeyword`); for (let i = 0; i < fields.length; i++) { const mainKeyNow = getValues(`rows.${i}.mainKeyword`); if (mainKeyNow === "") { emptyMainKeyword++; } } if (mainKeyword !== "") { if (emptyMainKeyword > 0) { loading(); const res = await getGenerateTopicKeywords({ keyword: mainKeyword, count: emptyMainKeyword, }); const data = res?.data?.data; let j = 0; for (let i = 0; i < fields.length; i++) { const mainKeyNow = getValues(`rows.${i}.mainKeyword`); if (mainKeyNow === "") { setValue(`rows.${i}.mainKeyword`, data[j]); j++; } } for (let i = 0; i < fields.length; i++) { const mainKeyNow = getValues(`rows.${i}.mainKeyword`); if (getValues(`rows.${i}.title`) == "") { generateTitle(mainKeyNow, i); } if (getValues(`rows.${i}.additionalKeyword`) == "") { generateKeywords(mainKeyNow, i); } } close(); } else { loading(); for (let i = 0; i < fields.length; i++) { const mainKeyNow = getValues(`rows.${i}.mainKeyword`); if (getValues(`rows.${i}.title`) == "") { generateTitle(mainKeyNow, i); } if (getValues(`rows.${i}.additionalKeyword`) == "") { generateKeywords(mainKeyNow, i); } } close(); } } }; const processRow = (index: number) => { const addKeyword = getValues(`rows.${index}.mainKeyword`); generateTitle(addKeyword, index); generateKeywords(addKeyword, index); }; const validateFields = async () => { const validation = await trigger(); if (validation) { onSubmit(); } }; return (
{fields.map((field, index) => (

Main Keyword

{index === fields.length - 1 && ( )} {index !== 0 && ( remove(index)} className="cursor-pointer mb-2 w-[20px] h-[20px]text-center rounded-full flex justify-center items-center" > - )}
( )} />

Title

( )} />

SEO

( )} />
{index === fields.length - 1 && ( )} {index !== 0 && ( remove(index)} className="cursor-pointer mb-2 w-[20px] h-[20px]text-center rounded-full flex justify-center items-center" > - )}
))}
); }