import { lazy } from "react"; import { createBrowserRouter, redirect } from "react-router-dom"; import App from "@/App"; import { initialGlobalState, initialUserState } from "@/store/module"; const Root = lazy(() => import("@/layouts/Root")); const SignIn = lazy(() => import("@/pages/SignIn")); const SignUp = lazy(() => import("@/pages/SignUp")); const AuthCallback = lazy(() => import("@/pages/AuthCallback")); const Explore = lazy(() => import("@/pages/Explore")); const Home = lazy(() => import("@/pages/Home")); const UserProfile = lazy(() => import("@/pages/UserProfile")); const MemoDetail = lazy(() => import("@/pages/MemoDetail")); const EmbedMemo = lazy(() => import("@/pages/EmbedMemo")); const Archived = lazy(() => import("@/pages/Archived")); const DailyReview = lazy(() => import("@/pages/DailyReview")); const Resources = lazy(() => import("@/pages/Resources")); const Setting = lazy(() => import("@/pages/Setting")); const NotFound = lazy(() => import("@/pages/NotFound")); const initialGlobalStateLoader = (() => { let done = false; return async () => { if (done) { return; } done = true; try { await initialGlobalState(); } catch (error) { // do nth } }; })(); const initialUserStateLoader = async (redirectWhenNotFound = true) => { let user = undefined; try { user = await initialUserState(); } catch (error) { // do nothing. } if (!user && redirectWhenNotFound) { return redirect("/explore"); } return null; }; const router = createBrowserRouter([ { path: "/", element: , loader: async () => { await initialGlobalStateLoader(); return null; }, children: [ { path: "/auth", element: , }, { path: "/auth/signup", element: , }, { path: "/auth/callback", element: , }, { path: "/", element: , children: [ { path: "", element: , loader: () => initialUserStateLoader(), }, { path: "explore", element: , loader: () => initialUserStateLoader(false), }, { path: "review", element: , loader: () => initialUserStateLoader(), }, { path: "resources", element: , loader: () => initialUserStateLoader(), }, { path: "archived", element: , loader: () => initialUserStateLoader(), }, { path: "setting", element: , loader: () => initialUserStateLoader(), }, ], }, { path: "/m/:memoId", element: , loader: () => initialUserStateLoader(false), }, { path: "/m/:memoId/embed", element: , loader: () => initialUserStateLoader(false), }, { path: "/u/:username", element: , loader: () => initialUserStateLoader(false), }, { path: "*", element: , }, ], }, ]); export default router;