@fluentui-react-native/menu 0.13.0 → 0.13.1

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 (69) hide show
  1. package/CHANGELOG.json +16 -1
  2. package/CHANGELOG.md +10 -2
  3. package/lib/Menu/Menu.types.d.ts +2 -0
  4. package/lib/Menu/Menu.types.d.ts.map +1 -1
  5. package/lib/Menu/useMenu.d.ts.map +1 -1
  6. package/lib/Menu/useMenu.js +7 -2
  7. package/lib/Menu/useMenu.js.map +1 -1
  8. package/lib/Menu/useMenuContextValue.d.ts.map +1 -1
  9. package/lib/Menu/useMenuContextValue.js +4 -1
  10. package/lib/Menu/useMenuContextValue.js.map +1 -1
  11. package/lib/MenuPopover/MenuPopover.d.ts.map +1 -1
  12. package/lib/MenuPopover/MenuPopover.js +7 -3
  13. package/lib/MenuPopover/MenuPopover.js.map +1 -1
  14. package/lib/MenuPopover/MenuPopover.types.d.ts +4 -10
  15. package/lib/MenuPopover/MenuPopover.types.d.ts.map +1 -1
  16. package/lib/MenuPopover/useMenuPopover.d.ts.map +1 -1
  17. package/lib/MenuPopover/useMenuPopover.js +34 -8
  18. package/lib/MenuPopover/useMenuPopover.js.map +1 -1
  19. package/lib/MenuTrigger/MenuTrigger.js +7 -7
  20. package/lib/MenuTrigger/MenuTrigger.js.map +1 -1
  21. package/lib/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
  22. package/lib/MenuTrigger/useMenuTrigger.js +19 -20
  23. package/lib/MenuTrigger/useMenuTrigger.js.map +1 -1
  24. package/lib/consts.d.ts +3 -0
  25. package/lib/consts.d.ts.map +1 -0
  26. package/lib/consts.js +7 -0
  27. package/lib/consts.js.map +1 -0
  28. package/lib/context/menuContext.d.ts +10 -4
  29. package/lib/context/menuContext.d.ts.map +1 -1
  30. package/lib/context/menuContext.js.map +1 -1
  31. package/lib-commonjs/Menu/Menu.types.d.ts +2 -0
  32. package/lib-commonjs/Menu/Menu.types.d.ts.map +1 -1
  33. package/lib-commonjs/Menu/useMenu.d.ts.map +1 -1
  34. package/lib-commonjs/Menu/useMenu.js +7 -2
  35. package/lib-commonjs/Menu/useMenu.js.map +1 -1
  36. package/lib-commonjs/Menu/useMenuContextValue.d.ts.map +1 -1
  37. package/lib-commonjs/Menu/useMenuContextValue.js +4 -1
  38. package/lib-commonjs/Menu/useMenuContextValue.js.map +1 -1
  39. package/lib-commonjs/MenuPopover/MenuPopover.d.ts.map +1 -1
  40. package/lib-commonjs/MenuPopover/MenuPopover.js +5 -2
  41. package/lib-commonjs/MenuPopover/MenuPopover.js.map +1 -1
  42. package/lib-commonjs/MenuPopover/MenuPopover.types.d.ts +4 -10
  43. package/lib-commonjs/MenuPopover/MenuPopover.types.d.ts.map +1 -1
  44. package/lib-commonjs/MenuPopover/useMenuPopover.d.ts.map +1 -1
  45. package/lib-commonjs/MenuPopover/useMenuPopover.js +34 -8
  46. package/lib-commonjs/MenuPopover/useMenuPopover.js.map +1 -1
  47. package/lib-commonjs/MenuTrigger/MenuTrigger.js +7 -7
  48. package/lib-commonjs/MenuTrigger/MenuTrigger.js.map +1 -1
  49. package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
  50. package/lib-commonjs/MenuTrigger/useMenuTrigger.js +19 -20
  51. package/lib-commonjs/MenuTrigger/useMenuTrigger.js.map +1 -1
  52. package/lib-commonjs/consts.d.ts +3 -0
  53. package/lib-commonjs/consts.d.ts.map +1 -0
  54. package/lib-commonjs/consts.js +10 -0
  55. package/lib-commonjs/consts.js.map +1 -0
  56. package/lib-commonjs/context/menuContext.d.ts +10 -4
  57. package/lib-commonjs/context/menuContext.d.ts.map +1 -1
  58. package/lib-commonjs/context/menuContext.js.map +1 -1
  59. package/package.json +1 -1
  60. package/src/Menu/Menu.types.ts +1 -0
  61. package/src/Menu/useMenu.ts +8 -1
  62. package/src/Menu/useMenuContextValue.ts +4 -1
  63. package/src/MenuPopover/MenuPopover.tsx +7 -14
  64. package/src/MenuPopover/MenuPopover.types.ts +4 -9
  65. package/src/MenuPopover/useMenuPopover.ts +46 -8
  66. package/src/MenuTrigger/MenuTrigger.tsx +8 -8
  67. package/src/MenuTrigger/useMenuTrigger.ts +34 -26
  68. package/src/consts.ts +8 -0
  69. package/src/context/menuContext.ts +6 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MenuPopover.types.d.ts","sourceRoot":"","sources":["../../src/MenuPopover/MenuPopover.types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,oBAAY,gBAAgB,GAAG,aAAa,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,gBAAgB,EAAE,gBAAgB,EAAE,CAAC;IACrC,uBAAuB,EAAE,OAAO,CAAC;IACjC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;CAC9C"}
1
+ {"version":3,"file":"MenuPopover.types.d.ts","sourceRoot":"","sources":["../../src/MenuPopover/MenuPopover.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE/D,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,oBAAY,gBAAgB,GAAG,aAAa,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,UAAU,CAAC;CACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuPopover.d.ts","sourceRoot":"","sources":["../../src/MenuPopover/useMenuPopover.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,eAAO,MAAM,cAAc,WAAY,gBAAgB,KAAG,gBAkBzD,CAAC"}
1
+ {"version":3,"file":"useMenuPopover.d.ts","sourceRoot":"","sources":["../../src/MenuPopover/useMenuPopover.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,eAAO,MAAM,cAAc,WAAY,gBAAgB,KAAG,gBAuDzD,CAAC"}
@@ -5,21 +5,47 @@ var tslib_1 = require("tslib");
5
5
  var react_1 = (0, tslib_1.__importDefault)(require("react"));
6
6
  var react_native_1 = require("react-native");
7
7
  var menuContext_1 = require("../context/menuContext");
8
+ var consts_1 = require("../consts");
8
9
  var useMenuPopover = function (_props) {
9
10
  var context = (0, menuContext_1.useMenuContext)();
10
- var setOpen = context.setOpen;
11
- var triggerRef = context.triggerRef;
11
+ var setOpen = context.setOpen, triggerRef = context.triggerRef, isControlled = context.isControlled, isSubmenu = context.isSubmenu, openOnHover = context.openOnHover, parentPopoverHoverOutTimer = context.parentPopoverHoverOutTimer, popoverHoverOutTimer = context.popoverHoverOutTimer, setPopoverHoverOutTimer = context.setPopoverHoverOutTimer, triggerHoverOutTimer = context.triggerHoverOutTimer;
12
12
  var onDismiss = react_1.default.useCallback(function () { return setOpen(undefined, false /* isOpen */); }, [setOpen]);
13
- var dismissBehaviors = context.isControlled
14
- ? ['preventDismissOnKeyDown', 'preventDismissOnClickOutside']
15
- : undefined;
16
- var directionalHint = getDirectionalHint(context.isSubmenu, react_native_1.I18nManager.isRTL);
13
+ var dismissBehaviors = isControlled ? ['preventDismissOnKeyDown', 'preventDismissOnClickOutside'] : undefined;
14
+ var directionalHint = getDirectionalHint(isSubmenu, react_native_1.I18nManager.isRTL);
17
15
  // Initial focus behavior differs per platform, Windows platforms move focus
18
16
  // automatically onto first element of Callout
19
17
  var setInitialFocus = react_native_1.Platform.OS === 'win32' || react_native_1.Platform.OS === 'windows';
20
- var doNotTakePointerCapture = context.openOnHover;
18
+ var doNotTakePointerCapture = openOnHover;
21
19
  var accessibilityRole = 'menu';
22
- return { accessibilityRole: accessibilityRole, triggerRef: triggerRef, onDismiss: onDismiss, directionalHint: directionalHint, dismissBehaviors: dismissBehaviors, doNotTakePointerCapture: doNotTakePointerCapture, setInitialFocus: setInitialFocus };
20
+ var onMouseEnter = react_1.default.useCallback(function () {
21
+ clearTimeout(triggerHoverOutTimer);
22
+ clearTimeout(popoverHoverOutTimer);
23
+ clearTimeout(parentPopoverHoverOutTimer);
24
+ }, [parentPopoverHoverOutTimer, popoverHoverOutTimer, triggerHoverOutTimer]);
25
+ var onMouseLeave = react_1.default.useCallback(function () {
26
+ if (!openOnHover) {
27
+ return;
28
+ }
29
+ var timer = setTimeout(function () {
30
+ setOpen(undefined, false /* isOpen */);
31
+ }, 500);
32
+ setPopoverHoverOutTimer(timer);
33
+ }, [openOnHover, setOpen, setPopoverHoverOutTimer]);
34
+ return {
35
+ props: {
36
+ accessibilityRole: accessibilityRole,
37
+ target: triggerRef,
38
+ onDismiss: onDismiss,
39
+ directionalHint: directionalHint,
40
+ dismissBehaviors: dismissBehaviors,
41
+ doNotTakePointerCapture: doNotTakePointerCapture,
42
+ setInitialFocus: setInitialFocus,
43
+ },
44
+ innerView: {
45
+ onMouseEnter: onMouseEnter,
46
+ onMouseLeave: consts_1.isCloseOnHoverOutEnabled && onMouseLeave,
47
+ },
48
+ };
23
49
  };
24
50
  exports.useMenuPopover = useMenuPopover;
25
51
  var getDirectionalHint = function (isSubmenu, isRtl) {
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuPopover.js","sourceRoot":"","sources":["../../src/MenuPopover/useMenuPopover.ts"],"names":[],"mappings":";;;;AAAA,6DAA0B;AAC1B,6CAAqD;AAErD,sDAAwD;AAGjD,IAAM,cAAc,GAAG,UAAC,MAAwB;IACrD,IAAM,OAAO,GAAG,IAAA,4BAAc,GAAE,CAAC;IACjC,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAEhC,IAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAM,SAAS,GAAG,eAAK,CAAC,WAAW,CAAC,cAAM,OAAA,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAAtC,CAAsC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,IAAM,gBAAgB,GAAG,OAAO,CAAC,YAAY;QAC3C,CAAC,CAAE,CAAC,yBAAyB,EAAE,8BAA8B,CAAwB;QACrF,CAAC,CAAC,SAAS,CAAC;IACd,IAAM,eAAe,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,0BAAW,CAAC,KAAK,CAAC,CAAC;IAEjF,4EAA4E;IAC5E,8CAA8C;IAC9C,IAAM,eAAe,GAAG,uBAAQ,CAAC,EAAE,KAAM,OAAe,IAAI,uBAAQ,CAAC,EAAE,KAAK,SAAS,CAAC;IACtF,IAAM,uBAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IACpD,IAAM,iBAAiB,GAAG,MAAM,CAAC;IAEjC,OAAO,EAAE,iBAAiB,mBAAA,EAAE,UAAU,YAAA,EAAE,SAAS,WAAA,EAAE,eAAe,iBAAA,EAAE,gBAAgB,kBAAA,EAAE,uBAAuB,yBAAA,EAAE,eAAe,iBAAA,EAAE,CAAC;AACnI,CAAC,CAAC;AAlBW,QAAA,cAAc,kBAkBzB;AAEF,IAAM,kBAAkB,GAAG,UAAC,SAAkB,EAAE,KAAc;IAC5D,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,KAAK,EAAE;QACT,OAAO,aAAa,CAAC;KACtB;IAED,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
1
+ {"version":3,"file":"useMenuPopover.js","sourceRoot":"","sources":["../../src/MenuPopover/useMenuPopover.ts"],"names":[],"mappings":";;;;AAAA,6DAA0B;AAC1B,6CAAqD;AAErD,sDAAwD;AAExD,oCAAqD;AAE9C,IAAM,cAAc,GAAG,UAAC,MAAwB;IACrD,IAAM,OAAO,GAAG,IAAA,4BAAc,GAAE,CAAC;IAE/B,IAAA,OAAO,GASL,OAAO,QATF,EACP,UAAU,GAQR,OAAO,WARC,EACV,YAAY,GAOV,OAAO,aAPG,EACZ,SAAS,GAMP,OAAO,UANA,EACT,WAAW,GAKT,OAAO,YALE,EACX,0BAA0B,GAIxB,OAAO,2BAJiB,EAC1B,oBAAoB,GAGlB,OAAO,qBAHW,EACpB,uBAAuB,GAErB,OAAO,wBAFc,EACvB,oBAAoB,GAClB,OAAO,qBADW,CACV;IAEZ,IAAM,SAAS,GAAG,eAAK,CAAC,WAAW,CAAC,cAAM,OAAA,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAAtC,CAAsC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7F,IAAM,gBAAgB,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC,yBAAyB,EAAE,8BAA8B,CAAwB,CAAC,CAAC,CAAC,SAAS,CAAC;IACxI,IAAM,eAAe,GAAG,kBAAkB,CAAC,SAAS,EAAE,0BAAW,CAAC,KAAK,CAAC,CAAC;IAEzE,4EAA4E;IAC5E,8CAA8C;IAC9C,IAAM,eAAe,GAAG,uBAAQ,CAAC,EAAE,KAAM,OAAe,IAAI,uBAAQ,CAAC,EAAE,KAAK,SAAS,CAAC;IACtF,IAAM,uBAAuB,GAAG,WAAW,CAAC;IAC5C,IAAM,iBAAiB,GAAG,MAAM,CAAC;IAEjC,IAAM,YAAY,GAAG,eAAK,CAAC,WAAW,CAAC;QACrC,YAAY,CAAC,oBAAoB,CAAC,CAAC;QACnC,YAAY,CAAC,oBAAoB,CAAC,CAAC;QACnC,YAAY,CAAC,0BAA0B,CAAC,CAAC;IAC3C,CAAC,EAAE,CAAC,0BAA0B,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAC7E,IAAM,YAAY,GAAG,eAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,WAAW,EAAE;YAChB,OAAO;SACR;QAED,IAAM,KAAK,GAAG,UAAU,CAAC;YACvB,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QACzC,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAEpD,OAAO;QACL,KAAK,EAAE;YACL,iBAAiB,mBAAA;YACjB,MAAM,EAAE,UAAU;YAClB,SAAS,WAAA;YACT,eAAe,iBAAA;YACf,gBAAgB,kBAAA;YAChB,uBAAuB,yBAAA;YACvB,eAAe,iBAAA;SAChB;QACD,SAAS,EAAE;YACT,YAAY,cAAA;YACZ,YAAY,EAAE,iCAAwB,IAAI,YAAY;SACvD;KACF,CAAC;AACJ,CAAC,CAAC;AAvDW,QAAA,cAAc,kBAuDzB;AAEF,IAAM,kBAAkB,GAAG,UAAC,SAAkB,EAAE,KAAc;IAC5D,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,SAAS,CAAC;KAClB;IAED,IAAI,KAAK,EAAE;QACT,OAAO,aAAa,CAAC;KACtB;IAED,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC"}
@@ -20,28 +20,28 @@ exports.MenuTrigger = (0, framework_1.stagedComponent)(function (props) {
20
20
  // child component which may affect accessibility, we need to modify the
21
21
  // state in the inner render so we can access the child component and its props.
22
22
  var child = childrenArray[0];
23
- var revisedState = getRevisedState(menuTrigger, child.props);
24
- var revised = react_1.default.cloneElement(child, revisedState);
23
+ var revisedProps = getRevisedState(menuTrigger, child.props);
24
+ var revised = react_1.default.cloneElement(child, revisedProps);
25
25
  return react_1.default.createElement(menuTriggerContext_1.MenuTriggerProvider, { value: menuTrigger.hasSubmenu }, revised);
26
26
  };
27
27
  });
28
28
  exports.MenuTrigger.displayName = MenuTrigger_types_1.menuTriggerName;
29
29
  var getRevisedState = (0, framework_1.memoize)(getRevisedStateWorker);
30
30
  function getRevisedStateWorker(state, props) {
31
- var revisedState = (0, tslib_1.__assign)({}, state);
31
+ var revisedProps = (0, tslib_1.__assign)({}, state.props);
32
32
  if (props.accessibilityState) {
33
- revisedState.props.accessibilityState = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, state.props.accessibilityState), props.accessibilityState);
33
+ revisedProps.accessibilityState = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, state.props.accessibilityState), props.accessibilityState);
34
34
  }
35
35
  if (props.accessibilityActions) {
36
- revisedState.props.accessibilityActions = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, state.props.accessibilityActions), props.accessibilityActions);
36
+ revisedProps.accessibilityActions = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, state.props.accessibilityActions), props.accessibilityActions);
37
37
  }
38
38
  if (props.onAccessibilityAction) {
39
- revisedState.props.onAccessibilityAction = function (e) {
39
+ revisedProps.onAccessibilityAction = function (e) {
40
40
  state.props.onAccessibilityAction(e);
41
41
  props.onAccessibilityAction(e);
42
42
  };
43
43
  }
44
- return revisedState;
44
+ return revisedProps;
45
45
  }
46
46
  exports.default = exports.MenuTrigger;
47
47
  //# sourceMappingURL=MenuTrigger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MenuTrigger.js","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.tsx"],"names":[],"mappings":";;;;AAAA,6DAA0B;AAC1B,8DAA4E;AAC5E,yDAA0F;AAC1F,mDAAkD;AAElD,oEAAoE;AAEvD,QAAA,WAAW,GAAG,IAAA,2BAAe,EAAC,UAAC,KAAuB;IACjE,IAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,KAAK,CAAC,CAAC;IAE1C,OAAO,UAAC,KAAuB,EAAE,QAAyB;QACxD,IAAM,aAAa,GAAG,eAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAyB,CAAC;QAE/E,IAAI,OAAO,EAAE;YACX,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;aACzD;SACF;QAED,8EAA8E;QAC9E,wEAAwE;QACxE,gFAAgF;QAChF,IAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAM,YAAY,GAAG,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAM,OAAO,GAAG,eAAK,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAExD,OAAO,8BAAC,wCAAmB,IAAC,KAAK,EAAE,WAAW,CAAC,UAAU,IAAG,OAAO,CAAuB,CAAC;IAC7F,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,mBAAW,CAAC,WAAW,GAAG,mCAAe,CAAC;AAE1C,IAAM,eAAe,GAAG,IAAA,mBAAO,EAAC,qBAAqB,CAAC,CAAC;AACvD,SAAS,qBAAqB,CAAC,KAAuB,EAAE,KAAU;IAChE,IAAM,YAAY,6BAAQ,KAAK,CAAE,CAAC;IAClC,IAAI,KAAK,CAAC,kBAAkB,EAAE;QAC5B,YAAY,CAAC,KAAK,CAAC,kBAAkB,mDAAQ,KAAK,CAAC,KAAK,CAAC,kBAAkB,GAAK,KAAK,CAAC,kBAAkB,CAAE,CAAC;KAC5G;IAED,IAAI,KAAK,CAAC,oBAAoB,EAAE;QAC9B,YAAY,CAAC,KAAK,CAAC,oBAAoB,mDAAQ,KAAK,CAAC,KAAK,CAAC,oBAAoB,GAAK,KAAK,CAAC,oBAAoB,CAAE,CAAC;KAClH;IAED,IAAI,KAAK,CAAC,qBAAqB,EAAE;QAC/B,YAAY,CAAC,KAAK,CAAC,qBAAqB,GAAG,UAAC,CAA2B;YACrE,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YACrC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjC,CAAC,CAAC;KACH;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,kBAAe,mBAAW,CAAC"}
1
+ {"version":3,"file":"MenuTrigger.js","sourceRoot":"","sources":["../../src/MenuTrigger/MenuTrigger.tsx"],"names":[],"mappings":";;;;AAAA,6DAA0B;AAC1B,8DAA4E;AAC5E,yDAA0F;AAC1F,mDAAkD;AAElD,oEAAoE;AAEvD,QAAA,WAAW,GAAG,IAAA,2BAAe,EAAC,UAAC,KAAuB;IACjE,IAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,KAAK,CAAC,CAAC;IAE1C,OAAO,UAAC,KAAuB,EAAE,QAAyB;QACxD,IAAM,aAAa,GAAG,eAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAyB,CAAC;QAE/E,IAAI,OAAO,EAAE;YACX,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC9B,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;aACzD;SACF;QAED,8EAA8E;QAC9E,wEAAwE;QACxE,gFAAgF;QAChF,IAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAM,YAAY,GAAG,eAAe,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAM,OAAO,GAAG,eAAK,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAExD,OAAO,8BAAC,wCAAmB,IAAC,KAAK,EAAE,WAAW,CAAC,UAAU,IAAG,OAAO,CAAuB,CAAC;IAC7F,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AACH,mBAAW,CAAC,WAAW,GAAG,mCAAe,CAAC;AAE1C,IAAM,eAAe,GAAG,IAAA,mBAAO,EAAC,qBAAqB,CAAC,CAAC;AACvD,SAAS,qBAAqB,CAAC,KAAuB,EAAE,KAAU;IAChE,IAAM,YAAY,6BAAQ,KAAK,CAAC,KAAK,CAAE,CAAC;IACxC,IAAI,KAAK,CAAC,kBAAkB,EAAE;QAC5B,YAAY,CAAC,kBAAkB,mDAAQ,KAAK,CAAC,KAAK,CAAC,kBAAkB,GAAK,KAAK,CAAC,kBAAkB,CAAE,CAAC;KACtG;IAED,IAAI,KAAK,CAAC,oBAAoB,EAAE;QAC9B,YAAY,CAAC,oBAAoB,mDAAQ,KAAK,CAAC,KAAK,CAAC,oBAAoB,GAAK,KAAK,CAAC,oBAAoB,CAAE,CAAC;KAC5G;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,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,kBAAe,mBAAW,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuTrigger.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/useMenuTrigger.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAOzE,eAAO,MAAM,cAAc,WAAY,gBAAgB,KAAG,gBA4DzD,CAAC"}
1
+ {"version":3,"file":"useMenuTrigger.d.ts","sourceRoot":"","sources":["../../src/MenuTrigger/useMenuTrigger.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAQzE,eAAO,MAAM,cAAc,WAAY,gBAAgB,KAAG,gBAmEzD,CAAC"}
@@ -5,14 +5,12 @@ var tslib_1 = require("tslib");
5
5
  var menuContext_1 = require("../context/menuContext");
6
6
  var react_native_1 = require("react-native");
7
7
  var react_1 = (0, tslib_1.__importDefault)(require("react"));
8
+ var consts_1 = require("../consts");
8
9
  var accessibilityActions = react_native_1.Platform.OS === 'win32' ? [{ name: 'Expand' }, { name: 'Collapse' }] : [];
9
10
  var useMenuTrigger = function (_props) {
10
11
  var context = (0, menuContext_1.useMenuContext)();
11
- var setOpen = context.setOpen;
12
- var open = context.open;
13
- var openOnHover = context.openOnHover;
14
- var triggerRef = context.triggerRef;
15
- var accessibilityState = context.open ? { expanded: true } : { expanded: false };
12
+ var open = context.open, openOnHover = context.openOnHover, popoverHoverOutTimer = context.popoverHoverOutTimer, setOpen = context.setOpen, setTriggerHoverOutTimer = context.setTriggerHoverOutTimer, triggerHoverOutTimer = context.triggerHoverOutTimer, triggerRef = context.triggerRef;
13
+ var accessibilityState = open ? { expanded: true } : { expanded: false };
16
14
  var onAccessibilityAction = react_1.default.useCallback(function (e) {
17
15
  if (react_native_1.Platform.OS === 'win32') {
18
16
  switch (e.nativeEvent.actionName) {
@@ -25,31 +23,32 @@ var useMenuTrigger = function (_props) {
25
23
  }
26
24
  }
27
25
  }, [setOpen]);
28
- var delayHover = react_native_1.Platform.select({
29
- macos: 100,
30
- default: 500, // win32
31
- });
32
- var onHoverIn = function (e) {
26
+ var onHoverIn = react_1.default.useCallback(function (e) {
33
27
  if (openOnHover) {
34
- setOpen(e, true /* isOpen */);
28
+ clearTimeout(popoverHoverOutTimer);
29
+ clearTimeout(triggerHoverOutTimer);
30
+ setTimeout(function () {
31
+ setOpen(e, true /* isOpen */);
32
+ }, consts_1.delayHover);
35
33
  }
36
- };
37
- var onHoverOut = function (e) {
34
+ }, [openOnHover, setOpen, triggerHoverOutTimer, popoverHoverOutTimer]);
35
+ var onHoverOut = react_1.default.useCallback(function (e) {
38
36
  if (openOnHover) {
39
- setOpen(e, false /* isOpen */);
37
+ var timer = setTimeout(function () {
38
+ setOpen(e, false /* isOpen */);
39
+ }, consts_1.delayHover);
40
+ setTriggerHoverOutTimer(timer);
40
41
  }
41
- };
42
- var onClick = function (e) {
42
+ }, [openOnHover, setOpen, setTriggerHoverOutTimer]);
43
+ var onClick = react_1.default.useCallback(function (e) {
43
44
  setOpen(e, !open);
44
- };
45
+ }, [open, setOpen]);
45
46
  return {
46
47
  props: {
47
48
  onClick: onClick,
48
49
  onHoverIn: onHoverIn,
49
- onHoverOut: react_native_1.Platform.OS === 'win32' && onHoverOut,
50
+ onHoverOut: consts_1.isCloseOnHoverOutEnabled && onHoverOut,
50
51
  componentRef: triggerRef,
51
- delayHoverIn: delayHover,
52
- delayHoverOut: react_native_1.Platform.OS === 'win32' && delayHover,
53
52
  accessibilityState: accessibilityState,
54
53
  accessibilityActions: accessibilityActions,
55
54
  onAccessibilityAction: onAccessibilityAction,
@@ -1 +1 @@
1
- {"version":3,"file":"useMenuTrigger.js","sourceRoot":"","sources":["../../src/MenuTrigger/useMenuTrigger.ts"],"names":[],"mappings":";;;;AAAA,sDAAwD;AAGxD,6CAA2F;AAC3F,6DAA0B;AAE1B,IAAM,oBAAoB,GACxB,uBAAQ,CAAC,EAAE,KAAM,OAAe,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAmC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAqC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAEpI,IAAM,cAAc,GAAG,UAAC,MAAwB;IACrD,IAAM,OAAO,GAAG,IAAA,4BAAc,GAAE,CAAC;IAEjC,IAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,IAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACxC,IAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAM,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACnF,IAAM,qBAAqB,GAAG,eAAK,CAAC,WAAW,CAC7C,UAAC,CAA2B;QAC1B,IAAI,uBAAQ,CAAC,EAAE,KAAM,OAAe,EAAE;YACpC,QAAQ,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE;gBAChC,KAAK,QAAQ;oBACX,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC9B,MAAM;gBAER,KAAK,UAAU;oBACb,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;oBAC/B,MAAM;aACT;SACF;IACH,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,IAAM,UAAU,GAAG,uBAAQ,CAAC,MAAM,CAAC;QACjC,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,GAAG,EAAE,QAAQ;KACvB,CAAC,CAAC;IAEH,IAAM,SAAS,GAAG,UAAC,CAAmB;QACpC,IAAI,WAAW,EAAE;YACf,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;SAC/B;IACH,CAAC,CAAC;IAEF,IAAM,UAAU,GAAG,UAAC,CAAmB;QACrC,IAAI,WAAW,EAAE;YACf,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;SAChC;IACH,CAAC,CAAC;IAEF,IAAM,OAAO,GAAG,UAAC,CAAmB;QAClC,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,EAAE;YACL,OAAO,SAAA;YACP,SAAS,WAAA;YACT,UAAU,EAAE,uBAAQ,CAAC,EAAE,KAAM,OAAe,IAAI,UAAU;YAC1D,YAAY,EAAE,UAAU;YACxB,YAAY,EAAE,UAAU;YACxB,aAAa,EAAE,uBAAQ,CAAC,EAAE,KAAM,OAAe,IAAI,UAAU;YAC7D,kBAAkB,oBAAA;YAClB,oBAAoB,sBAAA;YACpB,qBAAqB,uBAAA;SACtB;QACD,UAAU,EAAE,OAAO,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC,CAAC;AA5DW,QAAA,cAAc,kBA4DzB"}
1
+ {"version":3,"file":"useMenuTrigger.js","sourceRoot":"","sources":["../../src/MenuTrigger/useMenuTrigger.ts"],"names":[],"mappings":";;;;AAAA,sDAAwD;AAGxD,6CAA2F;AAC3F,6DAA0B;AAC1B,oCAAiE;AAEjE,IAAM,oBAAoB,GACxB,uBAAQ,CAAC,EAAE,KAAM,OAAe,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAmC,EAAE,EAAE,EAAE,IAAI,EAAE,UAAqC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAEpI,IAAM,cAAc,GAAG,UAAC,MAAwB;IACrD,IAAM,OAAO,GAAG,IAAA,4BAAc,GAAE,CAAC;IACzB,IAAA,IAAI,GAA4G,OAAO,KAAnH,EAAE,WAAW,GAA+F,OAAO,YAAtG,EAAE,oBAAoB,GAAyE,OAAO,qBAAhF,EAAE,OAAO,GAAgE,OAAO,QAAvE,EAAE,uBAAuB,GAAuC,OAAO,wBAA9C,EAAE,oBAAoB,GAAiB,OAAO,qBAAxB,EAAE,UAAU,GAAK,OAAO,WAAZ,CAAa;IAEhI,IAAM,kBAAkB,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAE3E,IAAM,qBAAqB,GAAG,eAAK,CAAC,WAAW,CAC7C,UAAC,CAA2B;QAC1B,IAAI,uBAAQ,CAAC,EAAE,KAAM,OAAe,EAAE;YACpC,QAAQ,CAAC,CAAC,WAAW,CAAC,UAAU,EAAE;gBAChC,KAAK,QAAQ;oBACX,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC9B,MAAM;gBAER,KAAK,UAAU;oBACb,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;oBAC/B,MAAM;aACT;SACF;IACH,CAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,IAAM,SAAS,GAAG,eAAK,CAAC,WAAW,CACjC,UAAC,CAAmB;QAClB,IAAI,WAAW,EAAE;YACf,YAAY,CAAC,oBAAoB,CAAC,CAAC;YACnC,YAAY,CAAC,oBAAoB,CAAC,CAAC;YACnC,UAAU,CAAC;gBACT,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YAChC,CAAC,EAAE,mBAAU,CAAC,CAAC;SAChB;IACH,CAAC,EACD,CAAC,WAAW,EAAE,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CACnE,CAAC;IAEF,IAAM,UAAU,GAAG,eAAK,CAAC,WAAW,CAClC,UAAC,CAAmB;QAClB,IAAI,WAAW,EAAE;YACf,IAAM,KAAK,GAAG,UAAU,CAAC;gBACvB,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YACjC,CAAC,EAAE,mBAAU,CAAC,CAAC;YACf,uBAAuB,CAAC,KAAK,CAAC,CAAC;SAChC;IACH,CAAC,EACD,CAAC,WAAW,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAChD,CAAC;IAEF,IAAM,OAAO,GAAG,eAAK,CAAC,WAAW,CAC/B,UAAC,CAAmB;QAClB,OAAO,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC,EACD,CAAC,IAAI,EAAE,OAAO,CAAC,CAChB,CAAC;IAEF,OAAO;QACL,KAAK,EAAE;YACL,OAAO,SAAA;YACP,SAAS,WAAA;YACT,UAAU,EAAE,iCAAwB,IAAI,UAAU;YAClD,YAAY,EAAE,UAAU;YACxB,kBAAkB,oBAAA;YAClB,oBAAoB,sBAAA;YACpB,qBAAqB,uBAAA;SACtB;QACD,UAAU,EAAE,OAAO,CAAC,SAAS;KAC9B,CAAC;AACJ,CAAC,CAAC;AAnEW,QAAA,cAAc,kBAmEzB"}
@@ -0,0 +1,3 @@
1
+ export declare const delayHover: number;
2
+ export declare const isCloseOnHoverOutEnabled: boolean;
3
+ //# sourceMappingURL=consts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,UAAU,QAGrB,CAAC;AAEH,eAAO,MAAM,wBAAwB,SAAmC,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isCloseOnHoverOutEnabled = exports.delayHover = void 0;
4
+ var react_native_1 = require("react-native");
5
+ exports.delayHover = react_native_1.Platform.select({
6
+ macos: 100,
7
+ default: 500, // win32
8
+ });
9
+ exports.isCloseOnHoverOutEnabled = react_native_1.Platform.OS === 'win32';
10
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":";;;AAAA,6CAAwC;AAE3B,QAAA,UAAU,GAAG,uBAAQ,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,GAAG;IACV,OAAO,EAAE,GAAG,EAAE,QAAQ;CACvB,CAAC,CAAC;AAEU,QAAA,wBAAwB,GAAG,uBAAQ,CAAC,EAAE,KAAM,OAAe,CAAC"}
@@ -1,10 +1,16 @@
1
+ /// <reference types="node" />
1
2
  import * as React from 'react';
2
3
  import type { MenuState } from '../Menu/Menu.types';
3
4
  /**
4
5
  * Context shared between Menu and its child components
5
6
  */
6
- export declare type MenuContextValue = MenuState;
7
- export declare const MenuContext: React.Context<MenuState>;
8
- export declare const MenuProvider: React.Provider<MenuState>;
9
- export declare const useMenuContext: () => MenuState;
7
+ export interface MenuContextValue extends MenuState {
8
+ popoverHoverOutTimer?: NodeJS.Timeout;
9
+ triggerHoverOutTimer?: NodeJS.Timeout;
10
+ setPopoverHoverOutTimer?: (timer: NodeJS.Timeout) => void;
11
+ setTriggerHoverOutTimer?: (timer: NodeJS.Timeout) => void;
12
+ }
13
+ export declare const MenuContext: React.Context<MenuContextValue>;
14
+ export declare const MenuProvider: React.Provider<MenuContextValue>;
15
+ export declare const useMenuContext: () => MenuContextValue;
10
16
  //# sourceMappingURL=menuContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"menuContext.d.ts","sourceRoot":"","sources":["../../src/context/menuContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,oBAAY,gBAAgB,GAAG,SAAS,CAAC;AAEzC,eAAO,MAAM,WAAW,0BAUtB,CAAC;AAEH,eAAO,MAAM,YAAY,2BAAuB,CAAC;AACjD,eAAO,MAAM,cAAc,iBAAsC,CAAC"}
1
+ {"version":3,"file":"menuContext.d.ts","sourceRoot":"","sources":["../../src/context/menuContext.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,oBAAoB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC;IACtC,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;IAC1D,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC;CAC3D;AAED,eAAO,MAAM,WAAW,iCAUtB,CAAC;AAEH,eAAO,MAAM,YAAY,kCAAuB,CAAC;AACjD,eAAO,MAAM,cAAc,wBAAsC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"menuContext.js","sourceRoot":"","sources":["../../src/context/menuContext.ts"],"names":[],"mappings":";;;;AAAA,wDAA+B;AAQlB,QAAA,WAAW,GAAG,KAAK,CAAC,aAAa,CAAmB;IAC/D,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,KAAK;IACpB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,KAAK;IACX,eAAe,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;IAC5B,OAAO,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;IACpB,UAAU,EAAE,IAAI;CACjB,CAAC,CAAC;AAEU,QAAA,YAAY,GAAG,mBAAW,CAAC,QAAQ,CAAC;AAC1C,IAAM,cAAc,GAAG,cAAM,OAAA,KAAK,CAAC,UAAU,CAAC,mBAAW,CAAC,EAA7B,CAA6B,CAAC;AAArD,QAAA,cAAc,kBAAuC"}
1
+ {"version":3,"file":"menuContext.js","sourceRoot":"","sources":["../../src/context/menuContext.ts"],"names":[],"mappings":";;;;AAAA,wDAA+B;AAalB,QAAA,WAAW,GAAG,KAAK,CAAC,aAAa,CAAmB;IAC/D,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,KAAK;IACpB,SAAS,EAAE,KAAK;IAChB,IAAI,EAAE,KAAK;IACX,eAAe,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;IAC5B,OAAO,EAAE,cAAM,OAAA,KAAK,EAAL,CAAK;IACpB,UAAU,EAAE,IAAI;CACjB,CAAC,CAAC;AAEU,QAAA,YAAY,GAAG,mBAAW,CAAC,QAAQ,CAAC;AAC1C,IAAM,cAAc,GAAG,cAAM,OAAA,KAAK,CAAC,UAAU,CAAC,mBAAW,CAAC,EAA7B,CAA6B,CAAC;AAArD,QAAA,cAAc,kBAAuC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui-react-native/menu",
3
- "version": "0.13.0",
3
+ "version": "0.13.1",
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",
@@ -14,6 +14,7 @@ export interface MenuProps extends MenuListProps {
14
14
  export interface MenuState extends MenuProps {
15
15
  isControlled: boolean;
16
16
  isSubmenu: boolean;
17
+ parentPopoverHoverOutTimer?: NodeJS.Timeout;
17
18
  setOpen: (e: InteractionEvent, isOpen: boolean) => void;
18
19
  triggerRef: React.RefObject<React.Component>;
19
20
  }
@@ -10,11 +10,17 @@ export const useMenu = (props: MenuProps): MenuState => {
10
10
  const isControlled = typeof props.open !== 'undefined';
11
11
  const [open, setOpen] = useMenuOpenState(isControlled, props);
12
12
 
13
- // Default behaviot for submenu is to open on hover
13
+ // Default behavior for submenu is to open on hover
14
14
  // the ...props line below will override this behavior for a submenu
15
15
  // or apply openOnHover if passed into a root Menu.
16
16
  const openOnHover = isSubmenu;
17
17
 
18
+ // We need to be able to cancel the timer that gets set on
19
+ // hover out of the parent popover if the parent popover
20
+ // is also set to open/close on hover out. Otherwise
21
+ // the parent menu will close when the timeout passes.
22
+ const parentPopoverHoverOutTimer = isSubmenu ? context.popoverHoverOutTimer : undefined;
23
+
18
24
  return {
19
25
  openOnHover,
20
26
  ...props,
@@ -23,6 +29,7 @@ export const useMenu = (props: MenuProps): MenuState => {
23
29
  triggerRef,
24
30
  isSubmenu,
25
31
  isControlled,
32
+ parentPopoverHoverOutTimer,
26
33
  };
27
34
  };
28
35
 
@@ -1,6 +1,9 @@
1
+ import React from 'react';
1
2
  import { MenuContextValue } from '../context/menuContext';
2
3
  import { MenuState } from './Menu.types';
3
4
 
4
5
  export const useMenuContextValue = (state: MenuState): MenuContextValue => {
5
- return { ...state };
6
+ const [triggerHoverOutTimer, setTriggerHoverOutTimer] = React.useState<NodeJS.Timeout | undefined>();
7
+ const [popoverHoverOutTimer, setPopoverHoverOutTimer] = React.useState<NodeJS.Timeout>();
8
+ return { ...state, popoverHoverOutTimer, triggerHoverOutTimer, setPopoverHoverOutTimer, setTriggerHoverOutTimer };
6
9
  };
@@ -1,27 +1,20 @@
1
1
  import React from 'react';
2
- import { stagedComponent, useFluentTheme } from '@fluentui-react-native/framework';
2
+ import { mergeProps, stagedComponent, useFluentTheme } from '@fluentui-react-native/framework';
3
3
  import { Callout } from '@fluentui-react-native/callout';
4
4
  import { menuPopoverName, MenuPopoverProps } from './MenuPopover.types';
5
5
  import { useMenuPopover } from './useMenuPopover';
6
+ import { View } from 'react-native';
6
7
 
7
8
  export const MenuPopover = stagedComponent((props: MenuPopoverProps) => {
8
9
  const state = useMenuPopover(props);
9
10
  const theme = useFluentTheme();
10
11
 
11
- return (_rest: MenuPopoverProps, children: React.ReactNode) => {
12
+ return (final: MenuPopoverProps, children: React.ReactNode) => {
13
+ const mergedProps = mergeProps(state.props, final);
14
+ const content = React.createElement(View, state.innerView, children);
12
15
  return (
13
- <Callout
14
- accessibilityRole={state.accessibilityRole}
15
- borderWidth={1}
16
- borderColor={theme.colors.neutralStrokeAccessible}
17
- target={state.triggerRef}
18
- onDismiss={state.onDismiss}
19
- dismissBehaviors={state.dismissBehaviors}
20
- setInitialFocus={state.setInitialFocus}
21
- directionalHint={state.directionalHint}
22
- doNotTakePointerCapture={state.doNotTakePointerCapture}
23
- >
24
- {children}
16
+ <Callout borderWidth={1} borderColor={theme.colors.neutralStrokeAccessible} {...mergedProps}>
17
+ {content}
25
18
  </Callout>
26
19
  );
27
20
  };
@@ -1,16 +1,11 @@
1
- import { DirectionalHint, DismissBehaviors, ICalloutProps } from '@fluentui-react-native/callout';
2
- import { AccessibilityRole } from 'react-native';
1
+ import { IViewProps } from '@fluentui-react-native/adapters';
2
+ import { ICalloutProps } from '@fluentui-react-native/callout';
3
3
 
4
4
  export const menuPopoverName = 'MenuPopover';
5
5
 
6
6
  export type MenuPopoverProps = ICalloutProps;
7
7
 
8
8
  export interface MenuPopoverState {
9
- accessibilityRole: AccessibilityRole;
10
- directionalHint?: DirectionalHint;
11
- dismissBehaviors: DismissBehaviors[];
12
- doNotTakePointerCapture: boolean;
13
- onDismiss: () => void;
14
- setInitialFocus: boolean;
15
- triggerRef: React.RefObject<React.Component>;
9
+ props: ICalloutProps;
10
+ innerView: IViewProps;
16
11
  }
@@ -3,25 +3,63 @@ import { I18nManager, Platform } from 'react-native';
3
3
  import { DirectionalHint, DismissBehaviors } from '@fluentui-react-native/callout';
4
4
  import { useMenuContext } from '../context/menuContext';
5
5
  import { MenuPopoverProps, MenuPopoverState } from './MenuPopover.types';
6
+ import { isCloseOnHoverOutEnabled } from '../consts';
6
7
 
7
8
  export const useMenuPopover = (_props: MenuPopoverProps): MenuPopoverState => {
8
9
  const context = useMenuContext();
9
- const setOpen = context.setOpen;
10
+ const {
11
+ setOpen,
12
+ triggerRef,
13
+ isControlled,
14
+ isSubmenu,
15
+ openOnHover,
16
+ parentPopoverHoverOutTimer,
17
+ popoverHoverOutTimer,
18
+ setPopoverHoverOutTimer,
19
+ triggerHoverOutTimer,
20
+ } = context;
10
21
 
11
- const triggerRef = context.triggerRef;
12
22
  const onDismiss = React.useCallback(() => setOpen(undefined, false /* isOpen */), [setOpen]);
13
- const dismissBehaviors = context.isControlled
14
- ? (['preventDismissOnKeyDown', 'preventDismissOnClickOutside'] as DismissBehaviors[])
15
- : undefined;
16
- const directionalHint = getDirectionalHint(context.isSubmenu, I18nManager.isRTL);
23
+ const dismissBehaviors = isControlled ? (['preventDismissOnKeyDown', 'preventDismissOnClickOutside'] as DismissBehaviors[]) : undefined;
24
+ const directionalHint = getDirectionalHint(isSubmenu, I18nManager.isRTL);
17
25
 
18
26
  // Initial focus behavior differs per platform, Windows platforms move focus
19
27
  // automatically onto first element of Callout
20
28
  const setInitialFocus = Platform.OS === ('win32' as any) || Platform.OS === 'windows';
21
- const doNotTakePointerCapture = context.openOnHover;
29
+ const doNotTakePointerCapture = openOnHover;
22
30
  const accessibilityRole = 'menu';
23
31
 
24
- return { accessibilityRole, triggerRef, onDismiss, directionalHint, dismissBehaviors, doNotTakePointerCapture, setInitialFocus };
32
+ const onMouseEnter = React.useCallback(() => {
33
+ clearTimeout(triggerHoverOutTimer);
34
+ clearTimeout(popoverHoverOutTimer);
35
+ clearTimeout(parentPopoverHoverOutTimer);
36
+ }, [parentPopoverHoverOutTimer, popoverHoverOutTimer, triggerHoverOutTimer]);
37
+ const onMouseLeave = React.useCallback(() => {
38
+ if (!openOnHover) {
39
+ return;
40
+ }
41
+
42
+ const timer = setTimeout(() => {
43
+ setOpen(undefined, false /* isOpen */);
44
+ }, 500);
45
+ setPopoverHoverOutTimer(timer);
46
+ }, [openOnHover, setOpen, setPopoverHoverOutTimer]);
47
+
48
+ return {
49
+ props: {
50
+ accessibilityRole,
51
+ target: triggerRef,
52
+ onDismiss,
53
+ directionalHint,
54
+ dismissBehaviors,
55
+ doNotTakePointerCapture,
56
+ setInitialFocus,
57
+ },
58
+ innerView: {
59
+ onMouseEnter,
60
+ onMouseLeave: isCloseOnHoverOutEnabled && onMouseLeave,
61
+ },
62
+ };
25
63
  };
26
64
 
27
65
  const getDirectionalHint = (isSubmenu: boolean, isRtl: boolean): DirectionalHint | undefined => {
@@ -21,8 +21,8 @@ export const MenuTrigger = stagedComponent((props: MenuTriggerProps) => {
21
21
  // child component which may affect accessibility, we need to modify the
22
22
  // state in the inner render so we can access the child component and its props.
23
23
  const child = childrenArray[0];
24
- const revisedState = getRevisedState(menuTrigger, child.props);
25
- const revised = React.cloneElement(child, revisedState);
24
+ const revisedProps = getRevisedState(menuTrigger, child.props);
25
+ const revised = React.cloneElement(child, revisedProps);
26
26
 
27
27
  return <MenuTriggerProvider value={menuTrigger.hasSubmenu}>{revised}</MenuTriggerProvider>;
28
28
  };
@@ -30,24 +30,24 @@ export const MenuTrigger = stagedComponent((props: MenuTriggerProps) => {
30
30
  MenuTrigger.displayName = menuTriggerName;
31
31
 
32
32
  const getRevisedState = memoize(getRevisedStateWorker);
33
- function getRevisedStateWorker(state: MenuTriggerState, props: any): MenuTriggerState {
34
- const revisedState = { ...state };
33
+ function getRevisedStateWorker(state: MenuTriggerState, props: any): MenuTriggerProps {
34
+ const revisedProps = { ...state.props };
35
35
  if (props.accessibilityState) {
36
- revisedState.props.accessibilityState = { ...state.props.accessibilityState, ...props.accessibilityState };
36
+ revisedProps.accessibilityState = { ...state.props.accessibilityState, ...props.accessibilityState };
37
37
  }
38
38
 
39
39
  if (props.accessibilityActions) {
40
- revisedState.props.accessibilityActions = { ...state.props.accessibilityActions, ...props.accessibilityActions };
40
+ revisedProps.accessibilityActions = { ...state.props.accessibilityActions, ...props.accessibilityActions };
41
41
  }
42
42
 
43
43
  if (props.onAccessibilityAction) {
44
- revisedState.props.onAccessibilityAction = (e: AccessibilityActionEvent) => {
44
+ revisedProps.onAccessibilityAction = (e: AccessibilityActionEvent) => {
45
45
  state.props.onAccessibilityAction(e);
46
46
  props.onAccessibilityAction(e);
47
47
  };
48
48
  }
49
49
 
50
- return revisedState;
50
+ return revisedProps;
51
51
  }
52
52
 
53
53
  export default MenuTrigger;
@@ -3,18 +3,17 @@ import { InteractionEvent } from '@fluentui-react-native/interactive-hooks';
3
3
  import { MenuTriggerProps, MenuTriggerState } from './MenuTrigger.types';
4
4
  import { AccessibilityActionEvent, AccessibilityActionName, Platform } from 'react-native';
5
5
  import React from 'react';
6
+ import { delayHover, isCloseOnHoverOutEnabled } from '../consts';
6
7
 
7
8
  const accessibilityActions =
8
9
  Platform.OS === ('win32' as any) ? [{ name: 'Expand' as AccessibilityActionName }, { name: 'Collapse' as AccessibilityActionName }] : [];
9
10
 
10
11
  export const useMenuTrigger = (_props: MenuTriggerProps): MenuTriggerState => {
11
12
  const context = useMenuContext();
13
+ const { open, openOnHover, popoverHoverOutTimer, setOpen, setTriggerHoverOutTimer, triggerHoverOutTimer, triggerRef } = context;
14
+
15
+ const accessibilityState = open ? { expanded: true } : { expanded: false };
12
16
 
13
- const setOpen = context.setOpen;
14
- const open = context.open;
15
- const openOnHover = context.openOnHover;
16
- const triggerRef = context.triggerRef;
17
- const accessibilityState = context.open ? { expanded: true } : { expanded: false };
18
17
  const onAccessibilityAction = React.useCallback(
19
18
  (e: AccessibilityActionEvent) => {
20
19
  if (Platform.OS === ('win32' as any)) {
@@ -32,35 +31,44 @@ export const useMenuTrigger = (_props: MenuTriggerProps): MenuTriggerState => {
32
31
  [setOpen],
33
32
  );
34
33
 
35
- const delayHover = Platform.select({
36
- macos: 100,
37
- default: 500, // win32
38
- });
39
-
40
- const onHoverIn = (e: InteractionEvent) => {
41
- if (openOnHover) {
42
- setOpen(e, true /* isOpen */);
43
- }
44
- };
34
+ const onHoverIn = React.useCallback(
35
+ (e: InteractionEvent) => {
36
+ if (openOnHover) {
37
+ clearTimeout(popoverHoverOutTimer);
38
+ clearTimeout(triggerHoverOutTimer);
39
+ setTimeout(() => {
40
+ setOpen(e, true /* isOpen */);
41
+ }, delayHover);
42
+ }
43
+ },
44
+ [openOnHover, setOpen, triggerHoverOutTimer, popoverHoverOutTimer],
45
+ );
45
46
 
46
- const onHoverOut = (e: InteractionEvent) => {
47
- if (openOnHover) {
48
- setOpen(e, false /* isOpen */);
49
- }
50
- };
47
+ const onHoverOut = React.useCallback(
48
+ (e: InteractionEvent) => {
49
+ if (openOnHover) {
50
+ const timer = setTimeout(() => {
51
+ setOpen(e, false /* isOpen */);
52
+ }, delayHover);
53
+ setTriggerHoverOutTimer(timer);
54
+ }
55
+ },
56
+ [openOnHover, setOpen, setTriggerHoverOutTimer],
57
+ );
51
58
 
52
- const onClick = (e: InteractionEvent) => {
53
- setOpen(e, !open);
54
- };
59
+ const onClick = React.useCallback(
60
+ (e: InteractionEvent) => {
61
+ setOpen(e, !open);
62
+ },
63
+ [open, setOpen],
64
+ );
55
65
 
56
66
  return {
57
67
  props: {
58
68
  onClick,
59
69
  onHoverIn,
60
- onHoverOut: Platform.OS === ('win32' as any) && onHoverOut,
70
+ onHoverOut: isCloseOnHoverOutEnabled && onHoverOut,
61
71
  componentRef: triggerRef,
62
- delayHoverIn: delayHover,
63
- delayHoverOut: Platform.OS === ('win32' as any) && delayHover,
64
72
  accessibilityState,
65
73
  accessibilityActions,
66
74
  onAccessibilityAction,
package/src/consts.ts ADDED
@@ -0,0 +1,8 @@
1
+ import { Platform } from 'react-native';
2
+
3
+ export const delayHover = Platform.select({
4
+ macos: 100,
5
+ default: 500, // win32
6
+ });
7
+
8
+ export const isCloseOnHoverOutEnabled = Platform.OS === ('win32' as any);
@@ -4,7 +4,12 @@ import type { MenuState } from '../Menu/Menu.types';
4
4
  /**
5
5
  * Context shared between Menu and its child components
6
6
  */
7
- export type MenuContextValue = MenuState;
7
+ export interface MenuContextValue extends MenuState {
8
+ popoverHoverOutTimer?: NodeJS.Timeout;
9
+ triggerHoverOutTimer?: NodeJS.Timeout;
10
+ setPopoverHoverOutTimer?: (timer: NodeJS.Timeout) => void;
11
+ setTriggerHoverOutTimer?: (timer: NodeJS.Timeout) => void;
12
+ }
8
13
 
9
14
  export const MenuContext = React.createContext<MenuContextValue>({
10
15
  isControlled: false,