pass route params through context

This commit is contained in:
MapleLeaf
2022-01-02 20:30:04 -06:00
committed by Darius
parent 5761a3f8b0
commit 01a4201878
4 changed files with 28 additions and 6 deletions

View File

@@ -4,14 +4,17 @@ import { HeadProvider } from "react-head"
import type { PageContextBuiltInClient } from "vite-plugin-ssr/client"
import { getPage } from "vite-plugin-ssr/client"
import { App } from "./app"
import { RouteContextProvider } from "./route-context"
const context = await getPage<PageContextBuiltInClient>()
createRoot(document.querySelector("#app")!).render(
<HeadProvider>
<RouteContextProvider value={{ routeParams: {}, ...context }}>
<App>
<context.Page />
</App>
</RouteContextProvider>
</HeadProvider>,
)

View File

@@ -4,6 +4,7 @@ import { HeadProvider } from "react-head"
import type { PageContextBuiltIn } from "vite-plugin-ssr"
import { dangerouslySkipEscape, escapeInject } from "vite-plugin-ssr"
import { App } from "./app"
import { RouteContextProvider } from "./route-context"
export const passToClient = ["routeParams"]
@@ -12,9 +13,11 @@ export function render(context: PageContextBuiltIn) {
const pageHtml = renderToString(
<HeadProvider headTags={headTags}>
<RouteContextProvider value={context}>
<App>
<context.Page />
</App>
</RouteContextProvider>
</HeadProvider>,
)

View File

@@ -3,6 +3,7 @@ import { AppLink } from "../components/app-link"
import { MainNavigation } from "../components/main-navigation"
import { guideLinks } from "../data/guide-links.preval"
import { useScrolled } from "../hooks/dom/use-scrolled"
import { useRouteParams } from "../route-context"
import {
docsProseClass,
linkClass,
@@ -10,6 +11,7 @@ import {
} from "../styles/components"
export default function DocsPage() {
const params = useRouteParams()
return (
<>
<HeaderPanel>
@@ -30,6 +32,7 @@ export default function DocsPage() {
</nav>
<section className={clsx(docsProseClass, "pb-8 flex-1 min-w-0")}>
{/* todo */}
{JSON.stringify(params, undefined, 2)}
</section>
</main>
</>

View File

@@ -0,0 +1,13 @@
import { createContext, useContext } from "react"
export type RouteContextValue = {
routeParams: Record<string, string>
}
const Context = createContext<RouteContextValue>()
export const RouteContextProvider = Context.Provider
export function useRouteParams() {
return useContext(Context)?.routeParams ?? {}
}