UNPKG

1.46 kBPlain TextView Raw
1import * as React from "react";
2import {
3 SealedInitialState,
4 useSealedState,
5} from "reakit-utils/useSealedState";
6import {
7 PopoverState,
8 PopoverActions,
9 PopoverInitialState,
10 usePopoverState,
11 PopoverStateReturn,
12} from "../Popover/PopoverState";
13import {
14 MenuBarState,
15 MenuBarActions,
16 MenuBarInitialState,
17 useMenuBarState,
18 MenuBarStateReturn,
19} from "./MenuBarState";
20import { MenuContext } from "./__utils/MenuContext";
21
22export type MenuState = MenuBarState & PopoverState;
23
24export type MenuActions = MenuBarActions & PopoverActions;
25
26export type MenuInitialState = MenuBarInitialState & PopoverInitialState;
27
28export type MenuStateReturn = MenuBarStateReturn &
29 PopoverStateReturn &
30 MenuState &
31 MenuActions;
32
33export function useMenuState(
34 initialState: SealedInitialState<MenuInitialState> = {}
35): MenuStateReturn {
36 const parent = React.useContext(MenuContext);
37 const { orientation = "vertical", gutter = 0, ...sealed } = useSealedState(
38 initialState
39 );
40
41 const placement =
42 sealed.placement ||
43 (parent && parent.orientation === "vertical"
44 ? "right-start"
45 : "bottom-start");
46
47 const menuBar = useMenuBarState({ ...sealed, orientation });
48 const popover = usePopoverState({
49 ...sealed,
50 placement,
51 gutter,
52 });
53
54 React.useEffect(() => {
55 if (!popover.visible) {
56 menuBar.reset();
57 }
58 }, [popover.visible, menuBar.reset]);
59
60 return {
61 ...menuBar,
62 ...popover,
63 };
64}