Skip to content

Instantly share code, notes, and snippets.

@jaens
Created February 18, 2024 00:01
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jaens/693bd767b0f18d6577265815f6831c7a to your computer and use it in GitHub Desktop.
Save jaens/693bd767b0f18d6577265815f6831c7a to your computer and use it in GitHub Desktop.
Storybook fake Tanstack router
/* eslint-disable react-refresh/only-export-components */
import {
createMemoryHistory,
createRootRoute,
createRoute,
createRouter,
useRouterState,
type NotFoundRouteProps,
} from "@tanstack/react-router";
import { createContext, useContext, type ReactNode } from "react";
//#region Dummy story router
function RenderStory() {
const storyFn = useContext(CurrentStoryContext);
if (!storyFn) {
throw new Error("Storybook root not found");
}
return storyFn();
}
export const CurrentStoryContext = createContext<(() => ReactNode) | undefined>(undefined);
function NotFoundComponent(_props: NotFoundRouteProps) {
const state = useRouterState();
return (
<div>
<i>Warning:</i> Simulated route not found for path <code>{state.location.href}</code>
</div>
);
}
const storyPath = "/__story__";
const storyRoute = createRoute({
path: storyPath,
getParentRoute: () => rootRoute,
component: RenderStory,
});
const rootRoute = createRootRoute({
notFoundComponent: NotFoundComponent,
});
rootRoute.addChildren([storyRoute]);
export const storyRouter = createRouter({
history: createMemoryHistory({ initialEntries: [storyPath] }),
routeTree: rootRoute,
});
//#endregion
export function storyRouterDecorator(storyFn: () => ReactNode) {
return (
<CurrentStoryContext.Provider value={storyFn}>
<RouterProvider router={storyRouter} />
</CurrentStoryContext.Provider>
);
}
@jaens
Copy link
Author

jaens commented Feb 18, 2024

This works as long as you do not need any actual actions (ie. navigation somewhere else) to work inside Storybook.

The router contains a single route that just renders the story.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment