Spaces:
Running
Running
File size: 1,598 Bytes
1e22bf6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
import { Button } from "@mantine/core";
import { Suspense, lazy, useCallback, useEffect, useState } from "react";
import { addLogEntry } from "../../../../modules/logEntries";
const MenuDrawer = lazy(() => import("./MenuDrawer"));
interface MenuState {
isDrawerOpen: boolean;
isDrawerLoaded: boolean;
}
export default function MenuButton() {
const [state, setState] = useState<MenuState>({
isDrawerOpen: false,
isDrawerLoaded: false,
});
const openDrawer = useCallback(() => {
setState((prev) => ({ ...prev, isDrawerOpen: true }));
addLogEntry("User opened the menu");
}, []);
const closeDrawer = useCallback(() => {
setState((prev) => ({ ...prev, isDrawerOpen: false }));
addLogEntry("User closed the menu");
}, []);
const handleDrawerLoad = useCallback(() => {
if (!state.isDrawerLoaded) {
addLogEntry("Menu drawer loaded");
setState((prev) => ({ ...prev, isDrawerLoaded: true }));
}
}, [state.isDrawerLoaded]);
return (
<>
<Button
size="xs"
onClick={openDrawer}
variant="default"
loading={state.isDrawerOpen && !state.isDrawerLoaded}
>
Menu
</Button>
{(state.isDrawerOpen || state.isDrawerLoaded) && (
<Suspense fallback={<SuspenseListener onUnload={handleDrawerLoad} />}>
<MenuDrawer onClose={closeDrawer} opened={state.isDrawerOpen} />
</Suspense>
)}
</>
);
}
function SuspenseListener({ onUnload }: { onUnload: () => void }) {
useEffect(() => {
return () => onUnload();
}, [onUnload]);
return null;
}
|