Skip to content

Commit caed08c

Browse files
authored
리뷰페이지 구현 (#147)
* feat: ToggleButton 수정 * 리뷰페이지 전용 토글 버튼 생성 * chore: 리뷰페이지 폴더 및 파일명 수정 * ReviewPage -> MannerScoreReviewPage * chore: 라우터 수정 * suspense 사용 * 컴포넌트 이름 변경 * refactor: api,msw,type 변경 * 백엔드 변경사항에 맞춰 수정
1 parent e26a97b commit caed08c

File tree

11 files changed

+65
-78
lines changed

11 files changed

+65
-78
lines changed

src/hooks/mutations/useMannerScoreReviewPatchMutation.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const useMannerScoreReviewPatchMutation = ({
1313
gameId: Game['id'];
1414
}) => {
1515
return useMutation({
16-
mutationKey: ['patch-manner-score-review', gameId],
16+
mutationKey: ['patch-manner-score-review', gameId, JSON.stringify(payload)],
1717
mutationFn: () => patchMannerScoreReview({ payload, gameId }),
1818
});
1919
};

src/mocks/handlers/game.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -151,15 +151,10 @@ const mockPatchGameMannerScoreReview = http.patch<
151151
}
152152

153153
const {
154-
data: [{ memberId, mannerScore }],
154+
data: { mannerScoreReviews },
155155
} = await request.json();
156156

157-
const reviews = [
158-
{
159-
memberId,
160-
mannerScore,
161-
},
162-
];
157+
const reviews = [mannerScoreReviews];
163158

164159
return HttpResponse.json(reviews, { status: 200 });
165160
});

src/pages/ReviewPage/ReviewPage.style.ts renamed to src/pages/MannerScoreReviewPage/MannerScoreReviewPage.style.ts

File renamed without changes.

src/pages/ReviewPage/ReviewPage.tsx renamed to src/pages/MannerScoreReviewPage/MannerScoreReviewPage.tsx

Lines changed: 50 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,13 @@ import { Button } from '@components/shared/Button';
1010
import { Flex } from '@components/shared/Flex';
1111
import { Text } from '@components/shared/Text';
1212

13+
import { useMannerScoreReviewPatchMutation } from '@hooks/mutations/useMannerScoreReviewPatchMutation';
14+
import { useGameDetailQuery } from '@hooks/queries/useGameDetailQuery';
15+
1316
import { theme } from '@styles/theme';
1417

18+
import { PATH_NAME } from '@consts/pathName';
19+
1520
import leftArrowIcon from '@assets/leftArrow.svg';
1621
import rightArrowIcon from '@assets/rightArrow.svg';
1722

@@ -22,35 +27,57 @@ import {
2227
MemberListContainer,
2328
ReviewPageContainer,
2429
TextWrapper,
25-
} from './ReviewPage.style';
30+
} from './MannerScoreReviewPage.style';
2631
import { ToggleButton } from './ToggleButton';
2732

28-
export const ReviewPage = () => {
33+
export const MannerScoreReviewPage = () => {
2934
const navigate = useNavigate();
35+
const gameId = Number(location.pathname.split('/')[2]);
36+
const { data } = useGameDetailQuery(gameId);
37+
const teammateListInfo = data.members;
3038

3139
const [currentSelectedMemberIndex, setCurrentSelectedMemberIndex] =
3240
useState(0);
41+
const [isOpen, setIsOpen] = useState(false);
42+
const [teammateList, setTeammateList] = useState<
43+
{
44+
memberId: number;
45+
mannerScore: -1 | 0 | 1;
46+
}[]
47+
>(
48+
data.members.map(({ id }) => {
49+
return {
50+
memberId: id,
51+
mannerScore: 0,
52+
};
53+
})
54+
);
55+
56+
const { mutate } = useMannerScoreReviewPatchMutation({
57+
payload: { mannerScoreReviews: teammateList },
58+
gameId: gameId,
59+
});
3360

34-
const [toggleState, setToggleState] = useState('');
3561
const handleToggle = (value: string) => {
36-
setToggleState(value);
62+
teammateList.splice(currentSelectedMemberIndex, 1, {
63+
memberId: teammateList[currentSelectedMemberIndex].memberId,
64+
mannerScore: value === '좋았어요' ? 1 : -1,
65+
});
66+
setTeammateList([...teammateList]);
3767
};
3868

39-
const [isOpen, setIsOpen] = useState(false);
40-
4169
const handleLeftArrowIconClick = () => {
4270
if (currentSelectedMemberIndex > 0) {
4371
setCurrentSelectedMemberIndex(currentSelectedMemberIndex - 1);
44-
handleToggle('');
4572
}
4673
};
4774

4875
const handleRightArrowIconClick = () => {
4976
if (currentSelectedMemberIndex < teammateList.length - 1) {
5077
setCurrentSelectedMemberIndex(currentSelectedMemberIndex + 1);
51-
handleToggle('');
5278
}
5379
};
80+
5481
return (
5582
<ReviewPageContainer>
5683
<Header isRightContainer={false} />
@@ -61,18 +88,17 @@ export const ReviewPage = () => {
6188
</TextWrapper>
6289
<MemberListContainer transform={-currentSelectedMemberIndex * 60}>
6390
<Flex direction="row" gap={10}>
64-
{teammateList.map(({ imgUrl, name }, index) => (
91+
{teammateListInfo.map(({ profileImageUrl, nickname }, index) => (
6592
<Flex
6693
key={index}
6794
direction="column"
6895
justify="center"
6996
onClick={() => {
7097
setCurrentSelectedMemberIndex(index);
71-
handleToggle('');
7298
}}
7399
>
74100
<Avatar
75-
src={imgUrl}
101+
src={profileImageUrl}
76102
size={50}
77103
border={
78104
index === currentSelectedMemberIndex
@@ -82,7 +108,7 @@ export const ReviewPage = () => {
82108
radius={'5px'}
83109
/>
84110
<Text size={'0.5rem'} weight={300} ellipsis={1}>
85-
{name}
111+
{nickname}
86112
</Text>
87113
</Flex>
88114
))}
@@ -93,7 +119,6 @@ export const ReviewPage = () => {
93119
<BackwardWrapper>
94120
<BackwardIcon
95121
onClick={() => {
96-
console.log(currentSelectedMemberIndex);
97122
handleLeftArrowIconClick();
98123
}}
99124
>
@@ -102,13 +127,13 @@ export const ReviewPage = () => {
102127
</BackwardWrapper>
103128
<Flex direction="column" gap={10} align="center">
104129
<Avatar
105-
src={teammateList[currentSelectedMemberIndex].imgUrl}
130+
src={teammateListInfo[currentSelectedMemberIndex].profileImageUrl}
106131
size={100}
107132
border={`1px solid ${theme.PALETTE.GRAY_400}`}
108133
radius={'5px'}
109134
/>
110135
<Text size={'1.5rem'} weight={500}>
111-
{teammateList[currentSelectedMemberIndex].name}
136+
{teammateListInfo[currentSelectedMemberIndex].nickname}
112137
</Text>
113138
<Text
114139
size={'1rem'}
@@ -122,7 +147,6 @@ export const ReviewPage = () => {
122147
<BackwardWrapper>
123148
<BackwardIcon
124149
onClick={() => {
125-
console.log(currentSelectedMemberIndex);
126150
handleRightArrowIconClick();
127151
}}
128152
>
@@ -142,7 +166,9 @@ export const ReviewPage = () => {
142166
value="좋았어요"
143167
height={'3.125rem'}
144168
fontSize={theme.FONT_SIZE.LG}
145-
isActive={toggleState === '좋았어요'}
169+
isActive={
170+
teammateList[currentSelectedMemberIndex].mannerScore === 1
171+
}
146172
onToggle={(value) => {
147173
handleToggle(value);
148174
}}
@@ -151,7 +177,9 @@ export const ReviewPage = () => {
151177
value="아쉬워요"
152178
height={'3.125rem'}
153179
fontSize={theme.FONT_SIZE.LG}
154-
isActive={toggleState === '아쉬워요'}
180+
isActive={
181+
teammateList[currentSelectedMemberIndex].mannerScore === -1
182+
}
155183
onToggle={(value) => {
156184
handleToggle(value);
157185
}}
@@ -162,7 +190,10 @@ export const ReviewPage = () => {
162190
{...theme.BUTTON_PROPS.LARGE_RED_BUTTON_PROPS}
163191
onClick={() => {
164192
if (confirm('리뷰를 제출하시겠습니까?')) {
165-
navigate('/');
193+
mutate();
194+
navigate(PATH_NAME.GET_GAMES_PATH(`${gameId}`), {
195+
replace: true,
196+
});
166197
}
167198
}}
168199
>
@@ -177,21 +208,3 @@ export const ReviewPage = () => {
177208
</ReviewPageContainer>
178209
);
179210
};
180-
181-
const teammateList = [
182-
{ imgUrl: 'https://picsum.photos/id/10/500', name: 'pickple user1' },
183-
{ imgUrl: 'https://picsum.photos/id/20/500', name: 'pickple user2' },
184-
{ imgUrl: 'https://picsum.photos/id/30/500', name: 'pickple user3' },
185-
{ imgUrl: 'https://picsum.photos/id/40/500', name: 'pickple user4' },
186-
{ imgUrl: 'https://picsum.photos/id/50/500', name: 'pickple user5' },
187-
{ imgUrl: 'https://picsum.photos/id/60/500', name: 'pickple user6' },
188-
{ imgUrl: 'https://picsum.photos/id/70/500', name: 'pickple user7' },
189-
{ imgUrl: 'https://picsum.photos/id/80/500', name: 'pickple user8' },
190-
{ imgUrl: 'https://picsum.photos/id/90/500', name: 'pickple user9' },
191-
{ imgUrl: 'https://picsum.photos/id/100/500', name: 'pickple user10' },
192-
{ imgUrl: 'https://picsum.photos/id/110/500', name: 'pickple user11' },
193-
{ imgUrl: 'https://picsum.photos/id/120/500', name: 'pickple user12' },
194-
{ imgUrl: 'https://picsum.photos/id/130/500', name: 'pickple user13' },
195-
{ imgUrl: 'https://picsum.photos/id/140/500', name: 'pickple user14' },
196-
{ imgUrl: 'https://picsum.photos/id/141/500', name: 'pickple user15' },
197-
];
File renamed without changes.
File renamed without changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { MannerScoreReviewPage } from './MannerScoreReviewPage';

src/pages/ReviewPage/ToggleButtons.hook.ts

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/pages/ReviewPage/index.ts

Lines changed: 0 additions & 1 deletion
This file was deleted.

src/routes/router.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import { GamesParticipatePage } from '@pages/GamesParticipatePage';
1212
import { Layout } from '@pages/Layout';
1313
import { LoginPage } from '@pages/LoginPage';
1414
import { MainPage } from '@pages/MainPage';
15+
import { MannerScoreReviewPage } from '@pages/MannerScoreReviewPage';
1516
import { ProfilePage } from '@pages/ProfilePage';
1617
import { RegisterPage } from '@pages/RegisterPage';
17-
import { ReviewPage } from '@pages/ReviewPage';
1818

1919
export const router = createBrowserRouter([
2020
{
@@ -75,7 +75,11 @@ export const router = createBrowserRouter([
7575
},
7676
{
7777
path: 'games/:id/review',
78-
element: <ReviewPage />,
78+
element: (
79+
<Suspense fallback={null}>
80+
<MannerScoreReviewPage />
81+
</Suspense>
82+
),
7983
},
8084
{
8185
path: 'crews/recommend',

0 commit comments

Comments
 (0)