From acad26d8718ef58d9da2d5466d191b642384ec20 Mon Sep 17 00:00:00 2001 From: a-honey Date: Sun, 5 Jan 2025 12:36:08 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=B9=A0=EB=A5=B8=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=9A=94=EC=B2=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 5 +++++ src/api/auth/postLogin.ts | 1 + src/client-entry.ts | 33 +++++++++++++++++++++++++++++++++ src/layouts/authCheckLoader.tsx | 9 ++++++--- vite.config.ts | 5 +++++ 5 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/client-entry.ts diff --git a/src/App.tsx b/src/App.tsx index 5c0ac42..f47fb92 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,8 +1,13 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { RouterProvider } from "react-router-dom"; +import { checkToken } from "./client-entry"; import router from "./router/router"; +document.addEventListener("DOMContentLoaded", () => { + checkToken(); +}); + export const queryClient = new QueryClient({ defaultOptions: { queries: { diff --git a/src/api/auth/postLogin.ts b/src/api/auth/postLogin.ts index cb60415..7fe0c70 100644 --- a/src/api/auth/postLogin.ts +++ b/src/api/auth/postLogin.ts @@ -17,6 +17,7 @@ export default async function postLogin(loginBody: LoginBodyType) { localStorage.setItem("accessToken", accessToken); localStorage.setItem("refreshToken", refreshToken); + localStorage.setItem("tokenAvailable", "true"); return response; } diff --git a/src/client-entry.ts b/src/client-entry.ts new file mode 100644 index 0000000..8b6dd81 --- /dev/null +++ b/src/client-entry.ts @@ -0,0 +1,33 @@ +export async function checkToken() { + const accessToken = localStorage.getItem("accessToken"); + const refreshToken = localStorage.getItem("refreshToken"); + const headers = new Headers(); + + if (refreshToken) { + headers.append("x-refresh-token", refreshToken); + } + if (accessToken) { + headers.append("Authorization", `Bearer ${accessToken}`); + } + headers.append("Content-Type", "application/json"); + try { + const response = await fetch("https://linkedoutapp.com/api/admin-info/my", { + method: "GET", + headers, + }); + + if (!response.ok) { + sessionStorage.setItem("tokenAvailable", "false"); + } + + if (response.status === 200) { + const data = await response.json(); + sessionStorage.setItem("tokenAvailable", "true"); + sessionStorage.setItem("root", `${data.data.name === "root"}`); + } else { + sessionStorage.setItem("tokenAvailable", "false"); + } + } catch (error) { + console.error("Error fetching data:", error); + } +} diff --git a/src/layouts/authCheckLoader.tsx b/src/layouts/authCheckLoader.tsx index 9fd50b8..4f2f542 100644 --- a/src/layouts/authCheckLoader.tsx +++ b/src/layouts/authCheckLoader.tsx @@ -7,14 +7,18 @@ import { redirect } from "react-router-dom"; type LoaderContext = "AuthLayout" | "DefaultLayout"; export default async function authCheckLoader(context: LoaderContext) { - const accessToken = localStorage.getItem("accessToken"); + const tokenAvailable = localStorage.getItem("tokenAvailable"); + + if (tokenAvailable) { + redirect("/auth/login"); + } const handleUnauthorized = () => { localStorage.removeItem("accessToken"); return redirect(`/auth/${AuthPaths.LOGIN}`); }; - if (!accessToken) { + if (!tokenAvailable || tokenAvailable === "false") { return context === "DefaultLayout" ? handleUnauthorized() : null; } @@ -27,7 +31,6 @@ export default async function authCheckLoader(context: LoaderContext) { sessionStorage.setItem("redirected", "true"); if (response?.id !== undefined) { - localStorage.setItem("isRootAccount", `${response.id === 0}`); if (context === "AuthLayout") { return redirect(`/${DefaultPaths.DASHBOARD}`); } diff --git a/vite.config.ts b/vite.config.ts index e840bf2..a80677c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,6 +5,11 @@ import react from "@vitejs/plugin-react"; // https://vite.dev/config/ export default defineConfig({ + server: { + hmr: { + overlay: false, + }, + }, plugins: [ react(), VitePWA({