@fluentui-react-native/menu 0.9.2 → 0.11.0

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.
Files changed (194) hide show
  1. package/CHANGELOG.json +114 -1
  2. package/CHANGELOG.md +40 -2
  3. package/lib/Menu/useMenu.d.ts.map +1 -1
  4. package/lib/Menu/useMenu.js +5 -1
  5. package/lib/Menu/useMenu.js.map +1 -1
  6. package/lib/MenuItem/MenuItem.d.ts.map +1 -1
  7. package/lib/MenuItem/MenuItem.js +4 -2
  8. package/lib/MenuItem/MenuItem.js.map +1 -1
  9. package/lib/MenuItem/MenuItem.styling.d.ts.map +1 -1
  10. package/lib/MenuItem/MenuItem.styling.js +6 -0
  11. package/lib/MenuItem/MenuItem.styling.js.map +1 -1
  12. package/lib/MenuItem/MenuItem.types.d.ts +2 -0
  13. package/lib/MenuItem/MenuItem.types.d.ts.map +1 -1
  14. package/lib/MenuItem/MenuItemTokens.d.ts.map +1 -1
  15. package/lib/MenuItem/MenuItemTokens.js +2 -0
  16. package/lib/MenuItem/MenuItemTokens.js.map +1 -1
  17. package/lib/MenuItem/MenuItemTokens.win32.d.ts.map +1 -1
  18. package/lib/MenuItem/MenuItemTokens.win32.js +2 -0
  19. package/lib/MenuItem/MenuItemTokens.win32.js.map +1 -1
  20. package/lib/MenuItem/useMenuItem.d.ts.map +1 -1
  21. package/lib/MenuItem/useMenuItem.js +3 -1
  22. package/lib/MenuItem/useMenuItem.js.map +1 -1
  23. package/lib/MenuItemCheckbox/MenuItemCheckbox.d.ts +4 -2
  24. package/lib/MenuItemCheckbox/MenuItemCheckbox.d.ts.map +1 -1
  25. package/lib/MenuItemCheckbox/MenuItemCheckbox.js +11 -8
  26. package/lib/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
  27. package/lib/MenuItemCheckbox/useMenuItemCheckbox.d.ts +10 -0
  28. package/lib/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
  29. package/lib/MenuItemCheckbox/useMenuItemCheckbox.js +28 -14
  30. package/lib/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  31. package/lib/MenuItemRadio/MenuItemRadio.d.ts +4 -0
  32. package/lib/MenuItemRadio/MenuItemRadio.d.ts.map +1 -0
  33. package/lib/MenuItemRadio/MenuItemRadio.js +12 -0
  34. package/lib/MenuItemRadio/MenuItemRadio.js.map +1 -0
  35. package/lib/MenuItemRadio/useMenuItemRadio.d.ts +3 -0
  36. package/lib/MenuItemRadio/useMenuItemRadio.d.ts.map +1 -0
  37. package/lib/MenuItemRadio/useMenuItemRadio.js +15 -0
  38. package/lib/MenuItemRadio/useMenuItemRadio.js.map +1 -0
  39. package/lib/MenuList/MenuList.d.ts +0 -1
  40. package/lib/MenuList/MenuList.d.ts.map +1 -1
  41. package/lib/MenuList/MenuList.js +23 -5
  42. package/lib/MenuList/MenuList.js.map +1 -1
  43. package/lib/MenuList/MenuList.styling.d.ts.map +1 -1
  44. package/lib/MenuList/MenuList.styling.js +2 -1
  45. package/lib/MenuList/MenuList.styling.js.map +1 -1
  46. package/lib/MenuList/MenuList.types.d.ts +5 -1
  47. package/lib/MenuList/MenuList.types.d.ts.map +1 -1
  48. package/lib/MenuList/MenuListTokens.d.ts.map +1 -1
  49. package/lib/MenuList/MenuListTokens.js +1 -0
  50. package/lib/MenuList/MenuListTokens.js.map +1 -1
  51. package/lib/MenuList/useMenuList.d.ts.map +1 -1
  52. package/lib/MenuList/useMenuList.js +13 -3
  53. package/lib/MenuList/useMenuList.js.map +1 -1
  54. package/lib/MenuList/{useMenuContextValue.d.ts → useMenuListContextValue.d.ts} +1 -1
  55. package/lib/MenuList/useMenuListContextValue.d.ts.map +1 -0
  56. package/lib/MenuList/{useMenuContextValue.js → useMenuListContextValue.js} +1 -1
  57. package/lib/MenuList/useMenuListContextValue.js.map +1 -0
  58. package/lib/MenuPopover/MenuPopover.d.ts.map +1 -1
  59. package/lib/MenuPopover/MenuPopover.js +1 -1
  60. package/lib/MenuPopover/MenuPopover.js.map +1 -1
  61. package/lib/MenuPopover/MenuPopover.types.d.ts +4 -1
  62. package/lib/MenuPopover/MenuPopover.types.d.ts.map +1 -1
  63. package/lib/MenuPopover/useMenuPopover.d.ts.map +1 -1
  64. package/lib/MenuPopover/useMenuPopover.js +16 -1
  65. package/lib/MenuPopover/useMenuPopover.js.map +1 -1
  66. package/lib/MenuTrigger/MenuTrigger.d.ts.map +1 -1
  67. package/lib/MenuTrigger/MenuTrigger.js +4 -3
  68. package/lib/MenuTrigger/MenuTrigger.js.map +1 -1
  69. package/lib/MenuTrigger/MenuTrigger.types.d.ts +11 -2
  70. package/lib/MenuTrigger/MenuTrigger.types.d.ts.map +1 -1
  71. package/lib/MenuTrigger/MenuTrigger.types.js.map +1 -1
  72. package/lib/MenuTrigger/useMenuTrigger.d.ts +2 -8
  73. package/lib/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
  74. package/lib/MenuTrigger/useMenuTrigger.js +14 -1
  75. package/lib/MenuTrigger/useMenuTrigger.js.map +1 -1
  76. package/lib/context/menuTriggerContext.d.ts +9 -0
  77. package/lib/context/menuTriggerContext.d.ts.map +1 -0
  78. package/lib/context/menuTriggerContext.js +9 -0
  79. package/lib/context/menuTriggerContext.js.map +1 -0
  80. package/lib/index.d.ts +1 -0
  81. package/lib/index.d.ts.map +1 -1
  82. package/lib/index.js +1 -0
  83. package/lib/index.js.map +1 -1
  84. package/lib-commonjs/Menu/useMenu.d.ts.map +1 -1
  85. package/lib-commonjs/Menu/useMenu.js +5 -1
  86. package/lib-commonjs/Menu/useMenu.js.map +1 -1
  87. package/lib-commonjs/MenuItem/MenuItem.d.ts.map +1 -1
  88. package/lib-commonjs/MenuItem/MenuItem.js +3 -1
  89. package/lib-commonjs/MenuItem/MenuItem.js.map +1 -1
  90. package/lib-commonjs/MenuItem/MenuItem.styling.d.ts.map +1 -1
  91. package/lib-commonjs/MenuItem/MenuItem.styling.js +6 -0
  92. package/lib-commonjs/MenuItem/MenuItem.styling.js.map +1 -1
  93. package/lib-commonjs/MenuItem/MenuItem.types.d.ts +2 -0
  94. package/lib-commonjs/MenuItem/MenuItem.types.d.ts.map +1 -1
  95. package/lib-commonjs/MenuItem/MenuItemTokens.d.ts.map +1 -1
  96. package/lib-commonjs/MenuItem/MenuItemTokens.js +2 -0
  97. package/lib-commonjs/MenuItem/MenuItemTokens.js.map +1 -1
  98. package/lib-commonjs/MenuItem/MenuItemTokens.win32.d.ts.map +1 -1
  99. package/lib-commonjs/MenuItem/MenuItemTokens.win32.js +2 -0
  100. package/lib-commonjs/MenuItem/MenuItemTokens.win32.js.map +1 -1
  101. package/lib-commonjs/MenuItem/useMenuItem.d.ts.map +1 -1
  102. package/lib-commonjs/MenuItem/useMenuItem.js +3 -1
  103. package/lib-commonjs/MenuItem/useMenuItem.js.map +1 -1
  104. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.d.ts +4 -2
  105. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.d.ts.map +1 -1
  106. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.js +12 -8
  107. package/lib-commonjs/MenuItemCheckbox/MenuItemCheckbox.js.map +1 -1
  108. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.d.ts +10 -0
  109. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.d.ts.map +1 -1
  110. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js +31 -16
  111. package/lib-commonjs/MenuItemCheckbox/useMenuItemCheckbox.js.map +1 -1
  112. package/lib-commonjs/MenuItemRadio/MenuItemRadio.d.ts +4 -0
  113. package/lib-commonjs/MenuItemRadio/MenuItemRadio.d.ts.map +1 -0
  114. package/lib-commonjs/MenuItemRadio/MenuItemRadio.js +15 -0
  115. package/lib-commonjs/MenuItemRadio/MenuItemRadio.js.map +1 -0
  116. package/lib-commonjs/MenuItemRadio/useMenuItemRadio.d.ts +3 -0
  117. package/lib-commonjs/MenuItemRadio/useMenuItemRadio.d.ts.map +1 -0
  118. package/lib-commonjs/MenuItemRadio/useMenuItemRadio.js +20 -0
  119. package/lib-commonjs/MenuItemRadio/useMenuItemRadio.js.map +1 -0
  120. package/lib-commonjs/MenuList/MenuList.d.ts +0 -1
  121. package/lib-commonjs/MenuList/MenuList.d.ts.map +1 -1
  122. package/lib-commonjs/MenuList/MenuList.js +22 -4
  123. package/lib-commonjs/MenuList/MenuList.js.map +1 -1
  124. package/lib-commonjs/MenuList/MenuList.styling.d.ts.map +1 -1
  125. package/lib-commonjs/MenuList/MenuList.styling.js +2 -1
  126. package/lib-commonjs/MenuList/MenuList.styling.js.map +1 -1
  127. package/lib-commonjs/MenuList/MenuList.types.d.ts +5 -1
  128. package/lib-commonjs/MenuList/MenuList.types.d.ts.map +1 -1
  129. package/lib-commonjs/MenuList/MenuListTokens.d.ts.map +1 -1
  130. package/lib-commonjs/MenuList/MenuListTokens.js +1 -0
  131. package/lib-commonjs/MenuList/MenuListTokens.js.map +1 -1
  132. package/lib-commonjs/MenuList/useMenuList.d.ts.map +1 -1
  133. package/lib-commonjs/MenuList/useMenuList.js +13 -3
  134. package/lib-commonjs/MenuList/useMenuList.js.map +1 -1
  135. package/lib-commonjs/MenuList/{useMenuContextValue.d.ts → useMenuListContextValue.d.ts} +1 -1
  136. package/lib-commonjs/MenuList/useMenuListContextValue.d.ts.map +1 -0
  137. package/lib-commonjs/MenuList/{useMenuContextValue.js → useMenuListContextValue.js} +1 -1
  138. package/lib-commonjs/MenuList/useMenuListContextValue.js.map +1 -0
  139. package/lib-commonjs/MenuPopover/MenuPopover.d.ts.map +1 -1
  140. package/lib-commonjs/MenuPopover/MenuPopover.js +1 -1
  141. package/lib-commonjs/MenuPopover/MenuPopover.js.map +1 -1
  142. package/lib-commonjs/MenuPopover/MenuPopover.types.d.ts +4 -1
  143. package/lib-commonjs/MenuPopover/MenuPopover.types.d.ts.map +1 -1
  144. package/lib-commonjs/MenuPopover/useMenuPopover.d.ts.map +1 -1
  145. package/lib-commonjs/MenuPopover/useMenuPopover.js +16 -1
  146. package/lib-commonjs/MenuPopover/useMenuPopover.js.map +1 -1
  147. package/lib-commonjs/MenuTrigger/MenuTrigger.d.ts.map +1 -1
  148. package/lib-commonjs/MenuTrigger/MenuTrigger.js +4 -3
  149. package/lib-commonjs/MenuTrigger/MenuTrigger.js.map +1 -1
  150. package/lib-commonjs/MenuTrigger/MenuTrigger.types.d.ts +11 -2
  151. package/lib-commonjs/MenuTrigger/MenuTrigger.types.d.ts.map +1 -1
  152. package/lib-commonjs/MenuTrigger/MenuTrigger.types.js.map +1 -1
  153. package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts +2 -8
  154. package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
  155. package/lib-commonjs/MenuTrigger/useMenuTrigger.js +14 -1
  156. package/lib-commonjs/MenuTrigger/useMenuTrigger.js.map +1 -1
  157. package/lib-commonjs/context/menuTriggerContext.d.ts +9 -0
  158. package/lib-commonjs/context/menuTriggerContext.d.ts.map +1 -0
  159. package/lib-commonjs/context/menuTriggerContext.js +14 -0
  160. package/lib-commonjs/context/menuTriggerContext.js.map +1 -0
  161. package/lib-commonjs/index.d.ts +1 -0
  162. package/lib-commonjs/index.d.ts.map +1 -1
  163. package/lib-commonjs/index.js +3 -1
  164. package/lib-commonjs/index.js.map +1 -1
  165. package/package.json +7 -7
  166. package/src/Menu/useMenu.ts +6 -0
  167. package/src/MenuItem/MenuItem.styling.ts +7 -0
  168. package/src/MenuItem/MenuItem.tsx +10 -5
  169. package/src/MenuItem/MenuItem.types.ts +2 -0
  170. package/src/MenuItem/MenuItemTokens.ts +2 -0
  171. package/src/MenuItem/MenuItemTokens.win32.ts +2 -0
  172. package/src/MenuItem/useMenuItem.ts +3 -1
  173. package/src/MenuItemCheckbox/MenuItemCheckbox.tsx +29 -16
  174. package/src/MenuItemCheckbox/useMenuItemCheckbox.ts +39 -20
  175. package/src/MenuItemRadio/MenuItemRadio.tsx +16 -0
  176. package/src/MenuItemRadio/useMenuItemRadio.ts +21 -0
  177. package/src/MenuList/MenuList.styling.ts +2 -1
  178. package/src/MenuList/MenuList.tsx +23 -5
  179. package/src/MenuList/MenuList.types.ts +5 -2
  180. package/src/MenuList/MenuListTokens.ts +1 -0
  181. package/src/MenuList/useMenuList.ts +22 -3
  182. package/src/MenuList/{useMenuContextValue.ts → useMenuListContextValue.ts} +0 -0
  183. package/src/MenuPopover/MenuPopover.tsx +3 -0
  184. package/src/MenuPopover/MenuPopover.types.ts +4 -1
  185. package/src/MenuPopover/useMenuPopover.ts +21 -2
  186. package/src/MenuTrigger/MenuTrigger.tsx +4 -3
  187. package/src/MenuTrigger/MenuTrigger.types.ts +14 -3
  188. package/src/MenuTrigger/useMenuTrigger.ts +18 -3
  189. package/src/context/menuTriggerContext.ts +10 -0
  190. package/src/index.ts +1 -0
  191. package/lib/MenuList/useMenuContextValue.d.ts.map +0 -1
  192. package/lib/MenuList/useMenuContextValue.js.map +0 -1
  193. package/lib-commonjs/MenuList/useMenuContextValue.d.ts.map +0 -1
  194. package/lib-commonjs/MenuList/useMenuContextValue.js.map +0 -1
@@ -4,7 +4,9 @@ import { IBackgroundColorTokens, LayoutTokens } from '@fluentui-react-native/tok
4
4
 
5
5
  export const menuListName = 'MenuList';
6
6
 
7
- export interface MenuListTokens extends LayoutTokens, IBackgroundColorTokens {}
7
+ export interface MenuListTokens extends LayoutTokens, IBackgroundColorTokens {
8
+ gap?: number;
9
+ }
8
10
 
9
11
  export interface MenuListProps extends Omit<IViewProps, 'onPress'> {
10
12
  checked?: Record<string, boolean>;
@@ -15,10 +17,11 @@ export interface MenuListProps extends Omit<IViewProps, 'onPress'> {
15
17
 
16
18
  export interface MenuListState extends MenuListProps {
17
19
  isCheckedControlled: boolean;
20
+ selectRadio?: (e: InteractionEvent, name: string, isChecked: boolean) => void;
18
21
  }
19
22
 
20
23
  export interface MenuListSlotProps {
21
- root: React.PropsWithRef<IViewProps>;
24
+ root: React.PropsWithRef<IViewProps> & { gap?: number };
22
25
  }
23
26
  export interface MenuListType {
24
27
  props: MenuListProps;
@@ -8,4 +8,5 @@ export const defaultMenuListTokens: TokenSettings<MenuListTokens, Theme> = (t: T
8
8
  minWidth: 128,
9
9
  maxWidth: 300,
10
10
  backgroundColor: t.colors.neutralBackground1,
11
+ gap: globalTokens.spacing.xxs,
11
12
  });
@@ -9,20 +9,25 @@ export const useMenuList = (_props: MenuListProps): MenuListState => {
9
9
  // MenuList v2 needs to be able to be standalone, but this is not in scope for v1
10
10
  // Assuming that checked information will come from parent Menu
11
11
  const isCheckedControlled = typeof context.checked !== 'undefined';
12
- const [checked, onCheckedChange] = useMenuCheckedState(isCheckedControlled, context);
12
+ const [checked, onCheckedChange, selectRadio] = useMenuCheckedState(isCheckedControlled, context);
13
13
 
14
14
  return {
15
15
  ...context,
16
16
  isCheckedControlled,
17
17
  checked,
18
18
  onCheckedChange,
19
+ selectRadio,
19
20
  };
20
21
  };
21
22
 
22
23
  const useMenuCheckedState = (
23
24
  isControlled: boolean,
24
25
  props: MenuListProps,
25
- ): [Record<string, boolean>, (e: InteractionEvent, name: string, isChecked: boolean) => void] => {
26
+ ): [
27
+ Record<string, boolean>,
28
+ (e: InteractionEvent, name: string, isChecked: boolean) => void,
29
+ (e: InteractionEvent, name: string, isChecked: boolean) => void,
30
+ ] => {
26
31
  const { defaultChecked, onCheckedChange, checked } = props;
27
32
  const initialState = defaultChecked ?? checked ?? {};
28
33
  const [checkedInternal, setCheckedInternal] = React.useState<Record<string, boolean>>(initialState);
@@ -45,5 +50,19 @@ const useMenuCheckedState = (
45
50
  [isControlled, state, onCheckedChange, setCheckedInternal],
46
51
  );
47
52
 
48
- return [state, setChecked];
53
+ const selectRadio = React.useCallback(
54
+ (e: InteractionEvent, name: string, isChecked: boolean) => {
55
+ if (!isControlled) {
56
+ const updatedChecked = { [name]: true };
57
+ setCheckedInternal(updatedChecked);
58
+ }
59
+
60
+ if (onCheckedChange) {
61
+ onCheckedChange(e, name, isChecked);
62
+ }
63
+ },
64
+ [isControlled, onCheckedChange, setCheckedInternal],
65
+ );
66
+
67
+ return [state, setChecked, selectRadio];
49
68
  };
@@ -16,6 +16,9 @@ export const MenuPopover = stagedComponent((props: MenuPopoverProps) => {
16
16
  target={state.triggerRef}
17
17
  onDismiss={state.onDismiss}
18
18
  dismissBehaviors={state.dismissBehaviors}
19
+ setInitialFocus={state.setInitialFocus}
20
+ directionalHint={state.directionalHint}
21
+ doNotTakePointerCapture={state.doNotTakePointerCapture}
19
22
  >
20
23
  {children}
21
24
  </Callout>
@@ -1,12 +1,15 @@
1
1
  import type { IViewProps } from '@fluentui-react-native/adapters';
2
- import { DismissBehaviors } from '@fluentui-react-native/callout';
2
+ import { DirectionalHint, DismissBehaviors } from '@fluentui-react-native/callout';
3
3
 
4
4
  export const menuPopoverName = 'MenuPopover';
5
5
 
6
6
  export interface MenuPopoverProps extends Omit<IViewProps, 'onPress'> {}
7
7
 
8
8
  export interface MenuPopoverState {
9
+ directionalHint?: DirectionalHint;
9
10
  dismissBehaviors: DismissBehaviors[];
11
+ doNotTakePointerCapture: boolean;
10
12
  onDismiss: () => void;
13
+ setInitialFocus: boolean;
11
14
  triggerRef: React.RefObject<React.Component>;
12
15
  }
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import { DismissBehaviors } from '@fluentui-react-native/callout';
2
+ import { I18nManager, Platform } from 'react-native';
3
+ import { DirectionalHint, DismissBehaviors } from '@fluentui-react-native/callout';
3
4
  import { useMenuContext } from '../context/menuContext';
4
5
  import { MenuPopoverProps, MenuPopoverState } from './MenuPopover.types';
5
6
 
@@ -12,6 +13,24 @@ export const useMenuPopover = (_props: MenuPopoverProps): MenuPopoverState => {
12
13
  const dismissBehaviors = context.isControlled
13
14
  ? (['preventDismissOnKeyDown', 'preventDismissOnClickOutside'] as DismissBehaviors[])
14
15
  : undefined;
16
+ const directionalHint = getDirectionalHint(context.isSubmenu, I18nManager.isRTL);
15
17
 
16
- return { triggerRef, onDismiss, dismissBehaviors };
18
+ // Initial focus behavior differs per platform, Windows platforms move focus
19
+ // automatically onto first element of Callout
20
+ const setInitialFocus = Platform.OS === ('win32' as any) || Platform.OS === 'windows';
21
+ const doNotTakePointerCapture = context.openOnHover;
22
+
23
+ return { triggerRef, onDismiss, directionalHint, dismissBehaviors, doNotTakePointerCapture, setInitialFocus };
24
+ };
25
+
26
+ const getDirectionalHint = (isSubmenu: boolean, isRtl: boolean): DirectionalHint | undefined => {
27
+ if (!isSubmenu) {
28
+ return undefined;
29
+ }
30
+
31
+ if (isRtl) {
32
+ return 'leftTopEdge';
33
+ }
34
+
35
+ return 'rightTopEdge';
17
36
  };
@@ -2,9 +2,10 @@ import React from 'react';
2
2
  import { stagedComponent } from '@fluentui-react-native/framework';
3
3
  import { menuTriggerName, MenuTriggerProps } from './MenuTrigger.types';
4
4
  import { useMenuTrigger } from './useMenuTrigger';
5
+ import { MenuTriggerProvider } from '../context/menuTriggerContext';
5
6
 
6
7
  export const MenuTrigger = stagedComponent((props: MenuTriggerProps) => {
7
- const state = useMenuTrigger(props);
8
+ const menuTrigger = useMenuTrigger(props);
8
9
 
9
10
  return (_rest: MenuTriggerProps, children: React.ReactNode) => {
10
11
  const childrenArray = React.Children.toArray(children) as React.ReactElement[];
@@ -16,9 +17,9 @@ export const MenuTrigger = stagedComponent((props: MenuTriggerProps) => {
16
17
  }
17
18
 
18
19
  const child = childrenArray[0];
19
- const revised = React.cloneElement(child, state);
20
+ const revised = React.cloneElement(child, menuTrigger.props);
20
21
 
21
- return <>{revised}</>;
22
+ return <MenuTriggerProvider value={menuTrigger.hasSubmenu}>{revised}</MenuTriggerProvider>;
22
23
  };
23
24
  });
24
25
  MenuTrigger.displayName = menuTriggerName;
@@ -1,7 +1,18 @@
1
- import type { IViewProps } from '@fluentui-react-native/adapters';
1
+ import { InteractionEvent, IWithPressableOptions } from '@fluentui-react-native/interactive-hooks';
2
+ import { ViewProps } from 'react-native';
2
3
 
3
4
  export const menuTriggerName = 'MenuTrigger';
4
5
 
5
- export interface MenuTriggerProps extends Omit<IViewProps, 'onPress'> {}
6
+ export interface MenuTriggerProps extends Omit<IWithPressableOptions<ViewProps>, 'onPress'> {
7
+ /**
8
+ * A RefObject to refer to the trigger component.
9
+ */
10
+ componentRef?: React.RefObject<React.Component>;
6
11
 
7
- export interface MenuTriggerState {}
12
+ onClick?: (e: InteractionEvent) => void;
13
+ }
14
+
15
+ export interface MenuTriggerState {
16
+ props: MenuTriggerProps;
17
+ hasSubmenu: boolean;
18
+ }
@@ -1,8 +1,9 @@
1
1
  import { useMenuContext } from '../context/menuContext';
2
2
  import { InteractionEvent } from '@fluentui-react-native/interactive-hooks';
3
- import { MenuTriggerProps } from './MenuTrigger.types';
3
+ import { MenuTriggerProps, MenuTriggerState } from './MenuTrigger.types';
4
+ import { Platform } from 'react-native';
4
5
 
5
- export const useMenuTrigger = (_props: MenuTriggerProps) => {
6
+ export const useMenuTrigger = (_props: MenuTriggerProps): MenuTriggerState => {
6
7
  const context = useMenuContext();
7
8
 
8
9
  const setOpen = context.setOpen;
@@ -10,15 +11,29 @@ export const useMenuTrigger = (_props: MenuTriggerProps) => {
10
11
  const openOnHover = context.openOnHover;
11
12
  const triggerRef = context.triggerRef;
12
13
 
14
+ const delayHover = Platform.select({
15
+ macos: 100,
16
+ default: 500, // win32
17
+ });
18
+
13
19
  const onHoverIn = (e: InteractionEvent) => {
14
20
  if (openOnHover) {
15
21
  setOpen(e, true /* isOpen */);
16
22
  }
17
23
  };
18
24
 
25
+ const onHoverOut = (e: InteractionEvent) => {
26
+ if (openOnHover) {
27
+ setOpen(e, false /* isOpen */);
28
+ }
29
+ };
30
+
19
31
  const onClick = (e: InteractionEvent) => {
20
32
  setOpen(e, !open);
21
33
  };
22
34
 
23
- return { onClick, onHoverIn, componentRef: triggerRef };
35
+ return {
36
+ props: { onClick, onHoverIn, onHoverOut, componentRef: triggerRef, delayHoverIn: delayHover, delayHoverOut: delayHover },
37
+ hasSubmenu: context.isSubmenu,
38
+ };
24
39
  };
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+
3
+ /**
4
+ * This context keeps track of whether a trigger component is for a submenu.
5
+ * This allows the trigger to show a submenu indicator.
6
+ */
7
+ export const MenuTriggerContext = React.createContext<boolean>(false);
8
+
9
+ export const MenuTriggerProvider = MenuTriggerContext.Provider;
10
+ export const useMenuTriggerContext = () => React.useContext(MenuTriggerContext);
package/src/index.ts CHANGED
@@ -3,5 +3,6 @@ export { MenuTrigger } from './MenuTrigger/MenuTrigger';
3
3
  export { MenuPopover } from './MenuPopover/MenuPopover';
4
4
  export { MenuItem } from './MenuItem/MenuItem';
5
5
  export { MenuItemCheckbox } from './MenuItemCheckbox/MenuItemCheckbox';
6
+ export { MenuItemRadio } from './MenuItemRadio/MenuItemRadio';
6
7
  export { MenuList } from './MenuList/MenuList';
7
8
  export { MenuDivider } from './MenuDivider/MenuDivider';
@@ -1 +0,0 @@
1
- {"version":3,"file":"useMenuContextValue.d.ts","sourceRoot":"","sources":["../../src/MenuList/useMenuContextValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,eAAO,MAAM,uBAAuB,UAAW,aAAa,KAAG,oBAE9D,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useMenuContextValue.js","sourceRoot":"","sources":["../../src/MenuList/useMenuContextValue.ts"],"names":[],"mappings":";AAGA,MAAM,CAAC,IAAM,uBAAuB,GAAG,UAAC,KAAoB;IAC1D,oBAAY,KAAK,EAAG;AACtB,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useMenuContextValue.d.ts","sourceRoot":"","sources":["../../src/MenuList/useMenuContextValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,eAAO,MAAM,uBAAuB,UAAW,aAAa,KAAG,oBAE9D,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useMenuContextValue.js","sourceRoot":"","sources":["../../src/MenuList/useMenuContextValue.ts"],"names":[],"mappings":";;;;AAGO,IAAM,uBAAuB,GAAG,UAAC,KAAoB;IAC1D,iCAAY,KAAK,EAAG;AACtB,CAAC,CAAC;AAFW,QAAA,uBAAuB,2BAElC"}