load and display document

This commit is contained in:
MapleLeaf
2022-01-02 21:56:28 -06:00
committed by Darius
parent c4e72a1fcf
commit 381f933fd1
7 changed files with 53 additions and 8 deletions

View File

@@ -1,3 +1,4 @@
import compression from "compression"
import express from "express" import express from "express"
import { dirname, join } from "node:path" import { dirname, join } from "node:path"
import { fileURLToPath } from "node:url" import { fileURLToPath } from "node:url"
@@ -8,6 +9,8 @@ const root = dirname(fileURLToPath(import.meta.url))
const app = express() const app = express()
app.use(compression())
let viteDevServer let viteDevServer
if (isProduction) { if (isProduction) {
app.use(express.static(join(root, "dist/client"))) app.use(express.static(join(root, "dist/client")))

View File

@@ -10,7 +10,7 @@ const context = await getPage<PageContextBuiltInClient>()
createRoot(document.querySelector("#app")!).render( createRoot(document.querySelector("#app")!).render(
<HeadProvider> <HeadProvider>
<RouteContextProvider value={{ routeParams: {}, ...context }}> <RouteContextProvider value={{ routeParams: {}, ...(context as any) }}>
<App> <App>
<context.Page /> <context.Page />
</App> </App>

View File

@@ -6,7 +6,7 @@ import { dangerouslySkipEscape, escapeInject } from "vite-plugin-ssr"
import { App } from "./app" import { App } from "./app"
import { RouteContextProvider } from "./route-context" import { RouteContextProvider } from "./route-context"
export const passToClient = ["routeParams"] export const passToClient = ["routeParams", "pageData"]
export function render(context: PageContextBuiltIn) { export function render(context: PageContextBuiltIn) {
const headTags: React.ReactElement[] = [] const headTags: React.ReactElement[] = []

View File

@@ -0,0 +1,23 @@
import type { OnBeforeRenderFn } from "../router-types"
export type DocsPageProps = {
title?: string
description?: string
content: string
}
export const onBeforeRender: OnBeforeRenderFn<DocsPageProps> = async (
context,
) => {
const documentPath = context.routeParams["*"]
const document = await import(`../docs/${documentPath}.md`)
return {
pageContext: {
pageData: {
title: document.attributes.title,
description: document.attributes.description,
content: document.html,
},
},
}
}

View File

@@ -1,19 +1,23 @@
import clsx from "clsx" import clsx from "clsx"
import { Meta, Title } from "react-head"
import { AppLink } from "../components/app-link" import { AppLink } from "../components/app-link"
import { MainNavigation } from "../components/main-navigation" import { MainNavigation } from "../components/main-navigation"
import { guideLinks } from "../data/guide-links.preval" import { guideLinks } from "../data/guide-links.preval"
import { useScrolled } from "../hooks/dom/use-scrolled" import { useScrolled } from "../hooks/dom/use-scrolled"
import { useRouteParams } from "../route-context" import { usePageData } from "../route-context"
import { import {
docsProseClass, docsProseClass,
linkClass, linkClass,
maxWidthContainer, maxWidthContainer,
} from "../styles/components" } from "../styles/components"
import type { DocsPageProps } from "./docs.page.server"
export default function DocsPage() { export default function DocsPage() {
const params = useRouteParams() const data = usePageData<DocsPageProps>()
return ( return (
<> <>
<Title>{data.title} | Reacord</Title>
<Meta name="description" content={data.description} />
<HeaderPanel> <HeaderPanel>
<div className={maxWidthContainer}> <div className={maxWidthContainer}>
<MainNavigation /> <MainNavigation />
@@ -30,10 +34,10 @@ export default function DocsPage() {
))} ))}
</ul> </ul>
</nav> </nav>
<section className={clsx(docsProseClass, "pb-8 flex-1 min-w-0")}> <section
{/* todo */} className={clsx(docsProseClass, "pb-8 flex-1 min-w-0")}
{JSON.stringify(params, undefined, 2)} dangerouslySetInnerHTML={{ __html: data.content }}
</section> />
</main> </main>
</> </>
) )

View File

@@ -2,6 +2,7 @@ import { createContext, useContext } from "react"
export type RouteContextValue = { export type RouteContextValue = {
routeParams: Record<string, string> routeParams: Record<string, string>
pageData?: Record<string, unknown>
} }
const Context = createContext<RouteContextValue>() const Context = createContext<RouteContextValue>()
@@ -11,3 +12,7 @@ export const RouteContextProvider = Context.Provider
export function useRouteParams() { export function useRouteParams() {
return useContext(Context)?.routeParams ?? {} return useContext(Context)?.routeParams ?? {}
} }
export function usePageData<T>() {
return useContext(Context)?.pageData as T
}

View File

@@ -0,0 +1,10 @@
import type { Promisable } from "type-fest"
import type { PageContextBuiltIn } from "vite-plugin-ssr"
export type OnBeforeRenderFn<PageProps> = (
context: PageContextBuiltIn,
) => Promisable<{
pageContext: {
pageData: PageProps
}
}>