"use client"; import React, { useEffect, useRef, useState } from "react"; import { useForm, Controller } from "react-hook-form"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Card } from "@/components/ui/card"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { useParams, useRouter } from "next/navigation"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Checkbox } from "@/components/ui/checkbox"; import Cookies from "js-cookie"; import { getArticleDetail, publishMedia, submitApproval, } from "@/service/content/content"; import { getDataApprovalByMediaUpload } from "@/service/curated-content/curated-content"; import { Badge } from "@/components/ui/badge"; import { Swiper, SwiperSlide } from "swiper/react"; import "swiper/css"; import "swiper/css/navigation"; import "swiper/css/pagination"; import "swiper/css/thumbs"; import { FreeMode, Navigation, Pagination, Thumbs } from "swiper/modules"; import { DialogHeader, DialogFooter, Dialog, DialogContent, DialogTitle, } from "@/components/ui/dialog"; import { Textarea } from "@/components/ui/textarea"; import { close, loading, successCallback } from "@/config/swal"; import { getCookiesDecrypt } from "@/lib/utils"; import { Icon } from "@iconify/react/dist/iconify.js"; import { error } from "@/lib/swal"; import dynamic from "next/dynamic"; import { formatDateToIndonesian } from "@/utils/globals"; import ApprovalHistoryModal from "@/components/modal/approval-history-modal"; import { listArticleCategories } from "@/service/content"; import { AccessGuard } from "@/components/access-guard"; const videoSchema = z.object({ title: z.string().min(1, { message: "Judul diperlukan" }), description: z.string().min(2, { message: "Deskripsi diperlukan" }), creatorName: z.string().min(1, { message: "Creator diperlukan" }), }); const ViewEditor = dynamic(() => import("@/components/editor/view-editor"), { ssr: false, }); type Category = { id: string; title: string }; type FileType = { id: number; fileName: string; fileUrl?: string; fileThumbnail?: string; }; type Detail = { id: number; title: string; description: string; htmlDescription: string; slug: string; categoryId: number; categoryName: string; typeId: number; tags: string; thumbnailUrl: string; pageUrl: string | null; createdById: number; createdByName: string; shareCount: number; viewCount: number; commentCount: number; aiArticleId: number | null; oldId: number; statusId: number; isBanner: boolean; isPublish: boolean; publishedAt: string | null; isActive: boolean; createdAt: string; updatedAt: string; files: FileType[] | null; categories: { id: number; title: string; description: string; thumbnailUrl: string; slug: string | null; tags: string[]; thumbnailPath: string | null; parentId: number; oldCategoryId: number | null; createdById: number; statusId: number; isPublish: boolean; publishedAt: string | null; isEnabled: boolean | null; isActive: boolean; createdAt: string; updatedAt: string; }[]; // Legacy fields for backward compatibility category?: { id: number; name: string; }; creatorName?: string; thumbnailLink?: string; statusName?: string; needApprovalFromLevel?: number; uploadedById?: number; }; export default function FormVideoDetail() { const MySwal = withReactContent(Swal); const router = useRouter(); const { id } = useParams() as { id: string }; const userId = getCookiesDecrypt("uie"); const userLevelId = getCookiesDecrypt("ulie"); const userLevelName = Cookies.get("state"); const roleId = getCookiesDecrypt("urie"); const [detail, setDetail] = useState(null); const [categories, setCategories] = useState([]); const [files, setFiles] = useState([]); const [thumbsSwiper, setThumbsSwiper] = useState(null); const [approval, setApproval] = useState(); const [selectedPublishers, setSelectedPublishers] = useState([]); const [isUserMabesApprover, setIsUserMabesApprover] = useState(false); const [modalOpen, setModalOpen] = useState(false); const [status, setStatus] = useState(""); const [description, setDescription] = useState(""); const [filePlacements, setFilePlacements] = useState([]); const { control } = useForm({ resolver: zodResolver(videoSchema) }); useEffect(() => { if (userLevelId == "216" && roleId == "3") setIsUserMabesApprover(true); }, [userLevelId, roleId]); useEffect(() => { async function fetchCategories() { const categoryRes = await listArticleCategories(1, 100); setCategories(categoryRes?.data.data || []); } fetchCategories(); }, []); useEffect(() => { async function fetchDetail() { if (!id) return; try { const response = await getArticleDetail(Number(id)); const details = response?.data?.data; const mappedDetail: Detail = { ...details, statusId: details?.statusId, categoryId: details?.categories?.[0]?.id, htmlDescription: details?.htmlDescription, uploadedById: details?.createdById, files: details?.files || [], thumbnailUrl: details?.thumbnailUrl || details?.thumbnail || "", }; setDetail(mappedDetail); setFiles(details?.files || []); const approvals = await getDataApprovalByMediaUpload(mappedDetail.id); setApproval(approvals?.data?.data); } catch (err) { console.error("Error fetching video detail:", err); } } fetchDetail(); }, [id]); const getStatusName = (statusId: number) => { const map: Record = { 1: "Menunggu Review", 2: "Diterima", 3: "Minta Update", 4: "Ditolak", }; return map[statusId] || "Unknown"; }; const handleCheckboxChange = (id: number) => { setSelectedPublishers((prev) => prev.includes(id) ? prev.filter((i) => i !== id) : [...prev, id], ); }; const actionApproval = (type: string) => { const placements = files.map(() => []); setFilePlacements(placements); setStatus(type); setDescription(""); setModalOpen(true); }; const save = async () => { const data = { action: status == "2" ? "approve" : status == "3" ? "revision" : "reject", message: description, }; setModalOpen(false); loading(); const res = await submitApproval(id, data); if (res?.error) return error(res.message); close(); MySwal.fire({ title: "Sukses", text: "Data berhasil disimpan.", icon: "success", }).then(() => router.push("/admin/content/video")); }; const publishToMabes = async () => { const res = await publishMedia(id); successCallback(); }; if (!detail) return
Memuat data...
; const isPending = Number(detail?.statusId) === 1; const isApproved = Number(detail?.statusId) === 2; const isRejected = Number(detail?.statusId) === 4; const isCreator = Number(detail?.createdById || detail?.uploadedById) === Number(userId); const hasApproval = approval != null; return (

Form Video

( )} />
{files.map((file) => ( ))} {files.map((file) => ( ))}
Thumbnail Gambar Utama
{detail.tags?.split(",").map((tag, i) => ( {tag.trim()} ))}
{[5, 6].map((target) => (
handleCheckboxChange(target)} />
))}

Information:

{detail.statusId && getStatusName(detail.statusId)}

Komentar

{approval?.message}

{approval?.approvalBy?.fullname} |{" "} {formatDateToIndonesian(approval?.approvalDate)}

{userLevelName?.includes("MABES") && !detail.isPublish && (
)} {/* {isPending && (Number(detail.needApprovalFromLevel || 0) === Number(userLevelId) || detail.isPublish === false) && Number(detail.uploadedById || detail.createdById) !== Number(userId) ? ( */} {isPending && (
)} {/* ) : null} */} {/* {(Number(detail.needApprovalFromLevel || 0) == Number(userLevelId) || (detail.isPublish === false && detail.statusId == 1)) && Number(detail.uploadedById || detail.createdById) != Number(userId) ? (
) : null} */} Leave Comment {status === "2" && files.map((file, i) => (
))}