-
-
Notifications
You must be signed in to change notification settings - Fork 65
/
Copy pathHeaderButtonsProviderDropdownMenu.tsx
83 lines (73 loc) · 2.27 KB
/
HeaderButtonsProviderDropdownMenu.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import { ReactNode, useCallback, useMemo, useState } from 'react';
import { Dimensions } from 'react-native';
import { useTheme } from '@react-navigation/native';
import { getDefaultSpaceAboveMenu } from './statusBarUtils';
import { ButtonsExtraMarginContext } from '../ButtonsWrapper';
import * as React from 'react';
import { OverflowMenuContext, PresentMenuParam } from './OverflowMenuContext';
import { HeaderButtonsProviderProps } from './HeaderButtonsProviderTypes';
import { Menu } from './vendor/Menu';
export const HeaderButtonsProviderDropdownMenu = ({
children,
spaceAboveMenu,
stackType,
}: HeaderButtonsProviderProps) => {
const [menuState, setMenuState] = useState({
visible: false,
position: {
x: Dimensions.get('window').width - 10,
y: 40,
},
elements: null as ReactNode | null,
});
const {
colors: { card },
} = useTheme();
const closeMenu = useCallback(() => {
setMenuState((prevState) => ({
...prevState,
visible: false,
}));
}, []);
const presentMenu = useCallback(
(params?: PresentMenuParam) => {
const extraDelta = spaceAboveMenu ?? getDefaultSpaceAboveMenu();
setMenuState((prevState) => {
const position = params
? { x: params.x, y: params.y + extraDelta }
: prevState.position;
const elements = params ? params.elements : prevState.elements;
return {
...prevState,
position,
elements,
visible: true,
};
});
},
[spaceAboveMenu]
);
const value = useMemo(
() => ({ presentMenu, closeMenu }),
[presentMenu, closeMenu]
);
const extraMarginValue =
stackType === 'native' ? 'alreadyHandled' : 'toBeHandled';
const { visible, position, elements } = menuState;
const contentStyle = useMemo(() => ({ backgroundColor: card }), [card]);
return (
<OverflowMenuContext.Provider value={value}>
<ButtonsExtraMarginContext.Provider value={extraMarginValue}>
{React.Children.only(children)}
<Menu
visible={visible}
onDismiss={closeMenu}
anchor={position}
contentStyle={contentStyle}
>
{elements}
</Menu>
</ButtonsExtraMarginContext.Provider>
</OverflowMenuContext.Provider>
);
};