"use client"; import { BannerIcon, CloudUploadIcon, CreateIconIon, DeleteIcon, DotsYIcon, EyeIconMdi, SearchIcon, TimesIcon, } from "@/components/icons"; import { close, error, loading, success } from "@/config/swal"; import { deleteArticle, getArticleByCategory, getArticleById, getListArticle, } from "@/services/article"; import { Article } from "@/types/globals"; import { convertDateFormat } from "@/utils/global"; import { Button } from "@heroui/button"; import { Chip, ChipProps, Dropdown, DropdownItem, DropdownMenu, DropdownTrigger, Input, Modal, ModalBody, ModalContent, ModalFooter, ModalHeader, Pagination, Select, SelectItem, Spinner, Switch, Table, TableBody, TableCell, TableColumn, TableHeader, TableRow, Textarea, useDisclosure, } from "@heroui/react"; import Link from "next/link"; import { Fragment, Key, useCallback, useEffect, useState } from "react"; import Cookies from "js-cookie"; import * as z from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Controller, useForm } from "react-hook-form"; import Swal from "sweetalert2"; import withReactContent from "sweetalert2-react-content"; import { useDropzone } from "react-dropzone"; import Image from "next/image"; import { useRouter } from "next/navigation"; import { getComments } from "@/services/comment"; const columns = [ { name: "No", uid: "no" }, { name: "Nama", uid: "commentFromName" }, { name: "Komentar", uid: "message" }, { name: "Article", uid: "articleId" }, { name: "Status", uid: "status" }, { name: "Aksi", uid: "actions" }, ]; interface Category { id: number; title: string; } export default function CommentTable() { const MySwal = withReactContent(Swal); const router = useRouter(); const [page, setPage] = useState(1); const [totalPage, setTotalPage] = useState(1); const [comments, setComments] = useState([]); const [showData, setShowData] = useState("10"); const [search, setSearch] = useState(""); useEffect(() => { initState(); }, [page, showData]); async function initState() { const req = { limit: showData, page: page, search: search, }; const res = await getComments(req); getTableNumber(parseInt(showData), res.data?.data); setTotalPage(res?.data?.meta?.totalPage); } const getTableNumber = (limit: number, data: Article[]) => { if (data) { const startIndex = limit * (page - 1); let iterate = 0; const newData = data.map((value: any) => { iterate++; value.no = startIndex + iterate; return value; }); setComments(newData); } else { setComments([]); } }; async function doDelete(id: any) { loading(); const resDelete = await deleteArticle(id); if (resDelete?.error) { error(resDelete.message); return false; } close(); success("Berhasil Hapus"); initState(); } const handleDelete = (id: any) => { MySwal.fire({ title: "Hapus Data", icon: "warning", showCancelButton: true, cancelButtonColor: "#3085d6", confirmButtonColor: "#d33", confirmButtonText: "Hapus", }).then((result) => { if (result.isConfirmed) { doDelete(id); } }); }; const openArticle = async (id: number) => { const res = await getArticleById(id); if (res?.error) { MySwal.fire({ title: "Artikel tidak ditemukan atau telah dihapus", icon: "warning", showCancelButton: false, cancelButtonColor: "#3085d6", confirmButtonColor: "#d33", confirmButtonText: "Oke", }).then((result) => { if (result.isConfirmed) { } }); return false; } router.push(`/news/detail/${id}-${res?.data?.data?.slug}`); }; const renderCell = useCallback( (comment: any, columnKey: Key) => { const cellValue = comment[columnKey as keyof any]; switch (columnKey) { case "articleId": return ( openArticle(cellValue)} className="text-primary underline cursor-pointer" > Buka Article ); case "status": return (

{comment?.statusId == 1 ? "Disetujui" : comment?.statusId == 2 ? "Dibalas" : comment?.statusId == 3 ? "Ditolak" : "Menunggu Review"}

); case "actions": return (
router.push(`/admin/comment/review/${comment.id}`) } className={comment.isPublic ? "hidden" : ""} > {comment.isPublic == false && ( <> Review )} handleDelete(comment.id)} > Delete
); default: return cellValue; } }, [comments] ); let typingTimer: NodeJS.Timeout; const doneTypingInterval = 1500; const handleKeyUp = () => { clearTimeout(typingTimer); typingTimer = setTimeout(doneTyping, doneTypingInterval); }; const handleKeyDown = () => { clearTimeout(typingTimer); }; async function doneTyping() { initState(); } return ( <>

Pencarian

} type="text" onChange={(e) => setSearch(e.target.value)} onKeyUp={handleKeyUp} onKeyDown={handleKeyDown} />

Data

{(column) => ( {column.name} )} } > {(item: any) => ( {(columnKey) => ( {renderCell(item, columnKey)} )} )}
setPage(page)} />
); }