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" + > +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+ + )}