Skip to content

Commit a4ceb6a

Browse files
authored
Merge pull request #288 from Bamdoliro/develop
develop 머지~
2 parents bf5a6a0 + 86e493e commit a4ceb6a

File tree

15 files changed

+185
-80
lines changed

15 files changed

+185
-80
lines changed

apps/user/.eslintrc.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
module.exports = {
22
root: true,
33
// This tells ESLint to load the config from the package `eslint-config-custom`
4-
extends: ['@maru/eslint/common', '@maru/eslint/query', 'plugin:storybook/recommended'],
4+
extends: ['@maru/eslint/common', '@maru/eslint/query'],
5+
settings: {
6+
next: {
7+
rootDir: ['apps/*/'],
8+
},
9+
},
510
};

apps/user/next.config.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
/** @type {import('next').NextConfig} */
2-
const nextConfig = {
2+
module.exports = {
33
transpilePackages: ['@maru/ui'],
44
};
5-
6-
module.exports = nextConfig;

apps/user/src/apis/instance/instance.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,16 @@ maru.interceptors.response.use(
2323
return response;
2424
},
2525
async (error) => {
26-
const {
27-
status,
28-
data: { message, code },
29-
} = error.response;
30-
if (message) {
31-
if (status === 401 && code === 'EXPIRED_TOKEN') {
32-
refreshToken();
26+
if (error.response) {
27+
const {
28+
status,
29+
data: { message, code },
30+
} = error.response;
31+
32+
if (message) {
33+
if (status === 401 && code === 'EXPIRED_TOKEN') {
34+
refreshToken();
35+
}
3336
}
3437
}
3538
return Promise.reject(error);

apps/user/src/app/[...not_found]/page.tsx

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 59 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,44 @@
11
import { CompleteAlaram } from '@/components/form';
22
import { AppLayout } from '@/layouts';
3-
import { useInterval } from '@maru/hooks';
43
import { IconCheckCircle } from '@maru/icon';
54
import { color } from '@maru/theme';
6-
import { Row, Button, Text, Column } from '@maru/ui';
5+
import { Button, Column, Row, Text } from '@maru/ui';
76
import { flex } from '@maru/utils';
8-
import { useState } from 'react';
97
import styled from 'styled-components';
108
import { useCTAButton } from './초안제출완료.hooks';
119

1210
const 초안제출완료 = () => {
13-
const [isShowCompleteAlaram, setIsShowCompleteAlaram] = useState(true);
1411
const { handleGoMainPageButtonClick, handleGo최종제출PageButtonClick } = useCTAButton();
1512

16-
setTimeout(() => {
17-
setIsShowCompleteAlaram(false);
18-
}, 1000);
19-
2013
return (
2114
<AppLayout header>
22-
{isShowCompleteAlaram ? (
23-
<CompleteAlaram
24-
isComplete={isShowCompleteAlaram}
25-
completeText="원서 초안 제출 완료"
26-
/>
27-
) : (
28-
<Styled초안제출완료>
29-
<Row gap={8} alignItems="center">
30-
<IconCheckCircle width={64} height={64} />
31-
<Text fontType="H1" color={color.gray900}>
32-
원서 초안 제출 완료
33-
</Text>
34-
</Row>
35-
<Column gap={12}>
36-
<Text fontType="p1" color={color.gray900}>
37-
원서 초안을 제출 완료하셨습니다.
38-
</Text>
39-
<Text fontType="H4" color={color.red}>
40-
원서 초안과 기타 제출서류를 함께 제출해야 최종적으로 원서 제출이
41-
완료됩니다.
42-
</Text>
43-
</Column>
44-
<Row gap={16}>
45-
<Button
46-
onClick={handleGoMainPageButtonClick}
47-
option="SECONDARY"
48-
size="LARGE">
49-
홈으로 돌아가기
50-
</Button>
51-
<Button onClick={handleGo최종제출PageButtonClick} size="LARGE">
52-
최종 제출 페이지로 이동하기
53-
</Button>
54-
</Row>
55-
</Styled초안제출완료>
56-
)}
15+
<CompleteAlarmBox>
16+
<CompleteAlaram isComplete completeText="원서 초안 제출 완료" />
17+
</CompleteAlarmBox>
18+
<Styled초안제출완료>
19+
<Row gap={8} alignItems="center">
20+
<IconCheckCircle width={64} height={64} />
21+
<Text fontType="H1" color={color.gray900}>
22+
원서 초안 제출 완료
23+
</Text>
24+
</Row>
25+
<Column gap={12}>
26+
<Text fontType="p1" color={color.gray900}>
27+
원서 초안을 제출 완료하셨습니다.
28+
</Text>
29+
<Text fontType="H4" color={color.red}>
30+
원서 초안과 기타 제출서류를 함께 제출해야 최종적으로 원서 제출이 완료됩니다.
31+
</Text>
32+
</Column>
33+
<Row gap={16}>
34+
<Button onClick={handleGoMainPageButtonClick} option="SECONDARY" size="LARGE">
35+
홈으로 돌아가기
36+
</Button>
37+
<Button onClick={handleGo최종제출PageButtonClick} size="LARGE">
38+
최종 제출 페이지로 이동하기
39+
</Button>
40+
</Row>
41+
</Styled초안제출완료>
5742
</AppLayout>
5843
);
5944
};
@@ -66,4 +51,35 @@ const Styled초안제출완료 = styled.div`
6651
max-width: 800px;
6752
height: 100%;
6853
margin: 0 auto;
54+
55+
opacity: 0;
56+
animation: show 1.2s 2s cubic-bezier(0.22, 0.61, 0.36, 1) forwards;
57+
58+
@keyframes show {
59+
from {
60+
transform: translateY(200px);
61+
}
62+
to {
63+
transform: translateY(0);
64+
opacity: 100;
65+
}
66+
}
67+
`;
68+
69+
const CompleteAlarmBox = styled.div`
70+
position: absolute;
71+
width: 100%;
72+
73+
animation: hide 1.2s 1s cubic-bezier(0.65, 0.05, 0.36, 1) forwards;
74+
75+
@keyframes hide {
76+
from {
77+
transform: translateY(0);
78+
}
79+
to {
80+
transform: translateY(-300px);
81+
opacity: 0;
82+
display: none;
83+
}
84+
}
6985
`;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { ROUTES } from '@/constants/common/constant';
2+
import { useRouter } from 'next/navigation';
3+
4+
export const useCTAButton = () => {
5+
const router = useRouter();
6+
7+
const handleGoMainPageButtonClick = () => {
8+
router.push(ROUTES.MAIN);
9+
};
10+
11+
return { handleGoMainPageButtonClick };
12+
};
Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,85 @@
11
import { CompleteAlaram } from '@/components/form';
22
import { AppLayout } from '@/layouts';
3+
import { IconCheckCircle } from '@maru/icon';
4+
import { color } from '@maru/theme';
5+
import { Button, Column, Row, Text } from '@maru/ui';
6+
import { flex } from '@maru/utils';
7+
import { useRouter } from 'next/navigation';
8+
import { styled } from 'styled-components';
9+
import { useCTAButton } from './최종제출완료.hooks';
310

411
const 최종제출완료 = () => {
12+
const router = useRouter();
13+
const { handleGoMainPageButtonClick } = useCTAButton();
14+
515
return (
6-
<AppLayout header>
7-
<CompleteAlaram isComplete completeText="원서 최종 제출 완료" />
16+
<AppLayout header footer>
17+
<CompleteAlarmBox>
18+
<CompleteAlaram isComplete completeText="원서 최종 제출 완료" />
19+
</CompleteAlarmBox>
20+
<Styled최종제출완료>
21+
<Row gap={8} alignItems="center" justifyContent="center">
22+
<IconCheckCircle width={64} height={64} />
23+
<Text fontType="H1" color={color.gray900}>
24+
원서 최종 제출 완료
25+
</Text>
26+
</Row>
27+
<Column gap={71} alignItems="center">
28+
<Column gap={27} alignItems="center">
29+
<Text fontType="H2" color={color.gray900}>
30+
부산소프트웨어마이스터고에 지원해주셔서 감사합니다.
31+
</Text>
32+
<Text fontType="p2" color={color.gray900} textAlign="center">
33+
신준서 님, 부산소프트웨어마이스터고에 지원해주셔서 대단히 감사드립니다.
34+
<br />
35+
1차 합격자는 11월 3일에 발표됩니다.
36+
<br />
37+
신준서 님의 1차 합격을 기원합니다.
38+
</Text>
39+
</Column>
40+
<Button onClick={handleGoMainPageButtonClick} size="SMALL">
41+
홈으로 돌아가기
42+
</Button>
43+
</Column>
44+
</Styled최종제출완료>
845
</AppLayout>
946
);
1047
};
1148

1249
export default 최종제출완료;
50+
51+
const Styled최종제출완료 = styled.div`
52+
${flex({ flexDirection: 'column' })}
53+
gap: 70px;
54+
55+
opacity: 0;
56+
animation: show 1.2s 2s cubic-bezier(0.22, 0.61, 0.36, 1) forwards;
57+
58+
@keyframes show {
59+
from {
60+
transform: translateY(200px);
61+
}
62+
to {
63+
transform: translateY(0);
64+
opacity: 100;
65+
}
66+
}
67+
`;
68+
69+
const CompleteAlarmBox = styled.div`
70+
position: absolute;
71+
width: 100%;
72+
73+
animation: hide 1.2s 1s cubic-bezier(0.65, 0.05, 0.36, 1) forwards;
74+
75+
@keyframes hide {
76+
from {
77+
transform: translateY(0);
78+
}
79+
to {
80+
transform: translateY(-300px);
81+
opacity: 0;
82+
display: none;
83+
}
84+
}
85+
`;

apps/user/src/components/common/Header/Header.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import Image from 'next/image';
77
import { usePathname, useRouter } from 'next/navigation';
88
import styled from 'styled-components';
99
import Profile from './Profile/Profile';
10-
1110
const NAVIGATION_DATA = [
1211
{
1312
name: '홈',

apps/user/src/components/common/Wrappers/AuthWrapper/AuthWrapper.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
'use client';
22

3-
import { ROUTES } from '@/constants/common/constant';
4-
import { useUser } from '@/hooks';
5-
import { Column, Confirm, Text } from '@maru/ui';
3+
import { Storage } from '@/apis/storage/storage';
4+
import { ROUTES, TOKEN } from '@/constants/common/constant';
65
import { color } from '@maru/theme';
6+
import { Column, Confirm, Text } from '@maru/ui';
77
import { useOverlay } from '@toss/use-overlay';
88
import { usePathname, useRouter } from 'next/navigation';
99
import { ReactNode, useEffect } from 'react';
@@ -19,10 +19,11 @@ const AuthWrapper = ({ children }: PropsType) => {
1919
const router = useRouter();
2020
const pathName = usePathname();
2121
const overlay = useOverlay();
22-
const { isLoggedIn } = useUser();
22+
23+
const token = Storage.getItem(TOKEN.ACCESS);
2324

2425
useEffect(() => {
25-
if (NOT_LOGGEDIN_PRIVATE_PAGE.includes(pathName) && !isLoggedIn) {
26+
if (NOT_LOGGEDIN_PRIVATE_PAGE.includes(pathName) && !token) {
2627
router.push(ROUTES.MAIN);
2728
overlay.open(({ isOpen, close }) => (
2829
<Confirm
@@ -49,12 +50,12 @@ const AuthWrapper = ({ children }: PropsType) => {
4950
));
5051
}
5152

52-
if (isLoggedIn) {
53+
if (token) {
5354
if (LOGGEDIN_PRIVATE_PAGE.includes(pathName)) {
5455
router.push(ROUTES.MAIN);
5556
}
5657
}
57-
}, [isLoggedIn, pathName]);
58+
}, [token, pathName]);
5859

5960
return <>{children}</>;
6061
};

apps/user/src/hooks/useUser.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import { useEffect } from 'react';
44

55
const useUser = () => {
66
const [user, setUser] = useUserStore();
7-
const { data: userData, isLoading } = useUserQuery();
7+
const { data: userData } = useUserQuery();
88

99
useEffect(() => {
1010
if (userData) setUser(userData);
1111
}, [setUser, userData]);
1212

13-
return { userData: user, isLoggedIn: isLoading || !!userData };
13+
return { userData: user, isLoggedIn: !!userData };
1414
};
1515

1616
export default useUser;

0 commit comments

Comments
 (0)