Skip to content

Commit 997fd00

Browse files
committed
cleanup
1 parent b7a049f commit 997fd00

File tree

3 files changed

+14
-19
lines changed

3 files changed

+14
-19
lines changed

app/api/update-menu-collapse.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { Route } from "./+types/update-menu-collapse";
33
import type { Info as RootInfo } from "../+types/root";
44
import { useRouteLoaderData, useSubmit } from "react-router";
55
import invariant from "tiny-invariant";
6-
import { useCallback } from "react";
6+
import { useCallback, useState } from "react";
77

88
export async function action({ request }: Route.ActionArgs) {
99
let formData = await request.formData();
@@ -25,19 +25,22 @@ export async function action({ request }: Route.ActionArgs) {
2525
}
2626

2727
export function useMenuCollapse(category?: string) {
28-
const submit = useSubmit();
2928
const rootLoaderData = useRouteLoaderData<RootInfo["loaderData"]>("root");
30-
3129
invariant(rootLoaderData, "No root loader data found");
3230

33-
const isCollapsed = category
31+
const isMenuOpen = category
3432
? rootLoaderData.menuCollapseState[category] ?? true
3533
: true;
34+
const [isOpen, setIsOpen] = useState(isMenuOpen);
35+
const submit = useSubmit();
3636

3737
const submitMenuCollapse = useCallback(
3838
(open: boolean) => {
39+
// fire and forget, assume that the submit will succeed and just update the ephemeral state
40+
setIsOpen(open);
41+
3942
if (!category) return;
40-
submit(
43+
return submit(
4144
{ category, open: String(open) },
4245
{
4346
navigate: false,
@@ -49,5 +52,5 @@ export function useMenuCollapse(category?: string) {
4952
[category, submit]
5053
);
5154

52-
return [isCollapsed, submitMenuCollapse] as const;
55+
return [isOpen, submitMenuCollapse] as const;
5356
}

app/components/docs-menu/menu.tsx

+4-13
Original file line numberDiff line numberDiff line change
@@ -91,31 +91,22 @@ function MenuCategoryDetails({
9191
slug,
9292
children,
9393
}: MenuCategoryDetailsType) {
94-
const [isMenuCollapsed, submitMenuCollapse] = useMenuCollapse(slug!);
94+
const [isOpen, submitMenuCollapse] = useMenuCollapse(slug!);
9595

96+
// Auto open the details element if on the active path
9697
let { isActive } = useNavigation(slug);
97-
98-
// By default only the active path is open
99-
const [isOpen, setIsOpen] = React.useState(isMenuCollapsed);
100-
101-
// Auto open the details element, necessary when navigating from the index page
10298
React.useEffect(() => {
10399
if (isActive) {
104-
setIsOpen(true);
100+
submitMenuCollapse(true);
105101
}
106-
}, [isActive]);
102+
}, [isActive, submitMenuCollapse]);
107103

108104
return (
109105
<details
110106
className={classNames(className, "relative flex flex-col")}
111107
open={isOpen}
112108
onToggle={(e) => {
113109
const open = e.currentTarget.open;
114-
// Synchronize the DOM's state with React state to prevent the
115-
// details element from being closed after navigation and re-evaluation
116-
// of useIsActivePath
117-
setIsOpen(open);
118-
119110
submitMenuCollapse(open);
120111
}}
121112
>

app/modules/menu-collapse.server.ts

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ type MenuCollapseState = {
1212

1313
let storage = createCookieSessionStorage<MenuCollapseState>({
1414
cookie: {
15+
secrets: ["doesn't matter it's just menu collapse state"],
1516
name: "_menu-collapse-state",
1617
maxAge: 60 * 60 * 24 * 365,
1718
httpOnly: true,

0 commit comments

Comments
 (0)