From 094ac206b60482da40d9da075bf198fcad1cb680 Mon Sep 17 00:00:00 2001 From: Rama Priyanto Date: Thu, 6 Mar 2025 21:58:38 +0700 Subject: [PATCH] feat:comment approval --- app/(admin)/admin/comment/page.tsx | 73 +----- .../admin/comment/review/[id]/page.tsx | 245 ++++++++++++++++++ .../form/article/create-article-form.tsx | 2 +- components/main/detail/comment.tsx | 2 +- components/table/article-table.tsx | 2 + components/table/comment/comment-table.tsx | 207 +++++---------- components/table/magazine/magazine-table.tsx | 2 + .../master-categories/categories-table.tsx | 2 + .../table/suggestions/suggestions-table.tsx | 38 ++- service/comment.ts | 42 +++ service/feedbacks.ts | 9 +- service/master-user.ts | 5 +- 12 files changed, 393 insertions(+), 236 deletions(-) create mode 100644 service/comment.ts diff --git a/app/(admin)/admin/comment/page.tsx b/app/(admin)/admin/comment/page.tsx index 64f9474..ad9fd31 100644 --- a/app/(admin)/admin/comment/page.tsx +++ b/app/(admin)/admin/comment/page.tsx @@ -1,82 +1,11 @@ -"use client"; -import { AddIcon, CloudUploadIcon, TimesIcon } from "@/components/icons"; -import AdvertiseTable from "@/components/table/advertise/advertise-table"; - -import { - Button, - Card, - Chip, - Input, - Modal, - ModalBody, - ModalContent, - ModalFooter, - ModalHeader, - Switch, - Textarea, - useDisclosure, -} from "@heroui/react"; -import Link from "next/link"; -import { useRouter } from "next/navigation"; -import * as z from "zod"; -import { zodResolver } from "@hookform/resolvers/zod"; -import { Controller, useForm } from "react-hook-form"; -import { Fragment, useEffect, useState } from "react"; -import Swal from "sweetalert2"; -import withReactContent from "sweetalert2-react-content"; - -import { useDropzone } from "react-dropzone"; -import { close, error, loading } from "@/config/swal"; -import Image from "next/image"; import CommentTable from "@/components/table/comment/comment-table"; -const createArticleSchema = z.object({ - title: z.string().min(2, { - message: "Judul harus diisi", - }), - url: z.string().min(2, { - message: "Link harus diisi", - }), - description: z.string().min(2, { - message: "Deskripsi harus diisi", - }), -}); - export default function AdvertisePage() { - const { isOpen, onOpen, onOpenChange, onClose } = useDisclosure(); - const MySwal = withReactContent(Swal); - - const [refresh, setRefresh] = useState(false); - const [isHeader, setIsHeader] = useState(false); - - const [files, setFiles] = useState([]); - - const formOptions = { - resolver: zodResolver(createArticleSchema), - defaultValues: { title: "", description: "", url: "" }, - }; - - const { getRootProps, getInputProps } = useDropzone({ - onDrop: (acceptedFiles) => { - setFiles(acceptedFiles.map((file) => Object.assign(file))); - }, - maxFiles: 1, - accept: { - "image/*": [], - }, - }); - type UserSettingSchema = z.infer; - const { - control, - handleSubmit, - formState: { errors }, - } = useForm(formOptions); - return (
- +
diff --git a/app/(admin)/admin/comment/review/[id]/page.tsx b/app/(admin)/admin/comment/review/[id]/page.tsx index e69de29..ec4b5b1 100644 --- a/app/(admin)/admin/comment/review/[id]/page.tsx +++ b/app/(admin)/admin/comment/review/[id]/page.tsx @@ -0,0 +1,245 @@ +"use client"; +import { close, error, loading } from "@/config/swal"; +import { FormEvent, Fragment, useEffect, useRef, useState } from "react"; +import { Controller, useForm } from "react-hook-form"; +import * as z from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; +import Swal from "sweetalert2"; +import withReactContent from "sweetalert2-react-content"; +import { Input, Textarea } from "@heroui/input"; +import { Button } from "@heroui/button"; +import { useParams, useRouter } from "next/navigation"; +import { getCommentById, saveCommentStatus } from "@/service/comment"; +import { + Modal, + ModalBody, + ModalContent, + ModalFooter, + ModalHeader, + useDisclosure, +} from "@heroui/react"; +import { getArticleById } from "@/service/article"; +import Link from "next/link"; +import { postArticleComment } from "@/service/master-user"; + +interface DetailComments { + id: number; + message: string; + articleId: number; + commentFromName: string; +} + +export default function ReviewComment() { + const MySwal = withReactContent(Swal); + const { isOpen, onOpen, onOpenChange } = useDisclosure(); + + const params = useParams(); + const id = Number(params?.id); + const router = useRouter(); + const [replyValue, setReplyValue] = useState(""); + + const [detailData, setDetailData] = useState(); + const [detailArticle, setDetailArticle] = useState<{ + id: number; + slug: string; + title: string; + }>(); + useEffect(() => { + initFetch(); + }, []); + + const initFetch = async () => { + loading(); + const res = await getCommentById(id); + setDetailData(res?.data?.data); + const resArticle = await getArticleById(res?.data?.data?.articleId); + setDetailArticle(resArticle?.data?.data); + console.log("iddd", res?.data?.data); + close(); + }; + + const handleCommentStatus = async (statusId: number) => { + MySwal.fire({ + title: "Submit Data", + text: "", + icon: "warning", + showCancelButton: true, + cancelButtonColor: "#d33", + confirmButtonColor: "#3085d6", + confirmButtonText: "Simpan", + }).then((result) => { + if (result.isConfirmed) { + saveStatus(statusId); + } + }); + }; + + const saveStatus = async (statusId: number) => { + const req = { id: id, statusId: statusId }; + const res = await saveCommentStatus(req); + if (res?.error) { + error(res.message); + return false; + } + successSubmit("/admin/comment"); + }; + + function successSubmit(redirect: string) { + MySwal.fire({ + title: "Sukses", + icon: "success", + confirmButtonColor: "#3085d6", + confirmButtonText: "OK", + }).then((result) => { + if (result.isConfirmed) { + router.push(redirect); + } + }); + } + + const sendComment = async () => { + const data = { + articleId: detailData?.articleId, + isPublic: true, + message: replyValue, + parentId: id, + }; + + const res = await postArticleComment(data); + if (res?.error) { + error(res?.message); + return false; + } + saveStatus(2); + }; + + return ( +
+
+
+

Artikel

+ + {detailArticle?.title} + +
+
+

Nama

+ +
+
+

Komentar

+