Skip to content

Commit 9d14a50

Browse files
committed
feat: 로그인시 이전 페이지로 이동하도록 설정
1 parent 2b7ff1f commit 9d14a50

File tree

5 files changed

+73
-11
lines changed

5 files changed

+73
-11
lines changed

src/app/routes/callback.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ import { useEffect } from 'react';
66
import type { UserInfoResponse } from '~/entities/user/types/user.type';
77
import ApiClient from '~/shared/api/httpClient';
88
import { useUserId } from '../provider/UserInfoProvider';
9+
import { getSession } from '../sessions.server';
910

1011
export async function loader({ request }: LoaderFunctionArgs) {
1112
const rawCookie = request.headers.get('Cookie') ?? '';
13+
14+
const session = await getSession(rawCookie);
15+
const referer = session.get('referer') || '/';
16+
1217
const cookies = cookie.parse(rawCookie);
1318
const isAccessTokenExists = !!cookies.access_token;
1419

1520
if (!isAccessTokenExists) {
16-
return redirect('/trade/BTC/login');
21+
return redirect(referer);
1722
}
1823

1924
const response = await ApiClient.get<UserInfoResponse>('api/userinfo', {
@@ -24,18 +29,19 @@ export async function loader({ request }: LoaderFunctionArgs) {
2429

2530
const { data } = await response.json();
2631

27-
return data.userId;
32+
return { userId: data.userId, referer: referer };
2833
}
2934

3035
export default function CallbackRoutes({ loaderData }: Route.ComponentProps) {
36+
const { userId, referer } = loaderData;
3137
const navigate = useNavigate();
32-
const { userId, setUserId } = useUserId();
33-
setUserId(loaderData);
38+
const { setUserId } = useUserId();
39+
setUserId(userId);
3440

3541
useEffect(() => {
3642
if (!userId) return;
37-
navigate('/trade/BTC');
38-
}, [userId, navigate]);
43+
navigate(referer);
44+
}, [userId, referer, navigate]);
3945

4046
return null;
4147
}

src/app/routes/login.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,29 @@
1+
import { data } from 'react-router';
12
import { LoginModal } from '~/widgets/auth';
3+
import { commitSession, getSession } from '../sessions.server';
4+
import type { Route } from './+types/login';
25

3-
export default function LoginRouteComponent() {
4-
return <LoginModal key="login-modal" />;
6+
export async function loader({ request }: Route.LoaderArgs) {
7+
const { searchParams } = new URL(request.url);
8+
const session = await getSession(request.headers.get('Cookie'));
9+
10+
const referer = searchParams.get('referer') || '/';
11+
session.set('referer', referer);
12+
13+
return data(
14+
{ referer },
15+
{
16+
headers: {
17+
'set-cookie': await commitSession(session),
18+
},
19+
},
20+
);
21+
}
22+
23+
export default function LoginRouteComponent({
24+
loaderData,
25+
}: Route.ComponentProps) {
26+
const { referer } = loaderData;
27+
28+
return <LoginModal key="login-modal" referer={referer} />;
529
}

src/app/sessions.server.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { createCookieSessionStorage } from 'react-router';
2+
3+
type SessionData = {
4+
userId: string;
5+
referer: string;
6+
};
7+
8+
type SessionFlashData = {
9+
error: string;
10+
};
11+
12+
const MINITE = 60;
13+
14+
const { getSession, commitSession, destroySession } =
15+
createCookieSessionStorage<SessionData, SessionFlashData>({
16+
cookie: {
17+
name: '__session',
18+
19+
httpOnly: true,
20+
maxAge: MINITE * 60 * 24,
21+
path: '/',
22+
sameSite: 'lax',
23+
secrets: [String(import.meta.env.VITE_APP_SECRET)],
24+
secure: true,
25+
},
26+
});
27+
28+
export { getSession, commitSession, destroySession };

src/widgets/auth/ui/LoginModal/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@ import Modal from '~/shared/ui/Modal';
88

99
import CloudLogo from '~/assets/images/cloud.webp';
1010

11-
export default function LoginModal() {
11+
type LoginModalProps = {
12+
referer: string;
13+
};
14+
15+
export default function LoginModal({ referer }: LoginModalProps) {
1216
const navigate = useNavigate();
1317
const modalRef = useRef<HTMLDialogElement>(null);
14-
useClickOutside(modalRef, () => navigate(-1));
18+
useClickOutside(modalRef, () => navigate(referer));
1519

1620
return (
1721
<Backdrop>

src/widgets/navbar/ui/NavBar/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export default function NavBar({
3939
};
4040

4141
const LoginButton = () => (
42-
<NavLink to={`/trade/${ticker}/login`}>
42+
<NavLink to={`/trade/${ticker}/login?referer=${location.pathname}`}>
4343
<Button>로그인</Button>
4444
</NavLink>
4545
);

0 commit comments

Comments
 (0)