@fluentui-react-native/menu 0.13.1 → 0.14.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 (38) hide show
  1. package/CHANGELOG.json +16 -1
  2. package/CHANGELOG.md +10 -2
  3. package/jest.config.js +2 -0
  4. package/lib/Menu/useMenu.js +1 -1
  5. package/lib/Menu/useMenu.js.map +1 -1
  6. package/lib/MenuPopover/useMenuPopover.d.ts.map +1 -1
  7. package/lib/MenuPopover/useMenuPopover.js +2 -1
  8. package/lib/MenuPopover/useMenuPopover.js.map +1 -1
  9. package/lib/MenuTrigger/MenuTrigger.js +4 -4
  10. package/lib/MenuTrigger/MenuTrigger.js.map +1 -1
  11. package/lib/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
  12. package/lib/MenuTrigger/useMenuTrigger.js +3 -1
  13. package/lib/MenuTrigger/useMenuTrigger.js.map +1 -1
  14. package/lib/__tests__/Menu.test.d.ts +2 -0
  15. package/lib/__tests__/Menu.test.d.ts.map +1 -0
  16. package/lib/__tests__/Menu.test.js +145 -0
  17. package/lib/__tests__/Menu.test.js.map +1 -0
  18. package/lib-commonjs/Menu/useMenu.js +1 -1
  19. package/lib-commonjs/Menu/useMenu.js.map +1 -1
  20. package/lib-commonjs/MenuPopover/useMenuPopover.d.ts.map +1 -1
  21. package/lib-commonjs/MenuPopover/useMenuPopover.js +2 -1
  22. package/lib-commonjs/MenuPopover/useMenuPopover.js.map +1 -1
  23. package/lib-commonjs/MenuTrigger/MenuTrigger.js +4 -4
  24. package/lib-commonjs/MenuTrigger/MenuTrigger.js.map +1 -1
  25. package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
  26. package/lib-commonjs/MenuTrigger/useMenuTrigger.js +3 -1
  27. package/lib-commonjs/MenuTrigger/useMenuTrigger.js.map +1 -1
  28. package/lib-commonjs/__tests__/Menu.test.d.ts +2 -0
  29. package/lib-commonjs/__tests__/Menu.test.d.ts.map +1 -0
  30. package/lib-commonjs/__tests__/Menu.test.js +148 -0
  31. package/lib-commonjs/__tests__/Menu.test.js.map +1 -0
  32. package/package.json +3 -1
  33. package/src/Menu/useMenu.ts +1 -1
  34. package/src/MenuPopover/useMenuPopover.ts +3 -1
  35. package/src/MenuTrigger/MenuTrigger.tsx +4 -4
  36. package/src/MenuTrigger/useMenuTrigger.ts +3 -1
  37. package/src/__tests__/Menu.test.tsx +235 -0
  38. package/src/__tests__/__snapshots__/Menu.test.tsx.snap +2098 -0
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ var React = (0, tslib_1.__importStar)(require("react"));
5
+ var renderer = (0, tslib_1.__importStar)(require("react-test-renderer"));
6
+ var Menu_1 = require("../Menu/Menu");
7
+ var test_tools_1 = require("@fluentui-react-native/test-tools");
8
+ var MenuTrigger_1 = (0, tslib_1.__importDefault)(require("../MenuTrigger/MenuTrigger"));
9
+ var button_1 = require("@fluentui-react-native/button");
10
+ var MenuPopover_1 = (0, tslib_1.__importDefault)(require("../MenuPopover/MenuPopover"));
11
+ var MenuList_1 = require("../MenuList/MenuList");
12
+ var MenuItem_1 = require("../MenuItem/MenuItem");
13
+ var MenuItemCheckbox_1 = require("../MenuItemCheckbox/MenuItemCheckbox");
14
+ var MenuDivider_1 = require("../MenuDivider/MenuDivider");
15
+ var MenuItemRadio_1 = require("../MenuItemRadio/MenuItemRadio");
16
+ describe('Checkbox component tests', function () {
17
+ it('Menu default', function () {
18
+ var tree = renderer
19
+ .create(React.createElement(Menu_1.Menu, null,
20
+ React.createElement(MenuTrigger_1.default, null,
21
+ React.createElement(button_1.ButtonV1, null, "Default")),
22
+ React.createElement(MenuPopover_1.default, null,
23
+ React.createElement(MenuList_1.MenuList, null,
24
+ React.createElement(MenuItem_1.MenuItem, { content: "Option 1" })))))
25
+ .toJSON();
26
+ expect(tree).toMatchSnapshot();
27
+ });
28
+ it('Menu open', function () {
29
+ var tree = renderer
30
+ .create(React.createElement(Menu_1.Menu, { open: true },
31
+ React.createElement(MenuTrigger_1.default, null,
32
+ React.createElement(button_1.ButtonV1, null, "Open")),
33
+ React.createElement(MenuPopover_1.default, null,
34
+ React.createElement(MenuList_1.MenuList, null,
35
+ React.createElement(MenuItem_1.MenuItem, { content: "Option 1" })))))
36
+ .toJSON();
37
+ expect(tree).toMatchSnapshot();
38
+ });
39
+ it('Menu defaultOpen', function () {
40
+ var tree = renderer
41
+ .create(React.createElement(Menu_1.Menu, { defaultOpen: true },
42
+ React.createElement(MenuTrigger_1.default, null,
43
+ React.createElement(button_1.ButtonV1, null, "Open")),
44
+ React.createElement(MenuPopover_1.default, null,
45
+ React.createElement(MenuList_1.MenuList, null,
46
+ React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }),
47
+ React.createElement(MenuItem_1.MenuItem, { disabled: true, content: "Option 2" })))))
48
+ .toJSON();
49
+ expect(tree).toMatchSnapshot();
50
+ });
51
+ it('Menu open checkbox and divider', function () {
52
+ var tree = renderer
53
+ .create(React.createElement(Menu_1.Menu, { open: true },
54
+ React.createElement(MenuTrigger_1.default, null,
55
+ React.createElement(button_1.ButtonV1, null, "Open")),
56
+ React.createElement(MenuPopover_1.default, null,
57
+ React.createElement(MenuList_1.MenuList, null,
58
+ React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 1", name: "Option 1" }),
59
+ React.createElement(MenuDivider_1.MenuDivider, null),
60
+ React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { disabled: true, content: "Option 2", name: "Option 2" })))))
61
+ .toJSON();
62
+ expect(tree).toMatchSnapshot();
63
+ });
64
+ it('Menu open radio', function () {
65
+ var tree = renderer
66
+ .create(React.createElement(Menu_1.Menu, { open: true },
67
+ React.createElement(MenuTrigger_1.default, null,
68
+ React.createElement(button_1.ButtonV1, null, "Open")),
69
+ React.createElement(MenuPopover_1.default, null,
70
+ React.createElement(MenuList_1.MenuList, null,
71
+ React.createElement(MenuItemRadio_1.MenuItemRadio, { content: "Option 1", name: "Option 1" }),
72
+ React.createElement(MenuItemRadio_1.MenuItemRadio, { content: "Option 2", name: "Option 2" })))))
73
+ .toJSON();
74
+ expect(tree).toMatchSnapshot();
75
+ });
76
+ it('Menu open checkbox defaultChecked', function () {
77
+ var tree = renderer
78
+ .create(React.createElement(Menu_1.Menu, { open: true, defaultChecked: { 'Option 1': true } },
79
+ React.createElement(MenuTrigger_1.default, null,
80
+ React.createElement(button_1.ButtonV1, null, "Open")),
81
+ React.createElement(MenuPopover_1.default, null,
82
+ React.createElement(MenuList_1.MenuList, null,
83
+ React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 1", name: "Option 1" }),
84
+ React.createElement(MenuDivider_1.MenuDivider, null),
85
+ React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 2", name: "Option 2" })))))
86
+ .toJSON();
87
+ expect(tree).toMatchSnapshot();
88
+ });
89
+ it('Menu open checkbox checked', function () {
90
+ var tree = renderer
91
+ .create(React.createElement(Menu_1.Menu, { open: true, checked: { 'Option 1': true } },
92
+ React.createElement(MenuTrigger_1.default, null,
93
+ React.createElement(button_1.ButtonV1, null, "Open")),
94
+ React.createElement(MenuPopover_1.default, null,
95
+ React.createElement(MenuList_1.MenuList, null,
96
+ React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 1", name: "Option 1" }),
97
+ React.createElement(MenuDivider_1.MenuDivider, null),
98
+ React.createElement(MenuItemCheckbox_1.MenuItemCheckbox, { content: "Option 2", name: "Option 2" })))))
99
+ .toJSON();
100
+ expect(tree).toMatchSnapshot();
101
+ });
102
+ it('Menu submenu', function () {
103
+ var tree = renderer
104
+ .create(React.createElement(Menu_1.Menu, { open: true },
105
+ React.createElement(MenuTrigger_1.default, null,
106
+ React.createElement(button_1.ButtonV1, null, "Default")),
107
+ React.createElement(MenuPopover_1.default, null,
108
+ React.createElement(MenuList_1.MenuList, null,
109
+ React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }),
110
+ React.createElement(Menu_1.Menu, null,
111
+ React.createElement(MenuTrigger_1.default, null,
112
+ React.createElement(MenuItem_1.MenuItem, { content: "Option 2" })),
113
+ React.createElement(MenuPopover_1.default, null,
114
+ React.createElement(MenuList_1.MenuList, null,
115
+ React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }))))))))
116
+ .toJSON();
117
+ expect(tree).toMatchSnapshot();
118
+ });
119
+ });
120
+ describe('Menu rerender tests', function () {
121
+ it('Menu re-renders correctly', function () {
122
+ (0, test_tools_1.checkReRender)(function () { return (React.createElement(Menu_1.Menu, { open: true },
123
+ React.createElement(MenuTrigger_1.default, null,
124
+ React.createElement(button_1.ButtonV1, null, "Rerender twice")),
125
+ React.createElement(MenuPopover_1.default, null,
126
+ React.createElement(MenuList_1.MenuList, null,
127
+ React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }))))); }, 3);
128
+ });
129
+ it('Menu re-renders correctly with style', function () {
130
+ var style = { backgroundColor: 'black' };
131
+ (0, test_tools_1.checkReRender)(function () { return (React.createElement(Menu_1.Menu, null,
132
+ React.createElement(MenuTrigger_1.default, null,
133
+ React.createElement(button_1.ButtonV1, { style: style }, "Rerender twice")),
134
+ React.createElement(MenuPopover_1.default, null,
135
+ React.createElement(MenuList_1.MenuList, null,
136
+ React.createElement(MenuItem_1.MenuItem, { content: "Option 1" }))))); }, 3);
137
+ });
138
+ it('Menu re-renders correctly with accessibilityAction', function () {
139
+ var action = [{ name: 'Expand' }];
140
+ (0, test_tools_1.checkReRender)(function () { return (React.createElement(Menu_1.Menu, null,
141
+ React.createElement(MenuTrigger_1.default, null,
142
+ React.createElement(button_1.ButtonV1, null, "Rerender twice")),
143
+ React.createElement(MenuPopover_1.default, null,
144
+ React.createElement(MenuList_1.MenuList, null,
145
+ React.createElement(MenuItem_1.MenuItem, { accessibilityActions: action, content: "Option 1" }))))); }, 3);
146
+ });
147
+ });
148
+ //# sourceMappingURL=Menu.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.test.js","sourceRoot":"","sources":["../../src/__tests__/Menu.test.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui-react-native/menu",
3
- "version": "0.13.1",
3
+ "version": "0.14.0",
4
4
  "description": "A cross-platform Menu component using the Fluent Design System",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",
@@ -34,8 +34,10 @@
34
34
  "tslib": "^2.3.1"
35
35
  },
36
36
  "devDependencies": {
37
+ "@fluentui-react-native/button": ">=0.22.26 <1.0.0",
37
38
  "@fluentui-react-native/eslint-config-rules": "^0.1.1",
38
39
  "@fluentui-react-native/scripts": "^0.1.1",
40
+ "@fluentui-react-native/test-tools": ">=0.1.1 <1.0.0",
39
41
  "@types/react-native": "^0.64.0",
40
42
  "react-native": "^0.64.3"
41
43
  },
@@ -4,7 +4,7 @@ import { useMenuContext } from '../context/menuContext';
4
4
  import { MenuProps, MenuState } from './Menu.types';
5
5
 
6
6
  export const useMenu = (props: MenuProps): MenuState => {
7
- const triggerRef = React.useRef(null);
7
+ const triggerRef = React.useRef();
8
8
  const context = useMenuContext();
9
9
  const isSubmenu = context.triggerRef !== null;
10
10
  const isControlled = typeof props.open !== 'undefined';
@@ -5,6 +5,8 @@ import { useMenuContext } from '../context/menuContext';
5
5
  import { MenuPopoverProps, MenuPopoverState } from './MenuPopover.types';
6
6
  import { isCloseOnHoverOutEnabled } from '../consts';
7
7
 
8
+ const controlledDismissBehaviors = ['preventDismissOnKeyDown', 'preventDismissOnClickOutside'] as DismissBehaviors[];
9
+
8
10
  export const useMenuPopover = (_props: MenuPopoverProps): MenuPopoverState => {
9
11
  const context = useMenuContext();
10
12
  const {
@@ -20,7 +22,7 @@ export const useMenuPopover = (_props: MenuPopoverProps): MenuPopoverState => {
20
22
  } = context;
21
23
 
22
24
  const onDismiss = React.useCallback(() => setOpen(undefined, false /* isOpen */), [setOpen]);
23
- const dismissBehaviors = isControlled ? (['preventDismissOnKeyDown', 'preventDismissOnClickOutside'] as DismissBehaviors[]) : undefined;
25
+ const dismissBehaviors = isControlled ? controlledDismissBehaviors : undefined;
24
26
  const directionalHint = getDirectionalHint(isSubmenu, I18nManager.isRTL);
25
27
 
26
28
  // Initial focus behavior differs per platform, Windows platforms move focus
@@ -31,18 +31,18 @@ MenuTrigger.displayName = menuTriggerName;
31
31
 
32
32
  const getRevisedState = memoize(getRevisedStateWorker);
33
33
  function getRevisedStateWorker(state: MenuTriggerState, props: any): MenuTriggerProps {
34
- const revisedProps = { ...state.props };
34
+ const revisedProps = state.props;
35
35
  if (props.accessibilityState) {
36
- revisedProps.accessibilityState = { ...state.props.accessibilityState, ...props.accessibilityState };
36
+ revisedProps.accessibilityState = { ...revisedProps.accessibilityState, ...props.accessibilityState };
37
37
  }
38
38
 
39
39
  if (props.accessibilityActions) {
40
- revisedProps.accessibilityActions = { ...state.props.accessibilityActions, ...props.accessibilityActions };
40
+ revisedProps.accessibilityActions = { ...revisedProps.accessibilityActions, ...props.accessibilityActions };
41
41
  }
42
42
 
43
43
  if (props.onAccessibilityAction) {
44
44
  revisedProps.onAccessibilityAction = (e: AccessibilityActionEvent) => {
45
- state.props.onAccessibilityAction(e);
45
+ revisedProps.onAccessibilityAction(e);
46
46
  props.onAccessibilityAction(e);
47
47
  };
48
48
  }
@@ -7,12 +7,14 @@ import { delayHover, isCloseOnHoverOutEnabled } from '../consts';
7
7
 
8
8
  const accessibilityActions =
9
9
  Platform.OS === ('win32' as any) ? [{ name: 'Expand' as AccessibilityActionName }, { name: 'Collapse' as AccessibilityActionName }] : [];
10
+ const expandedState = { expanded: true };
11
+ const collapsedState = { expanded: false };
10
12
 
11
13
  export const useMenuTrigger = (_props: MenuTriggerProps): MenuTriggerState => {
12
14
  const context = useMenuContext();
13
15
  const { open, openOnHover, popoverHoverOutTimer, setOpen, setTriggerHoverOutTimer, triggerHoverOutTimer, triggerRef } = context;
14
16
 
15
- const accessibilityState = open ? { expanded: true } : { expanded: false };
17
+ const accessibilityState = open ? expandedState : collapsedState;
16
18
 
17
19
  const onAccessibilityAction = React.useCallback(
18
20
  (e: AccessibilityActionEvent) => {
@@ -0,0 +1,235 @@
1
+ import * as React from 'react';
2
+ import { AccessibilityActionName } from 'react-native';
3
+ import * as renderer from 'react-test-renderer';
4
+ import { Menu } from '../Menu/Menu';
5
+ import { checkReRender } from '@fluentui-react-native/test-tools';
6
+ import MenuTrigger from '../MenuTrigger/MenuTrigger';
7
+ import { ButtonV1 as Button } from '@fluentui-react-native/button';
8
+ import MenuPopover from '../MenuPopover/MenuPopover';
9
+ import { MenuList } from '../MenuList/MenuList';
10
+ import { MenuItem } from '../MenuItem/MenuItem';
11
+ import { MenuItemCheckbox } from '../MenuItemCheckbox/MenuItemCheckbox';
12
+ import { MenuDivider } from '../MenuDivider/MenuDivider';
13
+ import { MenuItemRadio } from '../MenuItemRadio/MenuItemRadio';
14
+
15
+ describe('Checkbox component tests', () => {
16
+ it('Menu default', () => {
17
+ const tree = renderer
18
+ .create(
19
+ <Menu>
20
+ <MenuTrigger>
21
+ <Button>Default</Button>
22
+ </MenuTrigger>
23
+ <MenuPopover>
24
+ <MenuList>
25
+ <MenuItem content="Option 1" />
26
+ </MenuList>
27
+ </MenuPopover>
28
+ </Menu>,
29
+ )
30
+ .toJSON();
31
+ expect(tree).toMatchSnapshot();
32
+ });
33
+
34
+ it('Menu open', () => {
35
+ const tree = renderer
36
+ .create(
37
+ <Menu open>
38
+ <MenuTrigger>
39
+ <Button>Open</Button>
40
+ </MenuTrigger>
41
+ <MenuPopover>
42
+ <MenuList>
43
+ <MenuItem content="Option 1" />
44
+ </MenuList>
45
+ </MenuPopover>
46
+ </Menu>,
47
+ )
48
+ .toJSON();
49
+ expect(tree).toMatchSnapshot();
50
+ });
51
+
52
+ it('Menu defaultOpen', () => {
53
+ const tree = renderer
54
+ .create(
55
+ <Menu defaultOpen>
56
+ <MenuTrigger>
57
+ <Button>Open</Button>
58
+ </MenuTrigger>
59
+ <MenuPopover>
60
+ <MenuList>
61
+ <MenuItem content="Option 1" />
62
+ <MenuItem disabled content="Option 2" />
63
+ </MenuList>
64
+ </MenuPopover>
65
+ </Menu>,
66
+ )
67
+ .toJSON();
68
+ expect(tree).toMatchSnapshot();
69
+ });
70
+
71
+ it('Menu open checkbox and divider', () => {
72
+ const tree = renderer
73
+ .create(
74
+ <Menu open>
75
+ <MenuTrigger>
76
+ <Button>Open</Button>
77
+ </MenuTrigger>
78
+ <MenuPopover>
79
+ <MenuList>
80
+ <MenuItemCheckbox content="Option 1" name="Option 1" />
81
+ <MenuDivider />
82
+ <MenuItemCheckbox disabled content="Option 2" name="Option 2" />
83
+ </MenuList>
84
+ </MenuPopover>
85
+ </Menu>,
86
+ )
87
+ .toJSON();
88
+ expect(tree).toMatchSnapshot();
89
+ });
90
+
91
+ it('Menu open radio', () => {
92
+ const tree = renderer
93
+ .create(
94
+ <Menu open>
95
+ <MenuTrigger>
96
+ <Button>Open</Button>
97
+ </MenuTrigger>
98
+ <MenuPopover>
99
+ <MenuList>
100
+ <MenuItemRadio content="Option 1" name="Option 1" />
101
+ <MenuItemRadio content="Option 2" name="Option 2" />
102
+ </MenuList>
103
+ </MenuPopover>
104
+ </Menu>,
105
+ )
106
+ .toJSON();
107
+ expect(tree).toMatchSnapshot();
108
+ });
109
+
110
+ it('Menu open checkbox defaultChecked', () => {
111
+ const tree = renderer
112
+ .create(
113
+ <Menu open defaultChecked={{ 'Option 1': true }}>
114
+ <MenuTrigger>
115
+ <Button>Open</Button>
116
+ </MenuTrigger>
117
+ <MenuPopover>
118
+ <MenuList>
119
+ <MenuItemCheckbox content="Option 1" name="Option 1" />
120
+ <MenuDivider />
121
+ <MenuItemCheckbox content="Option 2" name="Option 2" />
122
+ </MenuList>
123
+ </MenuPopover>
124
+ </Menu>,
125
+ )
126
+ .toJSON();
127
+ expect(tree).toMatchSnapshot();
128
+ });
129
+
130
+ it('Menu open checkbox checked', () => {
131
+ const tree = renderer
132
+ .create(
133
+ <Menu open checked={{ 'Option 1': true }}>
134
+ <MenuTrigger>
135
+ <Button>Open</Button>
136
+ </MenuTrigger>
137
+ <MenuPopover>
138
+ <MenuList>
139
+ <MenuItemCheckbox content="Option 1" name="Option 1" />
140
+ <MenuDivider />
141
+ <MenuItemCheckbox content="Option 2" name="Option 2" />
142
+ </MenuList>
143
+ </MenuPopover>
144
+ </Menu>,
145
+ )
146
+ .toJSON();
147
+ expect(tree).toMatchSnapshot();
148
+ });
149
+
150
+ it('Menu submenu', () => {
151
+ const tree = renderer
152
+ .create(
153
+ <Menu open>
154
+ <MenuTrigger>
155
+ <Button>Default</Button>
156
+ </MenuTrigger>
157
+ <MenuPopover>
158
+ <MenuList>
159
+ <MenuItem content="Option 1" />
160
+ <Menu>
161
+ <MenuTrigger>
162
+ <MenuItem content="Option 2" />
163
+ </MenuTrigger>
164
+ <MenuPopover>
165
+ <MenuList>
166
+ <MenuItem content="Option 1" />
167
+ </MenuList>
168
+ </MenuPopover>
169
+ </Menu>
170
+ </MenuList>
171
+ </MenuPopover>
172
+ </Menu>,
173
+ )
174
+ .toJSON();
175
+ expect(tree).toMatchSnapshot();
176
+ });
177
+ });
178
+
179
+ describe('Menu rerender tests', () => {
180
+ it('Menu re-renders correctly', () => {
181
+ checkReRender(
182
+ () => (
183
+ <Menu open>
184
+ <MenuTrigger>
185
+ <Button>Rerender twice</Button>
186
+ </MenuTrigger>
187
+ <MenuPopover>
188
+ <MenuList>
189
+ <MenuItem content="Option 1" />
190
+ </MenuList>
191
+ </MenuPopover>
192
+ </Menu>
193
+ ),
194
+ 3,
195
+ );
196
+ });
197
+
198
+ it('Menu re-renders correctly with style', () => {
199
+ const style = { backgroundColor: 'black' };
200
+ checkReRender(
201
+ () => (
202
+ <Menu>
203
+ <MenuTrigger>
204
+ <Button style={style}>Rerender twice</Button>
205
+ </MenuTrigger>
206
+ <MenuPopover>
207
+ <MenuList>
208
+ <MenuItem content="Option 1" />
209
+ </MenuList>
210
+ </MenuPopover>
211
+ </Menu>
212
+ ),
213
+ 3,
214
+ );
215
+ });
216
+
217
+ it('Menu re-renders correctly with accessibilityAction', () => {
218
+ const action = [{ name: 'Expand' as AccessibilityActionName }];
219
+ checkReRender(
220
+ () => (
221
+ <Menu>
222
+ <MenuTrigger>
223
+ <Button>Rerender twice</Button>
224
+ </MenuTrigger>
225
+ <MenuPopover>
226
+ <MenuList>
227
+ <MenuItem accessibilityActions={action} content="Option 1" />
228
+ </MenuList>
229
+ </MenuPopover>
230
+ </Menu>
231
+ ),
232
+ 3,
233
+ );
234
+ });
235
+ });