From 65ee5d0affeecd663ba2fd51cf62dbf397a53b13 Mon Sep 17 00:00:00 2001 From: ImxYJL Date: Thu, 10 Oct 2024 16:57:01 +0900 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=EB=B0=9B=EC=9D=80=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=A0=95=EB=B3=B4=20=EB=AA=A8=ED=82=B9=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/mocks/mockData/index.ts | 1 + frontend/src/mocks/mockData/reviewInfoData.ts | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 frontend/src/mocks/mockData/reviewInfoData.ts diff --git a/frontend/src/mocks/mockData/index.ts b/frontend/src/mocks/mockData/index.ts index 930b9a081..1eb86e462 100644 --- a/frontend/src/mocks/mockData/index.ts +++ b/frontend/src/mocks/mockData/index.ts @@ -3,3 +3,4 @@ export * from './group'; export * from './reviewListMockData'; export * from './reviewWriting/reviewFormResultData'; export * from './reviewWriting/reviewQuestionData'; +export * from './reviewInfoData'; diff --git a/frontend/src/mocks/mockData/reviewInfoData.ts b/frontend/src/mocks/mockData/reviewInfoData.ts new file mode 100644 index 000000000..4078b9156 --- /dev/null +++ b/frontend/src/mocks/mockData/reviewInfoData.ts @@ -0,0 +1,5 @@ +export const MOCK_REVIEW_INFO_DATA = { + projectName: '리뷰미', + revieweeName: '산초', + totalReviewCount: 500, +}; From 31bee87f13a9d6d2e5e6a2633db7dfd4947da493 Mon Sep 17 00:00:00 2001 From: ImxYJL Date: Thu, 10 Oct 2024 16:57:29 +0900 Subject: [PATCH 2/7] =?UTF-8?q?feat:=20=EB=B0=9B=EC=9D=80=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20API=20=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/apis/endpoints.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/apis/endpoints.ts b/frontend/src/apis/endpoints.ts index 5b251ae0e..47afe6dc6 100644 --- a/frontend/src/apis/endpoints.ts +++ b/frontend/src/apis/endpoints.ts @@ -55,6 +55,7 @@ export const REVIEW_GROUP_DATA_API_URL = `${serverUrl}/${VERSION2}/${REVIEW_GROU const endPoint = { postingReview: `${serverUrl}/${VERSION2}/reviews`, + gettingReviewInfoData: `${serverUrl}/${VERSION2}/reviews/summary`, gettingDetailedReview: (reviewId: number) => `${DETAILED_REVIEW_API_URL}/${reviewId}`, gettingDataToWriteReview: (reviewRequestCode: string) => `${REVIEW_WRITING_API_URL}/${REVIEW_WRITING_API_PARAMS.queryString.write}?${REVIEW_WRITING_API_PARAMS.queryString.reviewRequestCode}=${reviewRequestCode}`, From cd035bb2ad70b2efc38ce722e34708de6dabbef8 Mon Sep 17 00:00:00 2001 From: ImxYJL Date: Thu, 10 Oct 2024 16:58:27 +0900 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=EB=B0=9B=EC=9D=80=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=A0=95=EB=B3=B4=20API=EB=A5=BC=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=ED=95=98=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/apis/review.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/frontend/src/apis/review.ts b/frontend/src/apis/review.ts index 825f70283..df72b4709 100644 --- a/frontend/src/apis/review.ts +++ b/frontend/src/apis/review.ts @@ -1,4 +1,4 @@ -import { DetailReviewData, ReviewList, ReviewWritingFormResult, ReviewWritingFormData } from '@/types'; +import { DetailReviewData, ReviewList, ReviewWritingFormResult, ReviewWritingFormData, ReviewInfoData } from '@/types'; import createApiErrorMessage from './apiErrorMessageCreator'; import endPoint from './endpoints'; @@ -32,6 +32,24 @@ export const postReviewApi = async (formResult: ReviewWritingFormResult) => { return; }; +// 받은 리뷰들에 대한 정보(프로젝트 이름, 리뷰이, 받은 리뷰 개수) +export const getReviewInfoDataApi = async () => { + const response = await fetch(endPoint.gettingReviewInfoData, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + credentials: 'include', + }); + + if (!response.ok) { + throw new Error(createApiErrorMessage(response.status)); + } + + const data = await response.json(); + return data as ReviewInfoData; +}; + interface GetDetailedReviewApi { reviewId: number; } From d4bcc6b12dea44cb7fbe9f8a08605c7cffc3838e Mon Sep 17 00:00:00 2001 From: ImxYJL Date: Thu, 10 Oct 2024 16:59:57 +0900 Subject: [PATCH 4/7] =?UTF-8?q?feat:=20=EB=B0=9B=EC=9D=80=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=A0=95=EB=B3=B4=20API=EB=A5=BC=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8A=94=20=EB=A6=AC=EC=95=A1=ED=8A=B8=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=ED=9B=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hooks/useReviewInfoData/index.tsx | 21 +++++++++++++++++++ frontend/src/constants/queryKey.ts | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 frontend/src/components/layouts/ReviewDisplayLayout/hooks/useReviewInfoData/index.tsx diff --git a/frontend/src/components/layouts/ReviewDisplayLayout/hooks/useReviewInfoData/index.tsx b/frontend/src/components/layouts/ReviewDisplayLayout/hooks/useReviewInfoData/index.tsx new file mode 100644 index 000000000..b48779a27 --- /dev/null +++ b/frontend/src/components/layouts/ReviewDisplayLayout/hooks/useReviewInfoData/index.tsx @@ -0,0 +1,21 @@ +import { useSuspenseQuery } from '@tanstack/react-query'; + +import { getReviewInfoDataApi } from '@/apis/review'; +import { REVIEW_QUERY_KEY } from '@/constants'; +import { ReviewInfoData } from '@/types'; + +const useReviewInfoData = () => { + const fetchReviewInfoData = async () => { + return await getReviewInfoDataApi(); + }; + + const { data } = useSuspenseQuery({ + queryKey: [REVIEW_QUERY_KEY.reviewInfoData], + queryFn: () => fetchReviewInfoData(), + staleTime: 60 * 60 * 1000, + }); + + return data; +}; + +export default useReviewInfoData; diff --git a/frontend/src/constants/queryKey.ts b/frontend/src/constants/queryKey.ts index e89c803dc..f4f89e6fb 100644 --- a/frontend/src/constants/queryKey.ts +++ b/frontend/src/constants/queryKey.ts @@ -1,9 +1,9 @@ -// TODO: 내용이 배열이 아니므로 단수형으로 수정하기 export const REVIEW_QUERY_KEY = { detailedReview: 'detailedReview', reviews: 'reviews', writingReviewInfo: 'writingReviewInfo', postReview: 'postReview', + reviewInfoData: 'reviewInfoData', }; export const GROUP_QUERY_KEY = { From 6895528ca9949410350a88ed1ad86762f93b4364 Mon Sep 17 00:00:00 2001 From: ImxYJL Date: Thu, 10 Oct 2024 17:01:34 +0900 Subject: [PATCH 5/7] =?UTF-8?q?refactor:=20=EB=B0=9B=EC=9D=80=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=A0=95=EB=B3=B4=20API=20=EC=8A=A4=ED=8E=99?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EC=B6=B0=20=EC=BD=94=EB=93=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/ReviewCard/index.tsx | 1 - .../components/ReviewInfoSection/index.tsx | 6 +++--- .../ReviewDisplayLayout/hooks/index.ts | 2 ++ .../index.ts} | 0 .../layouts/ReviewDisplayLayout/index.tsx | 19 +++++++++---------- .../src/pages/ReviewCollectionPage/index.tsx | 2 +- .../components/PageContents/index.tsx | 4 +--- 7 files changed, 16 insertions(+), 18 deletions(-) create mode 100644 frontend/src/components/layouts/ReviewDisplayLayout/hooks/index.ts rename frontend/src/components/layouts/ReviewDisplayLayout/hooks/{useReviewDisplayLayoutOptions.ts => useReviewDisplayLayoutOptions/index.ts} (100%) diff --git a/frontend/src/components/ReviewCard/index.tsx b/frontend/src/components/ReviewCard/index.tsx index f820a55a4..bcb71a803 100644 --- a/frontend/src/components/ReviewCard/index.tsx +++ b/frontend/src/components/ReviewCard/index.tsx @@ -3,7 +3,6 @@ import { Category } from '@/types'; import * as S from './styles'; interface ReviewCardProps { - projectName: string; createdAt: string; contentPreview: string; categories: Category[]; diff --git a/frontend/src/components/layouts/ReviewDisplayLayout/components/ReviewInfoSection/index.tsx b/frontend/src/components/layouts/ReviewDisplayLayout/components/ReviewInfoSection/index.tsx index d1bf463bf..1a8ab689a 100644 --- a/frontend/src/components/layouts/ReviewDisplayLayout/components/ReviewInfoSection/index.tsx +++ b/frontend/src/components/layouts/ReviewDisplayLayout/components/ReviewInfoSection/index.tsx @@ -6,10 +6,10 @@ export interface ReviewInfoSectionProps { revieweeName: string; isReviewList: boolean; projectName: string; - reviewCount?: number; + totalReviewCount?: number; } -const ReviewInfoSection = ({ projectName, revieweeName, reviewCount, isReviewList }: ReviewInfoSectionProps) => { +const ReviewInfoSection = ({ projectName, revieweeName, totalReviewCount, isReviewList }: ReviewInfoSectionProps) => { const revieweeNameWithParticle = calculateParticle({ target: revieweeName, particles: { withFinalConsonant: '이', withoutFinalConsonant: '가' }, @@ -17,7 +17,7 @@ const ReviewInfoSection = ({ projectName, revieweeName, reviewCount, isReviewLis const getReviewInfoMessage = () => { return isReviewList - ? `${revieweeNameWithParticle} 받은 ${reviewCount}개의 리뷰 목록이에요` + ? `${revieweeNameWithParticle} 받은 ${totalReviewCount}개의 리뷰 목록이에요` : `${revieweeNameWithParticle} 받은 리뷰를 질문별로 모아봤어요`; }; diff --git a/frontend/src/components/layouts/ReviewDisplayLayout/hooks/index.ts b/frontend/src/components/layouts/ReviewDisplayLayout/hooks/index.ts new file mode 100644 index 000000000..e5198fb52 --- /dev/null +++ b/frontend/src/components/layouts/ReviewDisplayLayout/hooks/index.ts @@ -0,0 +1,2 @@ +export { default as useReviewDisplayLayoutOptions } from './useReviewDisplayLayoutOptions/index'; +export { default as useReviewInfoData } from './useReviewInfoData/index'; diff --git a/frontend/src/components/layouts/ReviewDisplayLayout/hooks/useReviewDisplayLayoutOptions.ts b/frontend/src/components/layouts/ReviewDisplayLayout/hooks/useReviewDisplayLayoutOptions/index.ts similarity index 100% rename from frontend/src/components/layouts/ReviewDisplayLayout/hooks/useReviewDisplayLayoutOptions.ts rename to frontend/src/components/layouts/ReviewDisplayLayout/hooks/useReviewDisplayLayoutOptions/index.ts diff --git a/frontend/src/components/layouts/ReviewDisplayLayout/index.tsx b/frontend/src/components/layouts/ReviewDisplayLayout/index.tsx index 8c22cfbfc..73545864a 100644 --- a/frontend/src/components/layouts/ReviewDisplayLayout/index.tsx +++ b/frontend/src/components/layouts/ReviewDisplayLayout/index.tsx @@ -1,18 +1,17 @@ import { TopButton, OptionSwitch } from '@/components/common'; import { EssentialPropsWithChildren } from '@/types'; -import ReviewInfoSection, { ReviewInfoSectionProps } from './components/ReviewInfoSection'; -import useReviewDisplayLayoutOptions from './hooks/useReviewDisplayLayoutOptions'; +import ReviewInfoSection from './components/ReviewInfoSection'; +import { useReviewInfoData, useReviewDisplayLayoutOptions } from './hooks'; import * as S from './styles'; -const ReviewDisplayLayout = ({ - revieweeName, - projectName, - reviewCount, - isReviewList, - children, -}: EssentialPropsWithChildren) => { +interface ReviewDisplayLayoutProps { + isReviewList: boolean; +} + +const ReviewDisplayLayout = ({ isReviewList, children }: EssentialPropsWithChildren) => { const reviewDisplayLayoutOptions = useReviewDisplayLayoutOptions(); + const { revieweeName, projectName, totalReviewCount } = useReviewInfoData(); return ( @@ -20,7 +19,7 @@ const ReviewDisplayLayout = ({ diff --git a/frontend/src/pages/ReviewCollectionPage/index.tsx b/frontend/src/pages/ReviewCollectionPage/index.tsx index 3bd098ace..a4fc17672 100644 --- a/frontend/src/pages/ReviewCollectionPage/index.tsx +++ b/frontend/src/pages/ReviewCollectionPage/index.tsx @@ -21,7 +21,7 @@ const ReviewCollectionPage = () => { return ( - + { navigate(`/${ROUTE.detailedReview}/${reviewRequestCode}/${id}`); }; - const { projectName, revieweeName } = data.pages[0]; const isLastPage = data.pages[data.pages.length - 1].isLastPage; const reviews = data.pages.flatMap((page) => page.reviews); @@ -36,7 +35,7 @@ const PageContents = () => { return ( isSuccess && ( - + {reviews.length === 0 ? ( ) : ( @@ -46,7 +45,6 @@ const PageContents = () => { return ( Date: Thu, 10 Oct 2024 17:01:48 +0900 Subject: [PATCH 6/7] =?UTF-8?q?feat:=20ReviewInfoData=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EC=A7=80=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/types/review.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/src/types/review.ts b/frontend/src/types/review.ts index 858a70d8f..00f3a51f3 100644 --- a/frontend/src/types/review.ts +++ b/frontend/src/types/review.ts @@ -200,3 +200,9 @@ export interface ReviewWritingFormResult { reviewRequestCode: string; answers: ReviewWritingAnswer[]; } + +export interface ReviewInfoData { + projectName: string; + revieweeName: string; + totalReviewCount: number; +} From da715804f327997e34b6f1ec850bd4c2afc03476 Mon Sep 17 00:00:00 2001 From: ImxYJL Date: Thu, 10 Oct 2024 17:03:32 +0900 Subject: [PATCH 7/7] =?UTF-8?q?feat:=20=EB=B0=9B=EC=9D=80=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20API=20=EC=9A=94=EC=B2=AD=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=EB=AA=A8=ED=82=B9=20=ED=95=B8=EB=93=A4?= =?UTF-8?q?=EB=9F=AC=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/mocks/handlers/review.ts | 44 +++++++++++++++++++-------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/frontend/src/mocks/handlers/review.ts b/frontend/src/mocks/handlers/review.ts index 2eb0e3002..43b6bcb2a 100644 --- a/frontend/src/mocks/handlers/review.ts +++ b/frontend/src/mocks/handlers/review.ts @@ -15,6 +15,7 @@ import { REVIEW_QUESTION_DATA, REVIEW_LIST, MOCK_AUTH_TOKEN_NAME, + MOCK_REVIEW_INFO_DATA, } from '../mockData'; export const PAGE = { @@ -22,6 +23,15 @@ export const PAGE = { firstPageStartIndex: 0, }; +const getReviewInfoData = () => + http.get(endPoint.gettingReviewInfoData, async ({ cookies }) => { + if (!cookies[MOCK_AUTH_TOKEN_NAME]) { + return HttpResponse.json({ error: '인증 관련 쿠키 없음' }, { status: 401 }); + } + + return HttpResponse.json(MOCK_REVIEW_INFO_DATA); + }); + const getDetailedReview = () => http.get(new RegExp(`^${DETAILED_REVIEW_API_URL}/\\d+$`), async ({ request, cookies }) => { // authToken 쿠키 확인 @@ -43,17 +53,21 @@ const getDetailedReview = () => }); const getDataToWriteReview = () => - http.get(new RegExp(`^${REVIEW_WRITING_API_URL}`), async ({ request }) => { - //요청 url에서 reviewId, memberId 추출 - const url = new URL(request.url); - const urlRequestCode = url.searchParams.get(REVIEW_WRITING_API_PARAMS.queryString.reviewRequestCode); - - if (REVIEW_REQUEST_CODE === urlRequestCode) { - return HttpResponse.json(REVIEW_QUESTION_DATA); - } - return HttpResponse.json({ error: '잘못된 리뷰 작성 데이터 요청' }, { status: 404 }); - }); - + http.get( + new RegExp(`^${REVIEW_WRITING_API_URL}/${REVIEW_WRITING_API_PARAMS.queryString.write}`), + async ({ request }) => { + //요청 url에서 reviewId, memberId 추출 + const url = new URL(request.url); + const urlRequestCode = url.searchParams.get(REVIEW_WRITING_API_PARAMS.queryString.reviewRequestCode); + + if (REVIEW_REQUEST_CODE === urlRequestCode) { + return HttpResponse.json(REVIEW_QUESTION_DATA); + } + return HttpResponse.json({ error: '잘못된 리뷰 작성 데이터 요청' }, { status: 404 }); + }, + ); + +// TODO: 추후 getReviewList API에서 리뷰 정보(이름, 개수...)를 내려주지 않는 경우 핸들러도 수정 필요 const getReviewList = (lastReviewId: number | null, size: number) => { return http.get(endPoint.gettingReviewList(lastReviewId, size), async ({ request, cookies }) => { // authToken 쿠키 확인 @@ -90,6 +104,12 @@ const postReview = () => return HttpResponse.json({ message: 'post 성공' }, { status: 201 }); }); -const reviewHandler = [getDetailedReview(), getReviewList(null, 10), getDataToWriteReview(), postReview()]; +const reviewHandler = [ + getDetailedReview(), + getReviewList(null, 10), + getDataToWriteReview(), + postReview(), + getReviewInfoData(), +]; export default reviewHandler;