Skip to content

Commit b821d9d

Browse files
committed
feat: 추천 크루 목록 페이지 구현
1 parent 1b163e3 commit b821d9d

File tree

4 files changed

+91
-1
lines changed

4 files changed

+91
-1
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import styled from '@emotion/styled';
2+
3+
export const PageWrapper = styled.div`
4+
${({ theme }) => theme.STYLES.LAYOUT}
5+
background-color: ${({ theme }) => theme.PALETTE.GRAY_100};
6+
height: 100dvh;
7+
`;
8+
9+
export const PageContent = styled.div`
10+
padding: 10px 0 20px 0;
11+
display: flex;
12+
flex-direction: column;
13+
gap: 16px;
14+
`;
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { useNavigate } from 'react-router-dom';
2+
3+
import { CrewItem } from '@components/CrewItem';
4+
import { Header } from '@components/Header';
5+
import { Text } from '@components/shared/Text';
6+
7+
import { useNearCrewListQuery } from '@hooks/queries/useNearCrewListQuery';
8+
import { useHeaderTitle } from '@hooks/useHeaderTitle';
9+
import { useInfiniteScroll } from '@hooks/useInfiniteScroll';
10+
11+
import { useLoginInfoStore } from '@stores/loginInfo.store';
12+
13+
import { PATH_NAME } from '@consts/pathName';
14+
15+
import { PageContent, PageWrapper } from './CrewsRecommendPage.styles';
16+
17+
const DEFAULT_ADDRESS_DEPTHS = {
18+
addressDepth1: '서울시',
19+
addressDepth2: '강남구',
20+
} as const;
21+
22+
export const CrewsRecommendPage = () => {
23+
const loginInfo = useLoginInfoStore((state) => state.loginInfo);
24+
25+
const { nearCrews, fetchNextPage } = useNearCrewListQuery(
26+
loginInfo && loginInfo.addressDepth1 !== null
27+
? {
28+
addressDepth1: loginInfo.addressDepth1,
29+
addressDepth2: loginInfo.addressDepth2,
30+
}
31+
: DEFAULT_ADDRESS_DEPTHS
32+
);
33+
34+
const { entryRef, showHeaderTitle } = useHeaderTitle<HTMLDivElement>();
35+
const lastElementRef = useInfiniteScroll<HTMLDivElement>(fetchNextPage);
36+
const navigate = useNavigate();
37+
38+
return (
39+
<PageWrapper>
40+
<Header title={showHeaderTitle ? '추천 크루' : ''} />
41+
<PageContent>
42+
<div ref={entryRef}>
43+
<Text size={20} weight={700}>
44+
추천 크루
45+
</Text>
46+
</div>
47+
{nearCrews.map((crew) => {
48+
const membersProfileImageUrls = crew.members.map(
49+
(member) => member.profileImageUrl
50+
);
51+
return (
52+
<CrewItem
53+
key={crew.id}
54+
name={crew.name}
55+
address={`${crew.addressDepth1} ${crew.addressDepth2}`}
56+
imgSrc={crew.profileImageUrl}
57+
membersProfileImageUrls={membersProfileImageUrls}
58+
memberCount={crew.memberCount}
59+
maxMemberCount={crew.maxMemberCount}
60+
onClick={() =>
61+
navigate(PATH_NAME.GET_CREWS_PATH(String(crew.id)))
62+
}
63+
/>
64+
);
65+
})}
66+
<div ref={lastElementRef}></div>
67+
</PageContent>
68+
</PageWrapper>
69+
);
70+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './CrewsRecommendPage';

src/routes/router.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { createBrowserRouter } from 'react-router-dom';
44
import { AllServicesPage } from '@pages/AllServicesPage';
55
import { CreateGamePage } from '@pages/CreateGamePage';
66
import { CreatePage } from '@pages/CreatePage';
7+
import { CrewsRecommendPage } from '@pages/CrewsRecommendPage';
78
import { GamesDetailPage } from '@pages/GamesDetailPage';
89
import { GamesHostPage } from '@pages/GamesHostPage';
910
import { GamesManagePage } from '@pages/GamesManagePage';
@@ -79,7 +80,11 @@ export const router = createBrowserRouter([
7980
},
8081
{
8182
path: 'crews/recommend',
82-
element: <h3>crews/recommend</h3>,
83+
element: (
84+
<Suspense fallback={null}>
85+
<CrewsRecommendPage />
86+
</Suspense>
87+
),
8388
},
8489
{
8590
path: 'crews/chief',

0 commit comments

Comments
 (0)