Skip to content

Commit f719b53

Browse files
authored
Option to adjust the space above OverflowMenus (#110)
* Made spaceAboveMenu customizable * Moved spaceAboveMenu to OverflowMenuContext to allow for multiple different space settings * Added spaceAboveMenu as props to OverflowMenuProvider * Removed space before semicolon * Resolved errors from checks * Resolved prettier errors * Added spaceAboveMenu-info to README.md
1 parent 476e1b6 commit f719b53

File tree

5 files changed

+24
-17
lines changed

5 files changed

+24
-17
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ const HiddenItemWrappedTwice = ()=> <HiddenItemWrapped />
203203
This is a React context provider needed for `overflowMenuPressHandlerDropdownMenu` to work. If you're not using `overflowMenuPressHandlerDropdownMenu` then you don't need it.
204204
By default, you need to wrap your root component with it.
205205

206+
On Android, `OverflowMenuProvider` accepts an optional `spaceAboveMenu` prop, which can be used to set the distance between the top of the screen and the top of the overflow menu.
207+
206208
#### `HeaderButton`
207209

208210
You will typically not use `HeaderButton` directly. `HeaderButton` is where all the `onPress`, `title` and Icon-related props meet to render actual button.

index.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ declare class Divider extends Component<{
9595

9696
declare class OverflowMenuProvider extends Component<{
9797
children: ReactChild;
98+
spaceAboveMenu?: number;
9899
}> {}
99100

100101
export interface OnOverflowMenuPressParams {

src/overflowMenu/OverflowMenuContext.js

+19-15
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// @flow
22
import * as React from 'react';
33
import { Dimensions, Platform } from 'react-native';
4+
import { getDefaultSpaceAboveMenu } from './statusBarUtils';
45
import { Menu } from './vendor/Menu';
5-
import { getSpaceAboveMenu } from './statusBarUtils';
66

77
export type ToggleMenuParam = ?{|
88
elements: React.ChildrenArray<any>,
@@ -24,9 +24,10 @@ export const OverflowMenuContext = React.createContext<(ToggleMenuParam) => void
2424

2525
type Props = {|
2626
children: React.Element<any>,
27+
spaceAboveMenu?: number,
2728
|};
2829

29-
export const OverflowMenuProvider = ({ children }: Props) => {
30+
export const OverflowMenuProvider = ({ children, spaceAboveMenu }: Props) => {
3031
const [visible, setVisible] = React.useState(false);
3132
const [position, setPosition] = React.useState({ x: Dimensions.get('window').width - 10, y: 40 });
3233
const [elements, setElements] = React.useState(null);
@@ -35,19 +36,22 @@ export const OverflowMenuProvider = ({ children }: Props) => {
3536
setVisible(false);
3637
}, []);
3738

38-
const toggleMenu = React.useCallback((params: ToggleMenuParam) => {
39-
setVisible((prevVisible) => !prevVisible);
40-
setElements(params?.elements || []);
41-
if (params) {
42-
const { x, y } = params;
43-
const heightApprox = getSpaceAboveMenu();
44-
const extraDelta = Platform.select({
45-
android: heightApprox,
46-
default: OVERFLOW_TOP,
47-
});
48-
setPosition({ x, y: y + extraDelta });
49-
}
50-
}, []);
39+
const toggleMenu = React.useCallback(
40+
(params: ToggleMenuParam) => {
41+
setVisible((prevVisible) => !prevVisible);
42+
setElements(params?.elements || []);
43+
if (params) {
44+
const { x, y } = params;
45+
const heightApprox = spaceAboveMenu ?? getDefaultSpaceAboveMenu();
46+
const extraDelta = Platform.select({
47+
android: heightApprox,
48+
default: OVERFLOW_TOP,
49+
});
50+
setPosition({ x, y: y + extraDelta });
51+
}
52+
},
53+
[spaceAboveMenu]
54+
);
5155

5256
return (
5357
<OverflowMenuContext.Provider value={toggleMenu}>

src/overflowMenu/statusBarUtils.expo.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { StatusBar } from 'react-native';
22

3-
export const getSpaceAboveMenu = () => {
3+
export const getDefaultSpaceAboveMenu = () => {
44
// approximation, expo draws views right from below the display edge
55
// which is a different behavior from vanilla RN
66
return StatusBar.currentHeight + 3;

src/overflowMenu/statusBarUtils.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
export const getSpaceAboveMenu = () => {
1+
export const getDefaultSpaceAboveMenu = () => {
22
return 0;
33
};

0 commit comments

Comments
 (0)