Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FE] feat: 리뷰 작성 페이지에 변경된 리뷰 작성 페이지의 API 반영 #317

Merged
merged 7 commits into from
Aug 12, 2024
13 changes: 8 additions & 5 deletions frontend/src/apis/endpoints.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,29 @@
export const VERSION2 = 'v2';
export const DETAILED_REVIEW_API_PARAMS = {
resource: 'reviews',
queryString: {
memberId: 'memberId',
},
};

export const DETAILED_REVIEW_API_URL = `${process.env.API_BASE_URL}/${DETAILED_REVIEW_API_PARAMS.resource}`;
export const DETAILED_REVIEW_API_URL = `${process.env.API_BASE_URL}/${VERSION2}/${DETAILED_REVIEW_API_PARAMS.resource}`;

export const REVIEW_WRITING_API_PARAMS = {
resource: 'reviews',
queryString: {
write: 'write',
reviewRequestCode: 'reviewRequestCode',
},
};

const endPoint = {
postingReview: `${process.env.API_BASE_URL}/reviews`,
postingReview: `${process.env.API_BASE_URL}/${VERSION2}/reviews`,
gettingDetailedReview: (reviewId: number, memberId: number) =>
`${DETAILED_REVIEW_API_URL}/${reviewId}?${DETAILED_REVIEW_API_PARAMS.queryString.memberId}=${memberId}`,
gettingDataToWriteReview: (reviewRequestCode: string) =>
`${process.env.API_BASE_URL}/reviews/write?${REVIEW_WRITING_API_PARAMS.queryString.reviewRequestCode}=${reviewRequestCode}`,
gettingReviewList: `${process.env.API_BASE_URL}/reviews`,
postingDataForURL: `${process.env.API_BASE_URL}/groups`,
`${process.env.API_BASE_URL}/${VERSION2}/${REVIEW_WRITING_API_PARAMS.resource}/${REVIEW_WRITING_API_PARAMS.queryString.write}?${REVIEW_WRITING_API_PARAMS.queryString.reviewRequestCode}=${reviewRequestCode}`,
gettingReviewList: `${process.env.API_BASE_URL}/${VERSION2}/reviews`,
postingDataForURL: `${process.env.API_BASE_URL}/${VERSION2}/groups`,
};

export default endPoint;
8 changes: 4 additions & 4 deletions frontend/src/apis/review.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { DetailReviewData, ReviewData, ReviewList, WritingReviewInfoData } from '@/types';
import { DetailReviewData, ReviewData, ReviewList, ReviewWritingFormResult, ReviewWritingFrom } from '@/types';

import createApiErrorMessage from './apiErrorMessageCreator';
import endPoint from './endpoints';
Expand All @@ -13,16 +13,16 @@ export const getDataToWriteReviewApi = async (reviewRequestCode: string) => {
}

const data = await response.json();
return data as WritingReviewInfoData;
return data as ReviewWritingFrom;
};

export const postReviewApi = async ({ reviewData }: { reviewData: ReviewData }) => {
export const postReviewApi = async (formResult: ReviewWritingFormResult) => {
const response = await fetch(endPoint.postingReview, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(reviewData),
body: JSON.stringify(formResult),
});

if (!response.ok) {
Expand Down
115 changes: 0 additions & 115 deletions frontend/src/components/AnswerListPreviewModal/answerList.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,24 +1,38 @@
import { Fragment } from 'react';

import { ReviewWritingAnswer, ReviewWritingCardSection } from '@/types';

import CheckboxItem from '../common/CheckboxItem';
import ContentModal from '../common/modals/ContentModal';

import { Section } from './answerList';
import QuestionCard from './components/QuestionCard';
import ReviewWritingCard from './components/ReviewWritingCard';
import * as S from './styles';

interface AnswerListPreviewModalProps {
answerList: Section[];
interface AnswerListRecheckModalProps {
questionSectionList: ReviewWritingCardSection[];
answerMap: Map<number, ReviewWritingAnswer>;
closeModal: () => void;
}

const AnswerListPreviewModal = ({ answerList, closeModal }: AnswerListPreviewModalProps) => {
const AnswerListRecheckModal = ({ questionSectionList, answerMap, closeModal }: AnswerListRecheckModalProps) => {
const isSelectedChoice = (questionId: number, optionId: number) => {
const answer = answerMap.get(questionId);
if (!answer) return false;

return !!answer.selectedOptionIds?.some((id) => id === optionId);
};

const findTextAnswer = (questionId: number) => {
const answer = answerMap.get(questionId);
return answer ? answer.text : '';
};

return (
<ContentModal handleClose={closeModal}>
<S.AnswerListContainer>
<S.CardLayout>
{answerList.map((section) => (
{questionSectionList.map((section) => (
<S.ReviewWritingCardWrapper key={section.sectionId}>
<ReviewWritingCard title={section.header}>
{section.questions.map((question) => (
Expand All @@ -32,15 +46,15 @@ const AnswerListPreviewModal = ({ answerList, closeModal }: AnswerListPreviewMod
key={`${question.questionId}_${index}`}
id={`${question.questionId}_${index}`}
name={`${question.questionId}_${index}`}
isChecked={option.isChecked}
isChecked={isSelectedChoice(question.questionId, option.optionId)}
isDisabled={true}
label={option.content}
$isReadonly={true}
/>
))}
</div>
)}
<div>{question.questionType === 'TEXT' && <div>{question.answer ?? ''}</div>}</div>
<div>{question.questionType === 'TEXT' && <div>{findTextAnswer(question.questionId)}</div>}</div>
</S.ContentContainer>
</Fragment>
))}
Expand All @@ -53,4 +67,4 @@ const AnswerListPreviewModal = ({ answerList, closeModal }: AnswerListPreviewMod
);
};

export default AnswerListPreviewModal;
export default AnswerListRecheckModal;
1 change: 1 addition & 0 deletions frontend/src/components/index.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './layouts';
export * from './common';
export * from './error';
export { default as AnswerListRecheckModal } from './AnswerListRecheckModal';
2 changes: 0 additions & 2 deletions frontend/src/hooks/review/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
export * from './writingCardForm';
export { default as useGetDataToWrite } from './useGetDataToWrite';
export { default as useGetDetailedReview } from './useGetDetailedReview';
export { default as useMutateReview } from './useMutateReview';
export { default as useGetReviewList } from './useGetReviewList';
34 changes: 0 additions & 34 deletions frontend/src/hooks/review/useGetDataToWrite/index.ts

This file was deleted.

2 changes: 2 additions & 0 deletions frontend/src/hooks/review/writingCardForm/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,5 @@ export { default as useCurrentCardIndex } from './useCurrentCardIndex';
export { default as useMultipleChoice } from './useMultipleChoice';
export { default as useTextAnswer } from './useTextAnswer';
export { default as useQuestionList } from './useQuestionList';
export { default as useGetDataToWrite } from './useGetDataToWrite';
export { default as useMutateReview } from './useMutateReview';
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { useSuspenseQuery } from '@tanstack/react-query';

import { getDataToWriteReviewApi } from '@/apis/review';
import { REVIEW_QUERY_KEYS } from '@/constants';
import { ReviewWritingFrom } from '@/types';

interface UseGetDataToWriteProps {
reviewRequestCode: string | undefined;
}
const useGetDataToWrite = ({ reviewRequestCode }: UseGetDataToWriteProps) => {
const fetchReviewFormData = async (reviewRequestCode: string | undefined) => {
if (!reviewRequestCode) throw new Error('reviewRequestCode가 undefined에요.');

const result = await getDataToWriteReviewApi(reviewRequestCode);
return result;
};

const result = useSuspenseQuery<ReviewWritingFrom>({
queryKey: [REVIEW_QUERY_KEYS.writingReviewInfo, reviewRequestCode],
queryFn: () => fetchReviewFormData(reviewRequestCode),
});

return result;
};

export default useGetDataToWrite;
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import { renderHook, waitFor } from '@testing-library/react';

import { REVIEW_REQUEST_CODE } from '@/mocks/mockData';
import QueryClientWrapper from '@/queryTestSetup/QueryClientWrapper';

import useGetDataToWrite from '.';
import useGetReviewFormData from '.';

describe('리뷰 작성을 위한 데이터 요청 테스트', () => {
test('성공적으로 데이터를 가져온다.', async () => {
const REVIEW_REQUEST_CODE = 'ABCD1234';

const { result } = renderHook(() => useGetDataToWrite({ reviewRequestCode: REVIEW_REQUEST_CODE }), {
const { result } = renderHook(() => useGetReviewFormData({ reviewRequestCode: REVIEW_REQUEST_CODE }), {
wrapper: QueryClientWrapper,
});

await waitFor(() => {
expect(result.current.isSuccess).toBe(true);
});
expect(result.current.data).toBeDefined();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@ import { useMutation, useQueryClient } from '@tanstack/react-query';

import { postReviewApi } from '@/apis/review';
import { REVIEW_QUERY_KEYS } from '@/constants';
import { ReviewData } from '@/types';
import { ReviewWritingFormResult } from '@/types';

interface PostReviewArgs {
reviewData: ReviewData;
interface UseMutateReviewProps {
openErrorModal: (message: string) => void;
}

const useMutateReview = () => {
const useMutateReview = ({ openErrorModal }: UseMutateReviewProps) => {
const queryClient = useQueryClient();

const reviewMutation = useMutation({
mutationFn: ({ reviewData }: PostReviewArgs) => postReviewApi({ reviewData }),
mutationFn: (formResult: ReviewWritingFormResult) => postReviewApi(formResult),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: [REVIEW_QUERY_KEYS.postReview] });
},
onError: () => {
console.error('리뷰 제출에 실패했어요.');
openErrorModal('리뷰 제출에 실패했어요');
},
});

const postReview = ({ reviewData }: PostReviewArgs) => {
reviewMutation.mutate({ reviewData });
const postReview = (formResult: ReviewWritingFormResult) => {
reviewMutation.mutate(formResult);
};

return { reviewMutation, postReview };
Expand Down
Loading