Skip to content

Commit 661f028

Browse files
committed
Switch to new context
1 parent 841dcc8 commit 661f028

File tree

6 files changed

+59
-70
lines changed

6 files changed

+59
-70
lines changed

app/api/update-menu-collapse.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { useRouteLoaderData, useSubmit } from "react-router";
55
import invariant from "tiny-invariant";
66
import { useCallback, useState } from "react";
77

8-
export async function action({ request }: Route.ActionArgs) {
8+
export async function action({ request, context }: Route.ActionArgs) {
99
let formData = await request.formData();
1010

1111
let category = formData.get("category");
@@ -20,7 +20,8 @@ export async function action({ request }: Route.ActionArgs) {
2020

2121
let parsedOpen = open === "true";
2222

23-
setMenuCollapseState(category, parsedOpen);
23+
// @ts-expect-error huh?
24+
setMenuCollapseState(context, category, parsedOpen);
2425
return parsedOpen;
2526
}
2627

@@ -29,7 +30,7 @@ export function useMenuCollapse(category?: string) {
2930
invariant(rootLoaderData, "No root loader data found");
3031

3132
const isMenuOpen = category
32-
? rootLoaderData.menuCollapseState[category] ?? true
33+
? (rootLoaderData.menuCollapseState[category] ?? true)
3334
: true;
3435
const [isOpen, setIsOpen] = useState(isMenuOpen);
3536
const submit = useSubmit();
@@ -46,10 +47,10 @@ export function useMenuCollapse(category?: string) {
4647
navigate: false,
4748
method: "post",
4849
action: "/_update-menu-collapse",
49-
}
50+
},
5051
);
5152
},
52-
[category, submit]
53+
[category, submit],
5354
);
5455

5556
return [isOpen, submitMenuCollapse] as const;

app/modules/menu-collapse.server.ts

Lines changed: 21 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import {
22
createCookieSessionStorage,
3-
type MiddlewareFunctionArgs,
4-
type RouterContext,
3+
unstable_createContext,
54
type Session,
5+
type unstable_MiddlewareFunction,
6+
type unstable_RouterContextProvider,
67
} from "react-router";
7-
import { createContext, provide, pull } from "@ryanflorence/async-provider";
88

99
type MenuCollapseState = {
1010
"menu-collapse-state"?: Record<string, boolean>;
@@ -21,37 +21,34 @@ let storage = createCookieSessionStorage<MenuCollapseState>({
2121
},
2222
});
2323

24-
let menuCollapseStateContext = createContext<Session<MenuCollapseState>>();
24+
let menuCollapseStateContext =
25+
unstable_createContext<Session<MenuCollapseState>>();
2526

26-
export let menuCollapseStateMiddleware = async ({
27-
request,
28-
next,
29-
}: MiddlewareFunctionArgs<RouterContext, Response>) => {
27+
export let menuCollapseStateMiddleware: unstable_MiddlewareFunction<
28+
Response
29+
> = async ({ request, context }, next) => {
3030
let cookieHeader = request.headers.get("Cookie");
3131
let session = await storage.getSession(cookieHeader);
32-
// Setting the cookie and wrapping the response in the context
33-
return provide([[menuCollapseStateContext, session]], async () => {
34-
try {
35-
let res = await next();
36-
res.headers.append("Set-Cookie", await storage.commitSession(session));
37-
return res;
38-
} catch (e) {
39-
console.log("session middleware error", request.url);
40-
console.log(e);
41-
return new Response("Oops, something went wrong.", { status: 500 });
42-
}
43-
});
32+
context.set(menuCollapseStateContext, session);
33+
34+
let res = await next();
35+
res.headers.append("Set-Cookie", await storage.commitSession(session));
36+
return res;
4437
};
4538

46-
export function setMenuCollapseState(category: string, value: boolean) {
47-
let session = pull(menuCollapseStateContext);
39+
export function setMenuCollapseState(
40+
context: unstable_RouterContextProvider,
41+
category: string,
42+
value: boolean,
43+
) {
44+
let session = context.get(menuCollapseStateContext);
4845
let state = session.get("menu-collapse-state") || {};
4946
state[category] = value;
5047
session.set("menu-collapse-state", state);
5148
}
5249

53-
export function getMenuCollapseState() {
54-
let session = pull(menuCollapseStateContext);
50+
export function getMenuCollapseState(context: unstable_RouterContextProvider) {
51+
let session = context.get(menuCollapseStateContext);
5552
let state = session.get("menu-collapse-state") || {};
5653
return state;
5754
}

app/root.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { LoaderFunctionArgs } from "react-router";
21
import {
32
Link,
43
Links,
@@ -27,14 +26,15 @@ import "~/styles/tailwind.css";
2726
import "@docsearch/css/dist/style.css";
2827
import "~/styles/docsearch.css";
2928

30-
export let middleware = [menuCollapseStateMiddleware];
29+
export let unstable_middleware = [menuCollapseStateMiddleware];
3130

32-
export async function loader({ request }: LoaderFunctionArgs) {
31+
export async function loader({ request, context }: Route.LoaderArgs) {
3332
await middlewares(request);
3433

3534
let colorScheme = await parseColorScheme(request);
3635
let isProductionHost = isHost("reactrouter.com", request);
37-
const menuCollapseState = getMenuCollapseState();
36+
// @ts-expect-error huh?
37+
const menuCollapseState = getMenuCollapseState(context);
3838

3939
return { colorScheme, isProductionHost, menuCollapseState };
4040
}

package-lock.json

Lines changed: 23 additions & 32 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@
2222
"dependencies": {
2323
"@docsearch/css": "^3.8.3",
2424
"@docsearch/react": "^3.8.3",
25-
"@react-router/express": "0.0.0-experimental-beaa4f52a",
26-
"@react-router/node": "0.0.0-experimental-beaa4f52a",
27-
"@ryanflorence/async-provider": "^0.0.1",
25+
"@react-router/express": "7.3.0-pre.0",
26+
"@react-router/node": "7.3.0-pre.0",
2827
"@types/express": "^5.0.0",
2928
"cheerio": "^1.0.0-rc.12",
3029
"classnames": "^2.3.2",
@@ -45,7 +44,7 @@
4544
"parse-numeric-range": "^1.3.0",
4645
"react": "^19.0.0",
4746
"react-dom": "^19.0.0",
48-
"react-router": "0.0.0-experimental-beaa4f52a",
47+
"react-router": "7.3.0-pre.0",
4948
"rehype-autolink-headings": "^7.1.0",
5049
"rehype-slug": "^6.0.0",
5150
"rehype-stringify": "^10.0.1",
@@ -62,7 +61,7 @@
6261
"unist-util-visit": "^5.0.0"
6362
},
6463
"devDependencies": {
65-
"@react-router/dev": "0.0.0-experimental-beaa4f52a",
64+
"@react-router/dev": "7.3.0-pre.0",
6665
"@testing-library/jest-dom": "^5.16.5",
6766
"@types/eslint": "^8.56.6",
6867
"@types/express-serve-static-core": "^5.0.6",

react-router.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type { Config } from "@react-router/dev/config";
33
export default {
44
future: {
55
unstable_optimizeDeps: true,
6+
unstable_middleware: true,
67
unstable_splitRouteModules: "enforce",
78
},
89
} satisfies Config;

0 commit comments

Comments
 (0)