@@ -3,7 +3,7 @@ import type { Route } from "./+types/update-menu-collapse";
3
3
import type { Info as RootInfo } from "../+types/root" ;
4
4
import { useRouteLoaderData , useSubmit } from "react-router" ;
5
5
import invariant from "tiny-invariant" ;
6
- import { useCallback } from "react" ;
6
+ import { useCallback , useState } from "react" ;
7
7
8
8
export async function action ( { request } : Route . ActionArgs ) {
9
9
let formData = await request . formData ( ) ;
@@ -25,19 +25,22 @@ export async function action({ request }: Route.ActionArgs) {
25
25
}
26
26
27
27
export function useMenuCollapse ( category ?: string ) {
28
- const submit = useSubmit ( ) ;
29
28
const rootLoaderData = useRouteLoaderData < RootInfo [ "loaderData" ] > ( "root" ) ;
30
-
31
29
invariant ( rootLoaderData , "No root loader data found" ) ;
32
30
33
- const isCollapsed = category
31
+ const isMenuOpen = category
34
32
? rootLoaderData . menuCollapseState [ category ] ?? true
35
33
: true ;
34
+ const [ isOpen , setIsOpen ] = useState ( isMenuOpen ) ;
35
+ const submit = useSubmit ( ) ;
36
36
37
37
const submitMenuCollapse = useCallback (
38
38
( open : boolean ) => {
39
+ // fire and forget, assume that the submit will succeed and just update the ephemeral state
40
+ setIsOpen ( open ) ;
41
+
39
42
if ( ! category ) return ;
40
- submit (
43
+ return submit (
41
44
{ category, open : String ( open ) } ,
42
45
{
43
46
navigate : false ,
@@ -49,5 +52,5 @@ export function useMenuCollapse(category?: string) {
49
52
[ category , submit ]
50
53
) ;
51
54
52
- return [ isCollapsed , submitMenuCollapse ] as const ;
55
+ return [ isOpen , submitMenuCollapse ] as const ;
53
56
}
0 commit comments