Skip to content

Commit a28ccf6

Browse files
authored
Merge pull request #95 from Stack-Knowledge/feature/missionCarousel
[Client] missionCarousel Responsive
2 parents 5787942 + aeea512 commit a28ccf6

File tree

8 files changed

+59
-10
lines changed

8 files changed

+59
-10
lines changed

packages/common/src/assets/svg/VectorIcon.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ interface VectorIconProps {
55
const VectorIcon: React.FC<VectorIconProps> = ({ direction }) => (
66
<svg
77
xmlns='http://www.w3.org/2000/svg'
8-
width='80'
9-
height='80'
8+
width='5rem'
9+
height='5rem'
1010
viewBox='0 0 80 80'
1111
fill='none'
1212
transform={`${direction === 'right' ? 'rotate(-180)' : ''}`}

packages/common/src/hooks/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { default as useWindowResizeEffect } from './useWindowResizeEffect';

packages/common/src/hooks/useWindowResizeEffect.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
'use client';
2+
13
import { useEffect } from 'react';
24

3-
import { useWidthState } from 'stores';
5+
import { useWidthState } from 'common/stores';
46

57
const useWindowResizeEffect = () => {
6-
const { setWidth } = useWidthState();
8+
const { width, setWidth } = useWidthState();
79

810
const handleResize = () => {
911
setWidth(window.innerWidth);
@@ -16,6 +18,8 @@ const useWindowResizeEffect = () => {
1618
window.removeEventListener('resize', handleResize);
1719
};
1820
}, []);
21+
22+
return width;
1923
};
2024

2125
export default useWindowResizeEffect;

packages/common/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,5 @@ export * from './styles';
33
export * from './utils';
44
export * from './assets';
55
export * from './PageContainer';
6+
export * from './hooks';
7+
export * from './stores';

projects/client/src/PageContainer/MissionListPage/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ const MissionListPage = () => {
1010

1111
return (
1212
<S.PageWrapper>
13-
<S.ScoringText>문제</S.ScoringText>
13+
<S.ScoringTextContainer>
14+
<S.ScoringText>문제</S.ScoringText>
15+
</S.ScoringTextContainer>
1416
{data?.length > 0 ? <MissionCarousel /> : <h1>문제가 없습니다...</h1>}
1517
</S.PageWrapper>
1618
);

projects/client/src/PageContainer/MissionListPage/style.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@ export const PageWrapper = styled.div`
99
padding-bottom: 10.625rem;
1010
`;
1111

12+
export const ScoringTextContainer = styled.div`
13+
@media ${({ theme }) => theme.breakPoint[1024]} {
14+
width: calc(100vw - 20rem);
15+
}
16+
@media (max-width: 750px) {
17+
width: calc(100vw - 18.5rem);
18+
}
19+
`;
20+
1221
export const ScoringText = styled.h2`
1322
${({ theme }) => theme.typo.h2}
1423
color: ${({ theme }) => theme.color.black};

projects/client/src/components/MissionCarousel/index.tsx

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,55 @@ import { useEffect, useState } from 'react';
1313

1414
import { MissionListItemType } from 'types';
1515

16+
import { useWindowResizeEffect } from 'common';
17+
1618
const MissionCarousel = () => {
1719
const [pageIndex, setPageIndex] = useState<number>(0);
1820
const [missionList, setMissionList] = useState<MissionListItemType[][]>();
1921

22+
const width = useWindowResizeEffect();
23+
2024
const { data } = useGetMissionList();
2125
const { push } = useRouter();
2226

27+
const [count, setCount] = useState<number>(10);
28+
2329
const onCardClick = (missionId: string) => {
2430
push(`/mission/resolve/${missionId}`);
2531
};
2632

33+
const widthHandle = () => {
34+
if (852 <= width && width <= 1920) {
35+
setCount(10);
36+
} else if (610 <= width && width < 852) {
37+
setCount(8);
38+
} else if (525 <= width && width < 610) {
39+
setCount(6);
40+
} else if (281 <= width && width < 525) {
41+
setCount(4);
42+
} else {
43+
setCount(2);
44+
}
45+
};
46+
47+
useEffect(() => {
48+
widthHandle();
49+
}, [width]);
50+
2751
useEffect(() => {
2852
const newMissionList: MissionListItemType[][] = [];
2953
let temp: MissionListItemType[] = [];
3054
data?.forEach((item, index) => {
3155
temp.push(item);
32-
if ((index + 1) % 10 === 0) {
56+
if ((index + 1) % count === 0) {
3357
newMissionList.push(temp);
3458
temp = [];
3559
}
3660
});
3761
if (data)
3862
newMissionList.push(data.slice(newMissionList.length * 10, data.length));
3963
setMissionList(newMissionList);
40-
}, [data]);
64+
}, [data, width]);
4165

4266
const moveLeft = () => {
4367
if (pageIndex > 0) setPageIndex((prev) => prev - 1);
@@ -59,7 +83,7 @@ const MissionCarousel = () => {
5983
<S.PointerWrapper onClick={moveLeft}>
6084
<VectorIcon direction='left' />
6185
</S.PointerWrapper>
62-
<S.ContentWrapper>
86+
<S.ContentWrapper taskCard={count / 2}>
6387
{missionList[pageIndex]?.map((item, index) => (
6488
<TaskCard
6589
onClick={() => onCardClick(item.id)}

projects/client/src/components/MissionCarousel/style.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,18 @@ export const CarouselWrapper = styled.div`
66
gap: 3rem;
77
`;
88

9-
export const ContentWrapper = styled.div`
9+
export const ContentWrapper = styled.div<{ taskCard?: number }>`
1010
display: grid;
11-
grid-template-columns: repeat(5, 1fr);
11+
grid-template-columns: repeat(${(props) => props.taskCard}, 1fr);
1212
grid-template-rows: repeat(2, 1fr);
1313
gap: 4.125rem 3rem;
14+
15+
@media ${({ theme }) => theme.breakPoint[1024]} {
16+
width: calc(100vw - 20rem);
17+
}
18+
@media (max-width: 750px) {
19+
width: calc(100vw - 18.5rem);
20+
}
1421
`;
1522

1623
export const PointerWrapper = styled.div`

0 commit comments

Comments
 (0)