Skip to content

Commit eaba7e1

Browse files
Merge pull request #271 from boostcampwm-2024/feature-fe-#270
로그인 기능 구현
2 parents 50ad435 + 06d507d commit eaba7e1

File tree

15 files changed

+160
-46
lines changed

15 files changed

+160
-46
lines changed

apps/frontend/public/kakao.svg

Lines changed: 10 additions & 0 deletions
Loading

apps/frontend/public/naver.svg

Lines changed: 10 additions & 0 deletions
Loading

apps/frontend/src/app/App.tsx

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,29 @@
1-
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
2-
31
import { useSyncedUsers } from "@/entities/user/model";
42
import { SideWrapper } from "@/shared/ui";
53
import { CanvasView } from "@/widgets/CanvasView";
64
import { EditorView } from "@/widgets/EditorView";
75
import { PageSideBarView } from "@/widgets/PageSideBarView";
86
import { CanvasToolsView } from "@/widgets/CanvasToolsView";
9-
10-
const queryClient = new QueryClient();
7+
import { useGetUser } from "@/features/auth/model/useAuth";
118

129
function App() {
1310
useSyncedUsers();
11+
useGetUser();
1412

1513
return (
16-
<QueryClientProvider client={queryClient}>
17-
<div className="fixed inset-0 bg-white">
18-
<SideWrapper side="right" className="z-50">
19-
<EditorView />
20-
</SideWrapper>
21-
<CanvasView />
22-
<SideWrapper
23-
side="left"
24-
className="left-4 top-4 flex flex-row items-start gap-2"
25-
>
26-
<PageSideBarView />
27-
<CanvasToolsView />
28-
</SideWrapper>
29-
</div>
30-
</QueryClientProvider>
14+
<div className="fixed inset-0 bg-white">
15+
<SideWrapper side="right" className="z-50">
16+
<EditorView />
17+
</SideWrapper>
18+
<CanvasView />
19+
<SideWrapper
20+
side="left"
21+
className="left-4 top-4 flex flex-row items-start gap-2"
22+
>
23+
<PageSideBarView />
24+
<CanvasToolsView />
25+
</SideWrapper>
26+
</div>
3127
);
3228
}
3329

apps/frontend/src/app/main.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import { StrictMode } from "react";
22
import { createRoot } from "react-dom/client";
3+
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
4+
35
import "../shared/index.css";
46
import App from "./App.tsx";
57

8+
const queryClient = new QueryClient();
9+
610
createRoot(document.getElementById("root")!).render(
7-
<StrictMode>
8-
<App />
9-
</StrictMode>,
11+
<QueryClientProvider client={queryClient}>
12+
<StrictMode>
13+
<App />
14+
</StrictMode>
15+
</QueryClientProvider>,
1016
);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { Get, Post } from "@/shared/api";
2+
3+
interface GetUserResponse {
4+
message: string;
5+
user: {
6+
sub: number;
7+
exp: number;
8+
iat: number;
9+
provider: "kakao" | "naver";
10+
};
11+
}
12+
13+
export const getUser = async () => {
14+
const url = `/api/auth/profile`;
15+
16+
const res = await Get<GetUserResponse>(url);
17+
return res.data;
18+
};
19+
20+
export const logout = async () => {
21+
const url = "/api/auth/logout";
22+
23+
await Post(url);
24+
};
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from "./model/useAuth";
2+
3+
export * from "./ui/LoginForm";
4+
export * from "./ui/UserInfo";
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
2+
3+
import { getUser, logout } from "../api/authApi";
4+
5+
export const useGetUser = () => {
6+
return useQuery({
7+
queryKey: ["user"],
8+
queryFn: getUser,
9+
retry: false,
10+
refetchOnWindowFocus: false,
11+
});
12+
};
13+
14+
export const useLogout = () => {
15+
const queryClient = useQueryClient();
16+
17+
const logoutMutation = useMutation({
18+
mutationFn: logout,
19+
onSuccess: async () => {
20+
queryClient.setQueryData(["user"], null);
21+
await queryClient.invalidateQueries({ queryKey: ["user"] });
22+
},
23+
});
24+
25+
return logoutMutation;
26+
};
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import KakaoLogo from "../../../../../public/kakao.svg";
2+
import NaverLogo from "../../../../../public/naver.svg";
3+
4+
export function LoginForm() {
5+
return (
6+
<div className="flex flex-col items-center gap-6">
7+
<div className="text-center text-lg font-semibold">간편 로그인</div>
8+
<div className="flex flex-col items-center gap-2">
9+
<a
10+
className="flex h-12 w-64 items-center justify-center gap-2 rounded-lg bg-[#FEE500] bg-cover bg-no-repeat text-[rgba(0,0,0,0.85)]"
11+
href="/api/auth/kakao"
12+
>
13+
<img className="w-4" src={KakaoLogo}></img>
14+
카카오 로그인
15+
</a>
16+
<a
17+
className="flex h-12 w-64 items-center justify-center gap-2 rounded-lg bg-[#03C75A] bg-cover bg-no-repeat text-[#ffffff]"
18+
href="/api/auth/naver"
19+
>
20+
<img className="w-4" src={NaverLogo}></img>
21+
네이버 로그인
22+
</a>
23+
</div>
24+
</div>
25+
);
26+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { useLogout } from "../../model/useAuth";
2+
3+
export function UserInfo() {
4+
const logoutMutation = useLogout();
5+
6+
return <div onClick={() => logoutMutation.mutate()}>로그아웃</div>;
7+
}

apps/frontend/src/features/pageSidebar/ui/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,4 @@ export * from "./NoteList";
33
export * from "./ProfileModal";
44
export * from "./RemoveNoteModal";
55
export * from "./Tools";
6-
export * from "./TopNav";
76
export * from "./WorkspaceNav";

0 commit comments

Comments
 (0)