import { lazy } from "react";
import { createBrowserRouter, redirect } from "react-router-dom";
import App from "@/App";
import Archived from "@/pages/Archived";
import DailyReview from "@/pages/DailyReview";
import Resources from "@/pages/Resources";
import Setting from "@/pages/Setting";
import { initialGlobalState, initialUserState } from "@/store/module";
const Root = lazy(() => import("@/layouts/Root"));
const Auth = lazy(() => import("@/pages/Auth"));
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 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/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;