@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.
- package/CHANGELOG.json +16 -1
- package/CHANGELOG.md +10 -2
- package/lib/Menu/Menu.types.d.ts +2 -0
- package/lib/Menu/Menu.types.d.ts.map +1 -1
- package/lib/Menu/useMenu.d.ts.map +1 -1
- package/lib/Menu/useMenu.js +7 -2
- package/lib/Menu/useMenu.js.map +1 -1
- package/lib/Menu/useMenuContextValue.d.ts.map +1 -1
- package/lib/Menu/useMenuContextValue.js +4 -1
- package/lib/Menu/useMenuContextValue.js.map +1 -1
- package/lib/MenuPopover/MenuPopover.d.ts.map +1 -1
- package/lib/MenuPopover/MenuPopover.js +7 -3
- package/lib/MenuPopover/MenuPopover.js.map +1 -1
- package/lib/MenuPopover/MenuPopover.types.d.ts +4 -10
- package/lib/MenuPopover/MenuPopover.types.d.ts.map +1 -1
- package/lib/MenuPopover/useMenuPopover.d.ts.map +1 -1
- package/lib/MenuPopover/useMenuPopover.js +34 -8
- package/lib/MenuPopover/useMenuPopover.js.map +1 -1
- package/lib/MenuTrigger/MenuTrigger.js +7 -7
- package/lib/MenuTrigger/MenuTrigger.js.map +1 -1
- package/lib/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
- package/lib/MenuTrigger/useMenuTrigger.js +19 -20
- package/lib/MenuTrigger/useMenuTrigger.js.map +1 -1
- package/lib/consts.d.ts +3 -0
- package/lib/consts.d.ts.map +1 -0
- package/lib/consts.js +7 -0
- package/lib/consts.js.map +1 -0
- package/lib/context/menuContext.d.ts +10 -4
- package/lib/context/menuContext.d.ts.map +1 -1
- package/lib/context/menuContext.js.map +1 -1
- package/lib-commonjs/Menu/Menu.types.d.ts +2 -0
- package/lib-commonjs/Menu/Menu.types.d.ts.map +1 -1
- package/lib-commonjs/Menu/useMenu.d.ts.map +1 -1
- package/lib-commonjs/Menu/useMenu.js +7 -2
- package/lib-commonjs/Menu/useMenu.js.map +1 -1
- package/lib-commonjs/Menu/useMenuContextValue.d.ts.map +1 -1
- package/lib-commonjs/Menu/useMenuContextValue.js +4 -1
- package/lib-commonjs/Menu/useMenuContextValue.js.map +1 -1
- package/lib-commonjs/MenuPopover/MenuPopover.d.ts.map +1 -1
- package/lib-commonjs/MenuPopover/MenuPopover.js +5 -2
- package/lib-commonjs/MenuPopover/MenuPopover.js.map +1 -1
- package/lib-commonjs/MenuPopover/MenuPopover.types.d.ts +4 -10
- package/lib-commonjs/MenuPopover/MenuPopover.types.d.ts.map +1 -1
- package/lib-commonjs/MenuPopover/useMenuPopover.d.ts.map +1 -1
- package/lib-commonjs/MenuPopover/useMenuPopover.js +34 -8
- package/lib-commonjs/MenuPopover/useMenuPopover.js.map +1 -1
- package/lib-commonjs/MenuTrigger/MenuTrigger.js +7 -7
- package/lib-commonjs/MenuTrigger/MenuTrigger.js.map +1 -1
- package/lib-commonjs/MenuTrigger/useMenuTrigger.d.ts.map +1 -1
- package/lib-commonjs/MenuTrigger/useMenuTrigger.js +19 -20
- package/lib-commonjs/MenuTrigger/useMenuTrigger.js.map +1 -1
- package/lib-commonjs/consts.d.ts +3 -0
- package/lib-commonjs/consts.d.ts.map +1 -0
- package/lib-commonjs/consts.js +10 -0
- package/lib-commonjs/consts.js.map +1 -0
- package/lib-commonjs/context/menuContext.d.ts +10 -4
- package/lib-commonjs/context/menuContext.d.ts.map +1 -1
- package/lib-commonjs/context/menuContext.js.map +1 -1
- package/package.json +1 -1
- package/src/Menu/Menu.types.ts +1 -0
- package/src/Menu/useMenu.ts +8 -1
- package/src/Menu/useMenuContextValue.ts +4 -1
- package/src/MenuPopover/MenuPopover.tsx +7 -14
- package/src/MenuPopover/MenuPopover.types.ts +4 -9
- package/src/MenuPopover/useMenuPopover.ts +46 -8
- package/src/MenuTrigger/MenuTrigger.tsx +8 -8
- package/src/MenuTrigger/useMenuTrigger.ts +34 -26
- package/src/consts.ts +8 -0
- 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":"
|
|
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;
|
|
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 =
|
|
14
|
-
|
|
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 =
|
|
18
|
+
var doNotTakePointerCapture = openOnHover;
|
|
21
19
|
var accessibilityRole = 'menu';
|
|
22
|
-
|
|
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;
|
|
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
|
|
24
|
-
var revised = react_1.default.cloneElement(child,
|
|
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
|
|
31
|
+
var revisedProps = (0, tslib_1.__assign)({}, state.props);
|
|
32
32
|
if (props.accessibilityState) {
|
|
33
|
-
|
|
33
|
+
revisedProps.accessibilityState = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, state.props.accessibilityState), props.accessibilityState);
|
|
34
34
|
}
|
|
35
35
|
if (props.accessibilityActions) {
|
|
36
|
-
|
|
36
|
+
revisedProps.accessibilityActions = (0, tslib_1.__assign)((0, tslib_1.__assign)({}, state.props.accessibilityActions), props.accessibilityActions);
|
|
37
37
|
}
|
|
38
38
|
if (props.onAccessibilityAction) {
|
|
39
|
-
|
|
39
|
+
revisedProps.onAccessibilityAction = function (e) {
|
|
40
40
|
state.props.onAccessibilityAction(e);
|
|
41
41
|
props.onAccessibilityAction(e);
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
|
-
return
|
|
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;
|
|
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;
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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;
|
|
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 @@
|
|
|
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
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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,
|
|
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;
|
|
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
package/src/Menu/Menu.types.ts
CHANGED
|
@@ -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
|
}
|
package/src/Menu/useMenu.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
-
|
|
10
|
-
|
|
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
|
|
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 =
|
|
14
|
-
|
|
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 =
|
|
29
|
+
const doNotTakePointerCapture = openOnHover;
|
|
22
30
|
const accessibilityRole = 'menu';
|
|
23
31
|
|
|
24
|
-
|
|
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
|
|
25
|
-
const revised = React.cloneElement(child,
|
|
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):
|
|
34
|
-
const
|
|
33
|
+
function getRevisedStateWorker(state: MenuTriggerState, props: any): MenuTriggerProps {
|
|
34
|
+
const revisedProps = { ...state.props };
|
|
35
35
|
if (props.accessibilityState) {
|
|
36
|
-
|
|
36
|
+
revisedProps.accessibilityState = { ...state.props.accessibilityState, ...props.accessibilityState };
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
if (props.accessibilityActions) {
|
|
40
|
-
|
|
40
|
+
revisedProps.accessibilityActions = { ...state.props.accessibilityActions, ...props.accessibilityActions };
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
if (props.onAccessibilityAction) {
|
|
44
|
-
|
|
44
|
+
revisedProps.onAccessibilityAction = (e: AccessibilityActionEvent) => {
|
|
45
45
|
state.props.onAccessibilityAction(e);
|
|
46
46
|
props.onAccessibilityAction(e);
|
|
47
47
|
};
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
return
|
|
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
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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 = (
|
|
47
|
-
|
|
48
|
-
|
|
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 = (
|
|
53
|
-
|
|
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:
|
|
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
|
@@ -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
|
|
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,
|