@fluentui-react-native/menu 1.0.72 → 1.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +73 -1
- package/CHANGELOG.md +25 -2
- package/lib/MenuDivider/MenuDividerTokens.js +1 -1
- package/lib/MenuDivider/MenuDividerTokens.js.map +1 -1
- package/lib/MenuDivider/MenuDividerTokens.macos.js +1 -1
- package/lib/MenuDivider/MenuDividerTokens.macos.js.map +1 -1
- package/lib/MenuDivider/MenuDividerTokens.win32.js +1 -1
- package/lib/MenuDivider/MenuDividerTokens.win32.js.map +1 -1
- package/lib/MenuItem/MenuItemTokens.js +2 -2
- package/lib/MenuItem/MenuItemTokens.js.map +1 -1
- package/lib/MenuItem/MenuItemTokens.macos.js +1 -1
- package/lib/MenuItem/MenuItemTokens.macos.js.map +1 -1
- package/lib/MenuItem/MenuItemTokens.win32.js +2 -2
- package/lib/MenuItem/MenuItemTokens.win32.js.map +1 -1
- package/lib/MenuItemCheckbox/MenuItemCheckboxTokens.js +2 -2
- package/lib/MenuItemCheckbox/MenuItemCheckboxTokens.js.map +1 -1
- package/lib/MenuItemCheckbox/MenuItemCheckboxTokens.macos.js +1 -1
- package/lib/MenuItemCheckbox/MenuItemCheckboxTokens.macos.js.map +1 -1
- package/lib/MenuItemCheckbox/MenuItemCheckboxTokens.win32.js +2 -2
- package/lib/MenuItemCheckbox/MenuItemCheckboxTokens.win32.js.map +1 -1
- package/lib/MenuTrigger/MenuTrigger.d.ts +3 -2
- package/lib/MenuTrigger/MenuTrigger.d.ts.map +1 -1
- package/lib/MenuTrigger/MenuTrigger.js +13 -20
- package/lib/MenuTrigger/MenuTrigger.js.map +1 -1
- package/lib/MenuTrigger/MenuTrigger.types.d.ts +11 -1
- package/lib/MenuTrigger/MenuTrigger.types.d.ts.map +1 -1
- package/lib/MenuTrigger/MenuTrigger.types.js.map +1 -1
- package/lib/MenuTrigger/useMenuTrigger.d.ts +2 -2
- package/lib/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
- package/lib/MenuTrigger/useMenuTrigger.js +28 -8
- package/lib/MenuTrigger/useMenuTrigger.js.map +1 -1
- package/lib/MenuTrigger/useMergeRefs.d.ts +20 -0
- package/lib/MenuTrigger/useMergeRefs.d.ts.map +1 -0
- package/lib/MenuTrigger/useMergeRefs.js +36 -0
- package/lib/MenuTrigger/useMergeRefs.js.map +1 -0
- package/lib/__tests__/Menu.test.js +1 -1
- package/lib/__tests__/Menu.test.js.map +1 -1
- package/lib-commonjs/MenuDivider/MenuDividerTokens.js +1 -1
- package/lib-commonjs/MenuDivider/MenuDividerTokens.js.map +1 -1
- package/lib-commonjs/MenuDivider/MenuDividerTokens.macos.js +1 -1
- package/lib-commonjs/MenuDivider/MenuDividerTokens.macos.js.map +1 -1
- package/lib-commonjs/MenuDivider/MenuDividerTokens.win32.js +1 -1
- package/lib-commonjs/MenuDivider/MenuDividerTokens.win32.js.map +1 -1
- package/lib-commonjs/MenuItem/MenuItemTokens.js +2 -2
- package/lib-commonjs/MenuItem/MenuItemTokens.js.map +1 -1
- package/lib-commonjs/MenuItem/MenuItemTokens.macos.js +1 -1
- package/lib-commonjs/MenuItem/MenuItemTokens.macos.js.map +1 -1
- package/lib-commonjs/MenuItem/MenuItemTokens.win32.js +2 -2
- package/lib-commonjs/MenuItem/MenuItemTokens.win32.js.map +1 -1
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckboxTokens.js +2 -2
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckboxTokens.js.map +1 -1
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckboxTokens.macos.js +1 -1
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckboxTokens.macos.js.map +1 -1
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckboxTokens.win32.js +2 -2
- package/lib-commonjs/MenuItemCheckbox/MenuItemCheckboxTokens.win32.js.map +1 -1
- package/lib-commonjs/MenuTrigger/MenuTrigger.d.ts +3 -2
- package/lib-commonjs/MenuTrigger/MenuTrigger.d.ts.map +1 -1
- package/lib-commonjs/MenuTrigger/MenuTrigger.js +14 -20
- package/lib-commonjs/MenuTrigger/MenuTrigger.js.map +1 -1
- package/lib-commonjs/MenuTrigger/MenuTrigger.types.d.ts +11 -1
- package/lib-commonjs/MenuTrigger/MenuTrigger.types.d.ts.map +1 -1
- package/lib-commonjs/MenuTrigger/MenuTrigger.types.js.map +1 -1
- package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts +2 -2
- package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
- package/lib-commonjs/MenuTrigger/useMenuTrigger.js +27 -8
- package/lib-commonjs/MenuTrigger/useMenuTrigger.js.map +1 -1
- package/lib-commonjs/MenuTrigger/useMergeRefs.d.ts +20 -0
- package/lib-commonjs/MenuTrigger/useMergeRefs.d.ts.map +1 -0
- package/lib-commonjs/MenuTrigger/useMergeRefs.js +40 -0
- package/lib-commonjs/MenuTrigger/useMergeRefs.js.map +1 -0
- package/lib-commonjs/__tests__/Menu.test.js +1 -1
- package/lib-commonjs/__tests__/Menu.test.js.map +1 -1
- package/package.json +8 -8
- package/src/MenuDivider/MenuDividerTokens.macos.ts +1 -1
- package/src/MenuDivider/MenuDividerTokens.ts +1 -1
- package/src/MenuDivider/MenuDividerTokens.win32.ts +1 -1
- package/src/MenuItem/MenuItemTokens.macos.ts +1 -1
- package/src/MenuItem/MenuItemTokens.ts +2 -2
- package/src/MenuItem/MenuItemTokens.win32.ts +2 -2
- package/src/MenuItemCheckbox/MenuItemCheckboxTokens.macos.ts +1 -1
- package/src/MenuItemCheckbox/MenuItemCheckboxTokens.ts +2 -2
- package/src/MenuItemCheckbox/MenuItemCheckboxTokens.win32.ts +2 -2
- package/src/MenuTrigger/MenuTrigger.tsx +15 -23
- package/src/MenuTrigger/MenuTrigger.types.ts +12 -0
- package/src/MenuTrigger/useMenuTrigger.ts +44 -9
- package/src/MenuTrigger/useMergeRefs.ts +42 -0
- package/src/__tests__/Menu.test.tsx +1 -1
- package/src/__tests__/__snapshots__/Menu.test.tsx.snap +27 -27
- package/lib/MenuTrigger/getRevisedProps.d.ts +0 -11
- package/lib/MenuTrigger/getRevisedProps.d.ts.map +0 -1
- package/lib/MenuTrigger/getRevisedProps.js +0 -45
- package/lib/MenuTrigger/getRevisedProps.js.map +0 -1
- package/lib-commonjs/MenuTrigger/getRevisedProps.d.ts +0 -11
- package/lib-commonjs/MenuTrigger/getRevisedProps.d.ts.map +0 -1
- package/lib-commonjs/MenuTrigger/getRevisedProps.js +0 -48
- package/lib-commonjs/MenuTrigger/getRevisedProps.js.map +0 -1
- package/src/MenuTrigger/getRevisedProps.ts +0 -52
|
@@ -9,7 +9,7 @@ export const defaultMenuItemTokens: TokenSettings<MenuItemTokens, Theme> = (t: T
|
|
|
9
9
|
checkmarkSize: 16,
|
|
10
10
|
color: t.colors.menuItemText, // matches ContextualMenu
|
|
11
11
|
fontFamily: t.typography.families.primary,
|
|
12
|
-
fontSize: globalTokens.font.
|
|
12
|
+
fontSize: globalTokens.font.size300,
|
|
13
13
|
fontWeight: globalTokens.font.weight.regular as FontWeightValue,
|
|
14
14
|
gap: globalTokens.spacing.xs,
|
|
15
15
|
paddingHorizontal: 5, // hardcoded for now to match ContextualMenu
|
|
@@ -5,11 +5,11 @@ import { MenuItemTokens } from './MenuItem.types';
|
|
|
5
5
|
|
|
6
6
|
export const defaultMenuItemTokens: TokenSettings<MenuItemTokens, Theme> = (t: Theme): MenuItemTokens => ({
|
|
7
7
|
backgroundColor: t.colors.neutralBackground1,
|
|
8
|
-
borderRadius: globalTokens.corner.
|
|
8
|
+
borderRadius: globalTokens.corner.radius40,
|
|
9
9
|
checkmarkSize: 16,
|
|
10
10
|
color: t.colors.neutralForeground2,
|
|
11
11
|
fontFamily: t.typography.families.primary,
|
|
12
|
-
fontSize: globalTokens.font.
|
|
12
|
+
fontSize: globalTokens.font.size300,
|
|
13
13
|
fontWeight: globalTokens.font.weight.regular as FontWeightValue,
|
|
14
14
|
gap: globalTokens.spacing.xs,
|
|
15
15
|
minHeight: 32,
|
|
@@ -5,11 +5,11 @@ import { MenuItemTokens } from './MenuItem.types';
|
|
|
5
5
|
|
|
6
6
|
export const defaultMenuItemTokens: TokenSettings<MenuItemTokens, Theme> = (t: Theme): MenuItemTokens => ({
|
|
7
7
|
backgroundColor: t.colors.neutralBackground1,
|
|
8
|
-
borderRadius: globalTokens.corner.
|
|
8
|
+
borderRadius: globalTokens.corner.radiusNone,
|
|
9
9
|
checkmarkSize: 16,
|
|
10
10
|
color: t.colors.neutralForeground1,
|
|
11
11
|
fontFamily: t.typography.families.primary,
|
|
12
|
-
fontSize: globalTokens.font.
|
|
12
|
+
fontSize: globalTokens.font.size200,
|
|
13
13
|
fontWeight: globalTokens.font.weight.regular as FontWeightValue,
|
|
14
14
|
gap: globalTokens.spacing.xs,
|
|
15
15
|
minHeight: 24,
|
|
@@ -11,7 +11,7 @@ export const defaultMenuItemCheckboxTokens: TokenSettings<MenuItemCheckboxTokens
|
|
|
11
11
|
checkmarkVisibility: 0,
|
|
12
12
|
color: t.colors.neutralForeground2,
|
|
13
13
|
fontFamily: t.typography.families.primary,
|
|
14
|
-
fontSize: globalTokens.font.
|
|
14
|
+
fontSize: globalTokens.font.size300,
|
|
15
15
|
fontWeight: globalTokens.font.weight.regular as FontWeightValue,
|
|
16
16
|
gap: globalTokens.spacing.xs,
|
|
17
17
|
paddingHorizontal: 5,
|
|
@@ -5,13 +5,13 @@ import { MenuItemCheckboxTokens } from './MenuItemCheckbox.types';
|
|
|
5
5
|
|
|
6
6
|
export const defaultMenuItemCheckboxTokens: TokenSettings<MenuItemCheckboxTokens, Theme> = (t: Theme): MenuItemCheckboxTokens => ({
|
|
7
7
|
backgroundColor: t.colors.neutralBackground1,
|
|
8
|
-
borderRadius: globalTokens.corner.
|
|
8
|
+
borderRadius: globalTokens.corner.radius40,
|
|
9
9
|
checkmarkPadding: globalTokens.spacing.none,
|
|
10
10
|
checkmarkSize: 16,
|
|
11
11
|
checkmarkVisibility: 0,
|
|
12
12
|
color: t.colors.neutralForeground2,
|
|
13
13
|
fontFamily: t.typography.families.primary,
|
|
14
|
-
fontSize: globalTokens.font.
|
|
14
|
+
fontSize: globalTokens.font.size300,
|
|
15
15
|
fontWeight: globalTokens.font.weight.regular as FontWeightValue,
|
|
16
16
|
gap: globalTokens.spacing.xs,
|
|
17
17
|
minHeight: 32,
|
|
@@ -5,13 +5,13 @@ import { MenuItemCheckboxTokens } from './MenuItemCheckbox.types';
|
|
|
5
5
|
|
|
6
6
|
export const defaultMenuItemCheckboxTokens: TokenSettings<MenuItemCheckboxTokens, Theme> = (t: Theme): MenuItemCheckboxTokens => ({
|
|
7
7
|
backgroundColor: t.colors.neutralBackground1,
|
|
8
|
-
borderRadius: globalTokens.corner.
|
|
8
|
+
borderRadius: globalTokens.corner.radiusNone,
|
|
9
9
|
checkmarkPadding: globalTokens.spacing.xxs,
|
|
10
10
|
checkmarkSize: 16,
|
|
11
11
|
checkmarkVisibility: 0,
|
|
12
12
|
color: t.colors.neutralForeground1,
|
|
13
13
|
fontFamily: t.typography.families.primary,
|
|
14
|
-
fontSize: globalTokens.font.
|
|
14
|
+
fontSize: globalTokens.font.size200,
|
|
15
15
|
fontWeight: globalTokens.font.weight.regular as FontWeightValue,
|
|
16
16
|
gap: globalTokens.spacing.xs,
|
|
17
17
|
minHeight: 24,
|
|
@@ -1,32 +1,24 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import {
|
|
3
|
-
import { menuTriggerName } from './MenuTrigger.types';
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { menuTriggerName, MenuTriggerProps } from './MenuTrigger.types';
|
|
4
3
|
import { useMenuTrigger } from './useMenuTrigger';
|
|
5
4
|
import { MenuTriggerProvider } from '../context/menuTriggerContext';
|
|
6
|
-
import { getRevisedProps } from './getRevisedProps';
|
|
7
5
|
|
|
8
|
-
export const MenuTrigger =
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const childrenArray = React.Children.toArray(children) as React.ReactElement[];
|
|
13
|
-
|
|
14
|
-
if (__DEV__) {
|
|
15
|
-
if (childrenArray.length !== 1) {
|
|
16
|
-
console.warn('Only expecting one child for MenuTrigger');
|
|
17
|
-
}
|
|
6
|
+
export const MenuTrigger: React.FunctionComponent<MenuTriggerProps> = (props: MenuTriggerProps) => {
|
|
7
|
+
if (__DEV__) {
|
|
8
|
+
if (!React.Children.only(props.children)) {
|
|
9
|
+
console.warn('Only expecting one child for MenuTrigger');
|
|
18
10
|
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const menuTrigger = useMenuTrigger(props.children.props);
|
|
19
14
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const revisedProps = getRevisedProps(menuTrigger, child.props);
|
|
25
|
-
const revised = React.cloneElement(child, revisedProps);
|
|
15
|
+
// In order to properly support accessibility without erasing props set on the
|
|
16
|
+
// child component which may affect accessibility, we need to modify the
|
|
17
|
+
// state in the inner render so we can access the child component and its props.
|
|
18
|
+
const revised = React.cloneElement(props.children, menuTrigger.props);
|
|
26
19
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
});
|
|
20
|
+
return <MenuTriggerProvider value={menuTrigger.hasSubmenu}>{revised}</MenuTriggerProvider>;
|
|
21
|
+
};
|
|
30
22
|
MenuTrigger.displayName = menuTriggerName;
|
|
31
23
|
|
|
32
24
|
export default MenuTrigger;
|
|
@@ -1,7 +1,19 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
import { InteractionEvent, PressablePropsExtended } from '@fluentui-react-native/interactive-hooks';
|
|
2
3
|
|
|
3
4
|
export const menuTriggerName = 'MenuTrigger';
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Represents single react element (or null), which is the
|
|
8
|
+
* type of the child of MenuTrigger. Notably this excludes string, number,
|
|
9
|
+
* and array of elements as children, which MenuTrigger doesn't support.
|
|
10
|
+
*/
|
|
11
|
+
type SingleReactElement = React.ReactElement | null;
|
|
12
|
+
|
|
13
|
+
export interface MenuTriggerProps {
|
|
14
|
+
children?: SingleReactElement;
|
|
15
|
+
}
|
|
16
|
+
|
|
5
17
|
export interface MenuTriggerChildProps extends Omit<PressablePropsExtended, 'onPress'> {
|
|
6
18
|
/**
|
|
7
19
|
* A RefObject to refer to the trigger component.
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { useMenuContext } from '../context/menuContext';
|
|
2
2
|
import { InteractionEvent } from '@fluentui-react-native/interactive-hooks';
|
|
3
|
-
import { MenuTriggerState } from './MenuTrigger.types';
|
|
3
|
+
import { MenuTriggerChildProps, MenuTriggerState } from './MenuTrigger.types';
|
|
4
4
|
import { AccessibilityActionEvent, AccessibilityActionName, Platform } from 'react-native';
|
|
5
5
|
import React from 'react';
|
|
6
6
|
import { hoverDelayDefault } from '../consts';
|
|
7
|
+
import { useMergedRefs } from './useMergeRefs';
|
|
7
8
|
|
|
8
|
-
const
|
|
9
|
+
const baseAccessibilityActions =
|
|
9
10
|
Platform.OS === ('win32' as any) ? [{ name: 'Expand' as AccessibilityActionName }, { name: 'Collapse' as AccessibilityActionName }] : [];
|
|
10
11
|
const expandedState = { expanded: true };
|
|
11
12
|
const collapsedState = { expanded: false };
|
|
12
13
|
|
|
13
|
-
export const useMenuTrigger = (): MenuTriggerState => {
|
|
14
|
+
export const useMenuTrigger = (childProps: MenuTriggerChildProps): MenuTriggerState => {
|
|
14
15
|
const context = useMenuContext();
|
|
15
16
|
const {
|
|
16
17
|
hoverDelay = hoverDelayDefault,
|
|
@@ -23,7 +24,33 @@ export const useMenuTrigger = (): MenuTriggerState => {
|
|
|
23
24
|
triggerRef,
|
|
24
25
|
} = context;
|
|
25
26
|
|
|
26
|
-
const
|
|
27
|
+
const {
|
|
28
|
+
accessibilityActions: childAccessibilityActions,
|
|
29
|
+
accessibilityState: childAccessibilityState,
|
|
30
|
+
onAccessibilityAction: childOnAccessibilityAction,
|
|
31
|
+
onClick: childOnClick,
|
|
32
|
+
onHoverIn: childOnHoverIn,
|
|
33
|
+
onHoverOut: childOnHoverOut,
|
|
34
|
+
componentRef: childComponentRef,
|
|
35
|
+
} = childProps;
|
|
36
|
+
|
|
37
|
+
const accessibilityActions = React.useMemo(() => {
|
|
38
|
+
if (childAccessibilityActions) {
|
|
39
|
+
return [...baseAccessibilityActions, ...childAccessibilityActions];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return baseAccessibilityActions;
|
|
43
|
+
}, [childAccessibilityActions]);
|
|
44
|
+
|
|
45
|
+
const accessibilityState = React.useMemo(() => {
|
|
46
|
+
const baseState = open ? expandedState : collapsedState;
|
|
47
|
+
|
|
48
|
+
if (childAccessibilityState) {
|
|
49
|
+
return { ...baseState, ...childAccessibilityState };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return baseState;
|
|
53
|
+
}, [childAccessibilityState, open]);
|
|
27
54
|
|
|
28
55
|
const onAccessibilityAction = React.useCallback(
|
|
29
56
|
(e: AccessibilityActionEvent) => {
|
|
@@ -38,8 +65,9 @@ export const useMenuTrigger = (): MenuTriggerState => {
|
|
|
38
65
|
break;
|
|
39
66
|
}
|
|
40
67
|
}
|
|
68
|
+
childOnAccessibilityAction && childOnAccessibilityAction(e);
|
|
41
69
|
},
|
|
42
|
-
[setOpen],
|
|
70
|
+
[childOnAccessibilityAction, setOpen],
|
|
43
71
|
);
|
|
44
72
|
|
|
45
73
|
const onHoverIn = React.useCallback(
|
|
@@ -52,8 +80,10 @@ export const useMenuTrigger = (): MenuTriggerState => {
|
|
|
52
80
|
setOpen(e, true /* isOpen */);
|
|
53
81
|
}, hoverDelay);
|
|
54
82
|
}
|
|
83
|
+
|
|
84
|
+
childOnHoverIn && childOnHoverIn(e);
|
|
55
85
|
},
|
|
56
|
-
[hoverDelay, openOnHover, setOpen, triggerHoverOutTimer, popoverHoverOutTimer],
|
|
86
|
+
[childOnHoverIn, hoverDelay, openOnHover, setOpen, triggerHoverOutTimer, popoverHoverOutTimer],
|
|
57
87
|
);
|
|
58
88
|
|
|
59
89
|
const onHoverOut = React.useCallback(
|
|
@@ -65,17 +95,22 @@ export const useMenuTrigger = (): MenuTriggerState => {
|
|
|
65
95
|
}, hoverDelay);
|
|
66
96
|
setTriggerHoverOutTimer(timer);
|
|
67
97
|
}
|
|
98
|
+
|
|
99
|
+
childOnHoverOut && childOnHoverOut(e);
|
|
68
100
|
},
|
|
69
|
-
[hoverDelay, openOnHover, setOpen, setTriggerHoverOutTimer],
|
|
101
|
+
[childOnHoverOut, hoverDelay, openOnHover, setOpen, setTriggerHoverOutTimer],
|
|
70
102
|
);
|
|
71
103
|
|
|
72
104
|
const onClick = React.useCallback(
|
|
73
105
|
(e: InteractionEvent) => {
|
|
74
106
|
setOpen(e, !open);
|
|
107
|
+
childOnClick && childOnClick(e);
|
|
75
108
|
},
|
|
76
|
-
[open, setOpen],
|
|
109
|
+
[childOnClick, open, setOpen],
|
|
77
110
|
);
|
|
78
111
|
|
|
112
|
+
const ref = useMergedRefs(triggerRef, childComponentRef);
|
|
113
|
+
|
|
79
114
|
React.useEffect(() => {
|
|
80
115
|
return function cleanup() {
|
|
81
116
|
clearTimeout(triggerHoverOutTimer);
|
|
@@ -87,7 +122,7 @@ export const useMenuTrigger = (): MenuTriggerState => {
|
|
|
87
122
|
onClick,
|
|
88
123
|
onHoverIn,
|
|
89
124
|
onHoverOut,
|
|
90
|
-
componentRef:
|
|
125
|
+
componentRef: ref,
|
|
91
126
|
accessibilityState,
|
|
92
127
|
accessibilityActions,
|
|
93
128
|
onAccessibilityAction,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copied from @fluentui/react-utilities
|
|
3
|
+
*
|
|
4
|
+
* Keeping the file local to Menu for now while looking into whether
|
|
5
|
+
* we can pull in @fluentui/react-utilities package
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A Ref function which can be treated like a ref object in that it has an attached
|
|
12
|
+
* current property, which will be updated as the ref is evaluated.
|
|
13
|
+
*/
|
|
14
|
+
export type RefObjectFunction<T> = React.RefObject<T> & ((value: T) => void);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* React hook to merge multiple React refs (either MutableRefObjects or ref callbacks) into a single ref callback that
|
|
18
|
+
* updates all provided refs
|
|
19
|
+
* @param refs - Refs to collectively update with one ref value.
|
|
20
|
+
* @returns A function with an attached "current" prop, so that it can be treated like a RefObject.
|
|
21
|
+
*/
|
|
22
|
+
export function useMergedRefs<T>(...refs: (React.Ref<T> | undefined)[]): RefObjectFunction<T> {
|
|
23
|
+
const mergedCallback: RefObjectFunction<T> = React.useCallback(
|
|
24
|
+
(value: T) => {
|
|
25
|
+
// Update the "current" prop hanging on the function.
|
|
26
|
+
(mergedCallback as unknown as React.MutableRefObject<T>).current = value;
|
|
27
|
+
|
|
28
|
+
for (const ref of refs) {
|
|
29
|
+
if (typeof ref === 'function') {
|
|
30
|
+
ref(value);
|
|
31
|
+
} else if (ref) {
|
|
32
|
+
// work around the immutability of the React.Ref type
|
|
33
|
+
(ref as unknown as React.MutableRefObject<T>).current = value;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- already exhaustive
|
|
38
|
+
[...refs],
|
|
39
|
+
) as unknown as RefObjectFunction<T>;
|
|
40
|
+
|
|
41
|
+
return mergedCallback;
|
|
42
|
+
}
|
|
@@ -12,7 +12,7 @@ import { MenuItemCheckbox } from '../MenuItemCheckbox/MenuItemCheckbox';
|
|
|
12
12
|
import { MenuDivider } from '../MenuDivider/MenuDivider';
|
|
13
13
|
import { MenuItemRadio } from '../MenuItemRadio/MenuItemRadio';
|
|
14
14
|
|
|
15
|
-
describe('
|
|
15
|
+
describe('Menu component tests', () => {
|
|
16
16
|
it('Menu default', () => {
|
|
17
17
|
const tree = renderer
|
|
18
18
|
.create(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
|
-
exports[`
|
|
3
|
+
exports[`Menu component tests Menu default 1`] = `
|
|
4
4
|
<View
|
|
5
5
|
accessibilityActions={Array []}
|
|
6
6
|
accessibilityLabel="Default"
|
|
@@ -32,13 +32,13 @@ exports[`Checkbox component tests Menu default 1`] = `
|
|
|
32
32
|
"backgroundColor": "#f3f2f1",
|
|
33
33
|
"borderColor": "#8a8886",
|
|
34
34
|
"borderRadius": 4,
|
|
35
|
-
"borderWidth": 1
|
|
35
|
+
"borderWidth": 1,
|
|
36
36
|
"display": "flex",
|
|
37
37
|
"flexDirection": "row",
|
|
38
38
|
"justifyContent": "center",
|
|
39
39
|
"minWidth": 96,
|
|
40
40
|
"padding": 8,
|
|
41
|
-
"paddingHorizontal":
|
|
41
|
+
"paddingHorizontal": 15,
|
|
42
42
|
"width": undefined,
|
|
43
43
|
}
|
|
44
44
|
}
|
|
@@ -65,7 +65,7 @@ exports[`Checkbox component tests Menu default 1`] = `
|
|
|
65
65
|
</View>
|
|
66
66
|
`;
|
|
67
67
|
|
|
68
|
-
exports[`
|
|
68
|
+
exports[`Menu component tests Menu defaultOpen 1`] = `
|
|
69
69
|
Array [
|
|
70
70
|
<View
|
|
71
71
|
accessibilityActions={Array []}
|
|
@@ -98,13 +98,13 @@ Array [
|
|
|
98
98
|
"backgroundColor": "#f3f2f1",
|
|
99
99
|
"borderColor": "#8a8886",
|
|
100
100
|
"borderRadius": 4,
|
|
101
|
-
"borderWidth": 1
|
|
101
|
+
"borderWidth": 1,
|
|
102
102
|
"display": "flex",
|
|
103
103
|
"flexDirection": "row",
|
|
104
104
|
"justifyContent": "center",
|
|
105
105
|
"minWidth": 96,
|
|
106
106
|
"padding": 8,
|
|
107
|
-
"paddingHorizontal":
|
|
107
|
+
"paddingHorizontal": 15,
|
|
108
108
|
"width": undefined,
|
|
109
109
|
}
|
|
110
110
|
}
|
|
@@ -273,7 +273,7 @@ Array [
|
|
|
273
273
|
]
|
|
274
274
|
`;
|
|
275
275
|
|
|
276
|
-
exports[`
|
|
276
|
+
exports[`Menu component tests Menu open 1`] = `
|
|
277
277
|
Array [
|
|
278
278
|
<View
|
|
279
279
|
accessibilityActions={Array []}
|
|
@@ -306,13 +306,13 @@ Array [
|
|
|
306
306
|
"backgroundColor": "#f3f2f1",
|
|
307
307
|
"borderColor": "#8a8886",
|
|
308
308
|
"borderRadius": 4,
|
|
309
|
-
"borderWidth": 1
|
|
309
|
+
"borderWidth": 1,
|
|
310
310
|
"display": "flex",
|
|
311
311
|
"flexDirection": "row",
|
|
312
312
|
"justifyContent": "center",
|
|
313
313
|
"minWidth": 96,
|
|
314
314
|
"padding": 8,
|
|
315
|
-
"paddingHorizontal":
|
|
315
|
+
"paddingHorizontal": 15,
|
|
316
316
|
"width": undefined,
|
|
317
317
|
}
|
|
318
318
|
}
|
|
@@ -434,7 +434,7 @@ Array [
|
|
|
434
434
|
]
|
|
435
435
|
`;
|
|
436
436
|
|
|
437
|
-
exports[`
|
|
437
|
+
exports[`Menu component tests Menu open checkbox and divider 1`] = `
|
|
438
438
|
Array [
|
|
439
439
|
<View
|
|
440
440
|
accessibilityActions={Array []}
|
|
@@ -467,13 +467,13 @@ Array [
|
|
|
467
467
|
"backgroundColor": "#f3f2f1",
|
|
468
468
|
"borderColor": "#8a8886",
|
|
469
469
|
"borderRadius": 4,
|
|
470
|
-
"borderWidth": 1
|
|
470
|
+
"borderWidth": 1,
|
|
471
471
|
"display": "flex",
|
|
472
472
|
"flexDirection": "row",
|
|
473
473
|
"justifyContent": "center",
|
|
474
474
|
"minWidth": 96,
|
|
475
475
|
"padding": 8,
|
|
476
|
-
"paddingHorizontal":
|
|
476
|
+
"paddingHorizontal": 15,
|
|
477
477
|
"width": undefined,
|
|
478
478
|
}
|
|
479
479
|
}
|
|
@@ -654,7 +654,7 @@ Array [
|
|
|
654
654
|
Object {
|
|
655
655
|
"backgroundColor": "#d1d1d1",
|
|
656
656
|
"display": "flex",
|
|
657
|
-
"height": 1
|
|
657
|
+
"height": 1,
|
|
658
658
|
"margin": 4,
|
|
659
659
|
"marginVertical": undefined,
|
|
660
660
|
"width": undefined,
|
|
@@ -780,7 +780,7 @@ Array [
|
|
|
780
780
|
]
|
|
781
781
|
`;
|
|
782
782
|
|
|
783
|
-
exports[`
|
|
783
|
+
exports[`Menu component tests Menu open checkbox checked 1`] = `
|
|
784
784
|
Array [
|
|
785
785
|
<View
|
|
786
786
|
accessibilityActions={Array []}
|
|
@@ -813,13 +813,13 @@ Array [
|
|
|
813
813
|
"backgroundColor": "#f3f2f1",
|
|
814
814
|
"borderColor": "#8a8886",
|
|
815
815
|
"borderRadius": 4,
|
|
816
|
-
"borderWidth": 1
|
|
816
|
+
"borderWidth": 1,
|
|
817
817
|
"display": "flex",
|
|
818
818
|
"flexDirection": "row",
|
|
819
819
|
"justifyContent": "center",
|
|
820
820
|
"minWidth": 96,
|
|
821
821
|
"padding": 8,
|
|
822
|
-
"paddingHorizontal":
|
|
822
|
+
"paddingHorizontal": 15,
|
|
823
823
|
"width": undefined,
|
|
824
824
|
}
|
|
825
825
|
}
|
|
@@ -1000,7 +1000,7 @@ Array [
|
|
|
1000
1000
|
Object {
|
|
1001
1001
|
"backgroundColor": "#d1d1d1",
|
|
1002
1002
|
"display": "flex",
|
|
1003
|
-
"height": 1
|
|
1003
|
+
"height": 1,
|
|
1004
1004
|
"margin": 4,
|
|
1005
1005
|
"marginVertical": undefined,
|
|
1006
1006
|
"width": undefined,
|
|
@@ -1126,7 +1126,7 @@ Array [
|
|
|
1126
1126
|
]
|
|
1127
1127
|
`;
|
|
1128
1128
|
|
|
1129
|
-
exports[`
|
|
1129
|
+
exports[`Menu component tests Menu open checkbox defaultChecked 1`] = `
|
|
1130
1130
|
Array [
|
|
1131
1131
|
<View
|
|
1132
1132
|
accessibilityActions={Array []}
|
|
@@ -1159,13 +1159,13 @@ Array [
|
|
|
1159
1159
|
"backgroundColor": "#f3f2f1",
|
|
1160
1160
|
"borderColor": "#8a8886",
|
|
1161
1161
|
"borderRadius": 4,
|
|
1162
|
-
"borderWidth": 1
|
|
1162
|
+
"borderWidth": 1,
|
|
1163
1163
|
"display": "flex",
|
|
1164
1164
|
"flexDirection": "row",
|
|
1165
1165
|
"justifyContent": "center",
|
|
1166
1166
|
"minWidth": 96,
|
|
1167
1167
|
"padding": 8,
|
|
1168
|
-
"paddingHorizontal":
|
|
1168
|
+
"paddingHorizontal": 15,
|
|
1169
1169
|
"width": undefined,
|
|
1170
1170
|
}
|
|
1171
1171
|
}
|
|
@@ -1346,7 +1346,7 @@ Array [
|
|
|
1346
1346
|
Object {
|
|
1347
1347
|
"backgroundColor": "#d1d1d1",
|
|
1348
1348
|
"display": "flex",
|
|
1349
|
-
"height": 1
|
|
1349
|
+
"height": 1,
|
|
1350
1350
|
"margin": 4,
|
|
1351
1351
|
"marginVertical": undefined,
|
|
1352
1352
|
"width": undefined,
|
|
@@ -1472,7 +1472,7 @@ Array [
|
|
|
1472
1472
|
]
|
|
1473
1473
|
`;
|
|
1474
1474
|
|
|
1475
|
-
exports[`
|
|
1475
|
+
exports[`Menu component tests Menu open radio 1`] = `
|
|
1476
1476
|
Array [
|
|
1477
1477
|
<View
|
|
1478
1478
|
accessibilityActions={Array []}
|
|
@@ -1505,13 +1505,13 @@ Array [
|
|
|
1505
1505
|
"backgroundColor": "#f3f2f1",
|
|
1506
1506
|
"borderColor": "#8a8886",
|
|
1507
1507
|
"borderRadius": 4,
|
|
1508
|
-
"borderWidth": 1
|
|
1508
|
+
"borderWidth": 1,
|
|
1509
1509
|
"display": "flex",
|
|
1510
1510
|
"flexDirection": "row",
|
|
1511
1511
|
"justifyContent": "center",
|
|
1512
1512
|
"minWidth": 96,
|
|
1513
1513
|
"padding": 8,
|
|
1514
|
-
"paddingHorizontal":
|
|
1514
|
+
"paddingHorizontal": 15,
|
|
1515
1515
|
"width": undefined,
|
|
1516
1516
|
}
|
|
1517
1517
|
}
|
|
@@ -1806,7 +1806,7 @@ Array [
|
|
|
1806
1806
|
]
|
|
1807
1807
|
`;
|
|
1808
1808
|
|
|
1809
|
-
exports[`
|
|
1809
|
+
exports[`Menu component tests Menu submenu 1`] = `
|
|
1810
1810
|
Array [
|
|
1811
1811
|
<View
|
|
1812
1812
|
accessibilityActions={Array []}
|
|
@@ -1839,13 +1839,13 @@ Array [
|
|
|
1839
1839
|
"backgroundColor": "#f3f2f1",
|
|
1840
1840
|
"borderColor": "#8a8886",
|
|
1841
1841
|
"borderRadius": 4,
|
|
1842
|
-
"borderWidth": 1
|
|
1842
|
+
"borderWidth": 1,
|
|
1843
1843
|
"display": "flex",
|
|
1844
1844
|
"flexDirection": "row",
|
|
1845
1845
|
"justifyContent": "center",
|
|
1846
1846
|
"minWidth": 96,
|
|
1847
1847
|
"padding": 8,
|
|
1848
|
-
"paddingHorizontal":
|
|
1848
|
+
"paddingHorizontal": 15,
|
|
1849
1849
|
"width": undefined,
|
|
1850
1850
|
}
|
|
1851
1851
|
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { MenuTriggerChildProps, MenuTriggerState } from './MenuTrigger.types';
|
|
2
|
-
/**
|
|
3
|
-
* Creates a merged set of props between the MenuTrigger's child component's props
|
|
4
|
-
* and the props that the MenuTrigger wants its child to have.
|
|
5
|
-
*
|
|
6
|
-
* Because children are not accessible in the outer render, we deal with the merge in this function.
|
|
7
|
-
*/
|
|
8
|
-
export declare const getRevisedProps: typeof getRevisedPropsWorker;
|
|
9
|
-
declare function getRevisedPropsWorker(state: MenuTriggerState, props: any): MenuTriggerChildProps;
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=getRevisedProps.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getRevisedProps.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/getRevisedProps.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE9E;;;;;GAKG;AACH,eAAO,MAAM,eAAe,8BAAiC,CAAC;AAC9D,iBAAS,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,GAAG,qBAAqB,CAuCzF"}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { __assign, __spreadArray } from "tslib";
|
|
2
|
-
import { memoize } from '@fluentui-react-native/framework';
|
|
3
|
-
import { isMouseEvent } from '@fluentui-react-native/interactive-hooks';
|
|
4
|
-
/**
|
|
5
|
-
* Creates a merged set of props between the MenuTrigger's child component's props
|
|
6
|
-
* and the props that the MenuTrigger wants its child to have.
|
|
7
|
-
*
|
|
8
|
-
* Because children are not accessible in the outer render, we deal with the merge in this function.
|
|
9
|
-
*/
|
|
10
|
-
export var getRevisedProps = memoize(getRevisedPropsWorker);
|
|
11
|
-
function getRevisedPropsWorker(state, props) {
|
|
12
|
-
var revisedProps = __assign({}, state.props);
|
|
13
|
-
if (props.accessibilityState) {
|
|
14
|
-
revisedProps.accessibilityState = __assign(__assign({}, state.props.accessibilityState), props.accessibilityState);
|
|
15
|
-
}
|
|
16
|
-
if (props.accessibilityActions) {
|
|
17
|
-
revisedProps.accessibilityActions = __spreadArray(__spreadArray([], state.props.accessibilityActions, true), props.accessibilityActions, true);
|
|
18
|
-
}
|
|
19
|
-
if (props.onAccessibilityAction) {
|
|
20
|
-
revisedProps.onAccessibilityAction = function (e) {
|
|
21
|
-
state.props.onAccessibilityAction(e);
|
|
22
|
-
props.onAccessibilityAction(e);
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
if (props.onClick) {
|
|
26
|
-
revisedProps.onClick = function (e) {
|
|
27
|
-
state.props.onClick(e);
|
|
28
|
-
props.onClick(e);
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
if (props.onHoverIn) {
|
|
32
|
-
revisedProps.onHoverIn = function (e) {
|
|
33
|
-
state.props.onHoverIn(isMouseEvent(e) && e);
|
|
34
|
-
props.onHoverIn(e);
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
if (props.onHoverOut) {
|
|
38
|
-
revisedProps.onHoverOut = function (e) {
|
|
39
|
-
state.props.onHoverOut(isMouseEvent(e) && e);
|
|
40
|
-
props.onHoverOut(e);
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
return __assign({}, revisedProps);
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=getRevisedProps.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getRevisedProps.js","sourceRoot":"","sources":["../../src/MenuTrigger/getRevisedProps.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAC3D,OAAO,EAAoB,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAG1F;;;;;GAKG;AACH,MAAM,CAAC,IAAM,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAC9D,SAAS,qBAAqB,CAAC,KAAuB,EAAE,KAAU;IAChE,IAAM,YAAY,gBAAQ,KAAK,CAAC,KAAK,CAAE,CAAC;IACxC,IAAI,KAAK,CAAC,kBAAkB,EAAE;QAC5B,YAAY,CAAC,kBAAkB,yBAAQ,KAAK,CAAC,KAAK,CAAC,kBAAkB,GAAK,KAAK,CAAC,kBAAkB,CAAE,CAAC;KACtG;IAED,IAAI,KAAK,CAAC,oBAAoB,EAAE;QAC9B,YAAY,CAAC,oBAAoB,mCAAO,KAAK,CAAC,KAAK,CAAC,oBAAoB,SAAK,KAAK,CAAC,oBAAoB,OAAC,CAAC;KAC1G;IAED,IAAI,KAAK,CAAC,qBAAqB,EAAE;QAC/B,YAAY,CAAC,qBAAqB,GAAG,UAAC,CAA2B;YAC/D,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACrC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC;KACH;IAED,IAAI,KAAK,CAAC,OAAO,EAAE;QACjB,YAAY,CAAC,OAAO,GAAG,UAAC,CAAmB;YACzC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACvB,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACnB,CAAC,CAAC;KACH;IAED,IAAI,KAAK,CAAC,SAAS,EAAE;QACnB,YAAY,CAAC,SAAS,GAAG,UAAC,CAAmB;YAC3C,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5C,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC;KACH;IAED,IAAI,KAAK,CAAC,UAAU,EAAE;QACpB,YAAY,CAAC,UAAU,GAAG,UAAC,CAAmB;YAC5C,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC7C,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,CAAC;KACH;IAED,oBAAY,YAAY,EAAG;AAC7B,CAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { MenuTriggerChildProps, MenuTriggerState } from './MenuTrigger.types';
|
|
2
|
-
/**
|
|
3
|
-
* Creates a merged set of props between the MenuTrigger's child component's props
|
|
4
|
-
* and the props that the MenuTrigger wants its child to have.
|
|
5
|
-
*
|
|
6
|
-
* Because children are not accessible in the outer render, we deal with the merge in this function.
|
|
7
|
-
*/
|
|
8
|
-
export declare const getRevisedProps: typeof getRevisedPropsWorker;
|
|
9
|
-
declare function getRevisedPropsWorker(state: MenuTriggerState, props: any): MenuTriggerChildProps;
|
|
10
|
-
export {};
|
|
11
|
-
//# sourceMappingURL=getRevisedProps.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getRevisedProps.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/getRevisedProps.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE9E;;;;;GAKG;AACH,eAAO,MAAM,eAAe,8BAAiC,CAAC;AAC9D,iBAAS,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,GAAG,GAAG,qBAAqB,CAuCzF"}
|