-
Notifications
You must be signed in to change notification settings - Fork 1
/
menu-lazy.tsx
56 lines (50 loc) · 1.16 KB
/
menu-lazy.tsx
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
import { Suspense, lazy, type FC } from 'react';
import { Button } from './button.js';
import { InfoIcon } from './icons.js';
import type {
MenuButtonFallbackProps,
MenuProps,
MenuActivatorProps,
} from './menu.js';
function withoutMenuProps({
label,
initialPlacement,
onOpenChange,
menuDropdownProps,
nested,
activator,
...rest
}: MenuProps) {
return rest;
}
const MenuLazy = lazy(async () => {
try {
return await import('./menu.js');
} catch (err) {
return {
default: ({ children, ...props }) => (
<Button
component="div"
icon={<InfoIcon />}
{...withoutMenuProps(props)}
>
{Object(err).name || 'Error'}
</Button>
),
};
}
});
const Fallback: FC<MenuButtonFallbackProps> = (props) => (
<Button component="div" busy {...withoutMenuProps(props)}>
{props.label}
</Button>
);
export const Menu: FC<MenuProps> = (withFallbackProps) => {
const { fallback, ...props } = withFallbackProps;
return (
<Suspense fallback={fallback || <Fallback {...props} />}>
<MenuLazy {...props} />
</Suspense>
);
};
export type { MenuProps, MenuActivatorProps };