"use client"; import HeaderManagement from "@/components/landing-page/header-management"; import SidebarManagement from "@/components/landing-page/sidebar-management"; import { useRouter } from "@/i18n/routing"; import { getCookiesDecrypt, setCookiesEncrypt } from "@/lib/utils"; import { useParams, useSearchParams } from "next/navigation"; import React, { useEffect, useState } from "react"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Controller, useForm } from "react-hook-form"; import * as z from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { generateDataArticle, generateDataRewrite, getDetailArticle, } from "@/service/content/ai"; import { Button } from "@/components/ui/button"; import { close, error, loading } from "@/config/swal"; import { saveContentRewrite } from "@/service/content/content"; import { getPublicSuggestionList } from "@/service/landing/landing"; import { getDetail } from "@/service/detail/detail"; import { yupResolver } from "@hookform/resolvers/yup"; import * as Yup from "yup"; import Cookies from "js-cookie"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { useTranslations } from "next-intl"; import dynamic from "next/dynamic"; const imageSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), mainKeyword: z.string().min(1, { message: "Keyword diperlukan" }), seo: z.string().min(1, { message: "Tuliskan kata kunci atau frasa yang relevan dengan blog Anda, lalu tekan enter", }), description: z .string() .min(2, { message: "Narasi Penugasan harus lebih dari 2 karakter." }), creatorName: z.string().min(1, { message: "Creator diperlukan" }), // tags: z.string().min(1, { message: "Judul diperlukan" }), }); const CustomEditor = dynamic( () => { return import("@/components/editor/custom-editor"); }, { ssr: false } ); const page = (props: any) => { const { states } = props; const MySwal = withReactContent(Swal); const router = useRouter(); const [, setLoadingState] = useState(false); const searchParams = useSearchParams(); const getParams = useParams(); const id: any = getParams?.id; const [content, setContent] = useState([]); const [isFromSPIT, setIsFromSPIT] = useState(false); const [listSuggestion, setListSuggestion] = useState(); const [main, setMain] = useState(); const userId = getCookiesDecrypt("uie"); const userRoleId = getCookiesDecrypt("urie"); const [articleIds, setArticleIds] = useState([]); const [isGeneratedArticle, setIsGeneratedArticle] = useState(false); const [selectedArticleId, setSelectedArticleId] = useState(null); const [articleBody, setArticleBody] = useState(""); const [selectedAdvConfig, setSelectedAdvConfig] = useState(""); const [selectedWritingStyle, setSelectedWritingStyle] = useState("profesional"); const [selectedContextType, setSelectedContextType] = useState("article"); const [selectedLanguage, setSelectedLanguage] = useState("id"); const [selectedTitle, setSelectedTitle] = useState(""); const [selectedSize, setSelectedSize] = useState("news"); const [detailArticle, setDetailArticle] = useState(null); const [isLoadingData, setIsLoadingData] = useState(false); const [detailData, setDetailData] = useState(null); const [articleImages, setArticleImages] = useState([]); const t = useTranslations("LandingPage"); const userLevelId = getCookiesDecrypt("ulie"); const roleId = getCookiesDecrypt("urie"); type ImageSchema = z.infer; const validationSchema = Yup.object().shape({ title: Yup.string().required("Judul tidak boleh kosong"), mainKeyword: Yup.string().required("Keyword tidak boleh kosong"), description: Yup.string().required( "Narasi Penugasan harus lebih dari 2 karakter." ), }); let componentMounted = true; const { control } = useForm({ resolver: zodResolver(imageSchema), }); const formOptions = { resolver: yupResolver(validationSchema), }; const { register, handleSubmit, reset, formState: { errors }, setValue, getValues, } = useForm(formOptions); const save = async (data: any) => { const request = { title: data.title, articleId: detailArticle?.id, mediaUploadId: id.split("-")?.[0], articleBody: detailArticle?.articleBody, metaTitle: detailArticle?.metaTitle, metaDescription: detailArticle?.metaDescription, mainKeyword: detailArticle?.mainKeyword, additionalKeyword: detailArticle?.additionalKeyword, articleSize: detailArticle?.articleSize, style: detailArticle?.style, website: detailArticle?.website, imageUrl: detailArticle?.imageUrl, }; loading(); const res = await saveContentRewrite(request); if (res?.error) { error(res?.message); return false; } successSubmit(); }; function successSubmit() { MySwal.fire({ title: "Sukses", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { router.push("/content-management/rewrite"); } }); } 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); } }); } useEffect(() => { async function initState() { loading(); setLoadingState(true); const response = await getDetail( id, states == "polda" ? "polda" : "mabes" ); console.log("Detail dataaaa ::", response); if (response?.data?.data?.isActive == false) { window.location.replace("/"); } const responseGet = await getPublicSuggestionList(id?.split("-")?.[0]); // close(); if (componentMounted) { setValue("title", response?.data?.data?.title); setValue("mainKeyword", response?.data?.data?.title); setValue("description", response?.data?.data?.htmlDescription); setContent(response?.data?.data); setIsFromSPIT(response?.data?.data?.isFromSPIT); setListSuggestion(responseGet?.data?.data); console.log("data list file", response?.data?.data); // const mainUrl = response?.data?.data?.files[0]?.url; // const ticket = response?.data?.data?.files[0]?.ticket; // const urlBlob = await getBlobContent(mainUrl, ticket); setMain({ id: response?.data?.data?.files[0]?.id, type: response?.data?.data?.fileType.name, url: Number(response?.data?.data?.fileType?.id) == 4 ? response?.data?.data?.files[0]?.secondaryUrl : response?.data?.data?.files[0]?.url, thumbnailFileUrl: response?.data?.data?.files[0]?.thumbnailFileUrl, names: response?.data?.data?.files[0]?.fileName, format: response?.data?.data?.files[0]?.format, widthPixel: response?.data?.data?.files[0]?.widthPixel, heightPixel: response?.data?.data?.files[0]?.heightPixel, size: response?.data?.data?.files[0]?.size, caption: response?.data?.data?.files[0]?.caption, }); // Send Meta Data const metaData = { title: response?.data?.data?.title, image: response?.data?.data?.thumbnailLink, }; setCookiesEncrypt("meta_data", metaData); setLoadingState(false); // (2) write some value to state // await new Promise(resolve => setTimeout(resolve, 1000)); // 2 sec // setIdm(); close(); } return () => { // This code runs when component is unmounted componentMounted = false; // (4) set it to false if we leave the page }; } initState(); }, [id]); const handleGenerateArtikel = async () => { loading(); const request = { style: "Professional", lang: "id", contextType: "text", urlContext: null, context: content?.description, createdBy: roleId, sentiment: "Humorous", clientId: "7QTW8cMojyayt6qnhqTOeJaBI70W4EaQ", }; console.log("Request", request); const res = await generateDataRewrite(request); close(); if (res.error) { console.error(res.message); return false; } const newArticleId = res?.data?.data?.id; setIsGeneratedArticle(true); setArticleIds((prevIds: any) => { if (prevIds.length < 3) { return [...prevIds, newArticleId]; } else { const updatedIds = [...prevIds]; updatedIds[2] = newArticleId; return updatedIds; } }); Cookies.set("nulisAIArticleIdTemp", articleIds); }; const handleArticleIdClick = async (id: string) => { setIsLoadingData(true); let retryCount = 0; const maxRetries = 20; try { const waitForStatusUpdate: any = async () => { while (retryCount < maxRetries) { const res = await getDetailArticle(id); const articleData = res?.data?.data; if (articleData?.status === 2) { return articleData; } retryCount++; await new Promise((resolve) => setTimeout(resolve, 5000)); } throw new Error("Timeout: Artikel belum selesai diproses."); }; const articleData = await waitForStatusUpdate(); const cleanArticleBody = articleData?.articleBody?.replace( /]*>/g, "" ); console.log("lalalala", articleData); const articleImagesData = articleData?.imagesUrl?.split(","); setValue("description", cleanArticleBody || ""); setArticleBody(cleanArticleBody || ""); setDetailArticle(articleData); // setSelectedArticleId(id); console.log("idnya", id); setArticleImages(articleImagesData || []); } catch (error) { console.error("Error fetching article details:", error); } finally { setIsLoadingData(false); } }; return ( <>
{t("content", { defaultValue: "Content" })} Rewrite
{content && (

{t("language", { defaultValue: "Language" })}

{t("contextType", { defaultValue: "Context Type" })}

{t("writingStyle", { defaultValue: "Writing Style" })}

{t("articleSize", { defaultValue: "Article Size" })}

{t("title", { defaultValue: "Title" })}

( )} />

{t("mainKeyword", { defaultValue: "Main Keyword" })}

( )} />

Deskripsi

( //