Files
ds-pages/src/router/index.tsx
2024-06-25 10:40:53 +08:00

77 lines
2.0 KiB
TypeScript

/* eslint-disable react-refresh/only-export-components */
import { lazy } from "react";
import { createBrowserRouter } from "react-router-dom";
import store from "@/store";
import { markdownToHtml } from "@/utils/remark";
import { MeiliSearch } from "meilisearch";
const MainLayout = lazy(() => import("@/layout/MainLayout"));
const SearchPage = lazy(() => import("@/page/Search"));
const NotFound = lazy(() => import("@/page/Exception/NotFound"));
const ErrorPage = lazy(() => import("@/page/Exception/ErrorPage"));
const LoadingPage = lazy(async () => import("@/page/Loading"));
const ParagraphPage = lazy(async () => import("@/page/Paragraph"));
const SettingsPage = lazy(async () => import("@/page/Settings"));
const router = createBrowserRouter(
[
{
path: "/",
element: <MainLayout />,
errorElement: <ErrorPage />,
children: [
{
path: "/",
element: <SearchPage />,
loader() {
return {};
},
},
{
path: "/settings",
element: <SettingsPage />,
},
{
path: "/paragraph/:id",
element: <ParagraphPage />,
async loader({ params: { id } }) {
if (!id) {
return { redirect: "/" };
}
const meilisearch = new MeiliSearch({
host: store.getState().options.meilisearchUrl,
apiKey: store.getState().options.meilisearchToken,
});
const paragraph: Paragraph = await meilisearch
.index("paragraph")
.getDocument(id);
if (paragraph.markdown) {
paragraph.content = await markdownToHtml(paragraph.content);
} else {
paragraph.content = "NO HTML!";
}
return paragraph;
},
},
],
},
{
path: "/loading",
element: <LoadingPage />,
},
{
path: "*",
element: <NotFound />,
},
],
{},
);
export default router;