From 0e9d865f4429ac9b4fece51c80c876ea20ca8498 Mon Sep 17 00:00:00 2001 From: bicochan Date: Mon, 30 Jun 2025 10:53:41 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=ED=8F=89?= =?UTF-8?q?=EA=B0=80=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/cs/src/shared/config/api.ts | 1 + .../post/api/post-evaluation-service.ts | 14 ++++ .../post/model/post-evaluation-interface.ts | 10 +++ apps/cs/src/widgets/post/ui/post.tsx | 72 ++++++++++++++++++- 4 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 apps/cs/src/widgets/post/api/post-evaluation-service.ts create mode 100644 apps/cs/src/widgets/post/model/post-evaluation-interface.ts diff --git a/apps/cs/src/shared/config/api.ts b/apps/cs/src/shared/config/api.ts index ee168407e..8a0d94ef5 100644 --- a/apps/cs/src/shared/config/api.ts +++ b/apps/cs/src/shared/config/api.ts @@ -55,6 +55,7 @@ export const ENDPOINT = { BBS_TEMPLATES: "/board-service/api/v1/bbsTmplt", POSTS: "/board-service/api/v1/posts", POSTS_COMMENTS: "/board-service/api/v1/posts-cmnts", + POST_EVALUATION: "/board-service/api/v1/pstEvl", }, }; diff --git a/apps/cs/src/widgets/post/api/post-evaluation-service.ts b/apps/cs/src/widgets/post/api/post-evaluation-service.ts new file mode 100644 index 000000000..9258ba299 --- /dev/null +++ b/apps/cs/src/widgets/post/api/post-evaluation-service.ts @@ -0,0 +1,14 @@ +import { client } from "@/shared/api"; +import { ENDPOINT } from "@/shared/config"; +import type { + PostEvaluationPayload, + PostEvaluationService, +} from "../model/post-evaluation-interface"; + +export class PostEvaluationApiService implements PostEvaluationService { + public async postEvaluation(payload: PostEvaluationPayload) { + await client.post(ENDPOINT.BOARD_SERVICE.POST_EVALUATION, payload); + } +} + +export const PostEvaluationApi = new PostEvaluationApiService(); diff --git a/apps/cs/src/widgets/post/model/post-evaluation-interface.ts b/apps/cs/src/widgets/post/model/post-evaluation-interface.ts new file mode 100644 index 000000000..c99249d6a --- /dev/null +++ b/apps/cs/src/widgets/post/model/post-evaluation-interface.ts @@ -0,0 +1,10 @@ +export interface PostEvaluationPayload { + pstNo: number; + evlIp?: string; + evlDt?: string; + evlScr: number; +} + +export interface PostEvaluationService { + postEvaluation: (payload: PostEvaluationPayload) => Promise; +} diff --git a/apps/cs/src/widgets/post/ui/post.tsx b/apps/cs/src/widgets/post/ui/post.tsx index a7f3cb43a..040262218 100644 --- a/apps/cs/src/widgets/post/ui/post.tsx +++ b/apps/cs/src/widgets/post/ui/post.tsx @@ -5,14 +5,21 @@ import Image from "next/image"; import { useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import { useQuery } from "@tanstack/react-query"; -import { Button, Skeleton } from "@common/components"; +import { + Button, + Label, + RadioGroup, + RadioGroupItem, + Skeleton, +} from "@common/components"; import { AttachmentApi } from "@/entities/attachment"; import { PostApi } from "@/entities/post"; -import { useAlertStore, useMutationWrapper, useMenuStore } from "@/shared/lib"; +import { BoardApi } from "@/entities/board"; import { ENDPOINT } from "@/shared/config"; +import { useAlertStore, useMutationWrapper, useMenuStore } from "@/shared/lib"; import { PostAction } from "./post-action"; import { PostComment } from "./post-comment"; -import { BoardApi } from "@/entities/board"; +import { PostEvaluationApi } from "../api/post-evaluation-service"; function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) { const router = useRouter(); @@ -20,6 +27,7 @@ function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) { const { bbsInfo, setBbsInfo } = useMenuStore((state) => state); const [filename, setFilename] = useState(""); + const [evlScr, setEvlScr] = useState(5); const { data: boardInfo } = useQuery({ queryKey: [ENDPOINT.BOARD_SERVICE.BBS, bbsId], @@ -72,6 +80,17 @@ function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) { }, }); + const { mutate: postEvaluation } = useMutationWrapper({ + mutationFn: (evlScr: number) => + PostEvaluationApi.postEvaluation({ + pstNo: parseInt(pstNo), + evlScr, + }), + onSuccess: () => { + alert("게시물 평가가 완료되었습니다."); + }, + }); + const handleDownload = async () => { if (!downloadResponse) return; try { @@ -187,6 +206,53 @@ function Post({ bbsId, pstNo }: { bbsId: string; pstNo: string }) { ) )} + {bbsInfo?.dgstfnEvlUseYn === "Y" && ( + <> +
+
+

+ 이 페이지에서 제공하는 +
+ 정보에 대하여 만족하시나요? +

+
+ setEvlScr(parseInt(value))} + className="flex items-center space-x-4" + > +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+ + )}