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 type { PageContextBuiltInClient } from "vite-plugin-ssr/client"
import { getPage } from "vite-plugin-ssr/client" import { getPage } from "vite-plugin-ssr/client"
import { App } from "./app" import { App } from "./app"
import { RouteContextProvider } from "./route-context"
const context = await getPage<PageContextBuiltInClient>() const context = await getPage<PageContextBuiltInClient>()
createRoot(document.querySelector("#app")!).render( createRoot(document.querySelector("#app")!).render(
<HeadProvider> <HeadProvider>
<App> <RouteContextProvider value={{ routeParams: {}, ...context }}>
<context.Page /> <App>
</App> <context.Page />
</App>
</RouteContextProvider>
</HeadProvider>, </HeadProvider>,
) )

View File

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

View File

@@ -3,6 +3,7 @@ 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 { import {
docsProseClass, docsProseClass,
linkClass, linkClass,
@@ -10,6 +11,7 @@ import {
} from "../styles/components" } from "../styles/components"
export default function DocsPage() { export default function DocsPage() {
const params = useRouteParams()
return ( return (
<> <>
<HeaderPanel> <HeaderPanel>
@@ -30,6 +32,7 @@ export default function DocsPage() {
</nav> </nav>
<section className={clsx(docsProseClass, "pb-8 flex-1 min-w-0")}> <section className={clsx(docsProseClass, "pb-8 flex-1 min-w-0")}>
{/* todo */} {/* todo */}
{JSON.stringify(params, undefined, 2)}
</section> </section>
</main> </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 ?? {}
}