@atlaskit/teams-app-internal-popup-adaptor 1.1.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.
- package/CHANGELOG.md +10 -0
- package/README.md +17 -0
- package/__tests__/unit/PopupTriggerWithHover.test.tsx +141 -0
- package/__tests__/unit/useHoverDelay.test.tsx +99 -0
- package/__tests__/unit/useHoverTriggerRef.test.tsx +121 -0
- package/__tests__/unit/usePreloadRef.test.tsx +118 -0
- package/__tests__/unit/usePressableTriggerRef.test.tsx +104 -0
- package/__tests__/unit/utils.test.tsx +86 -0
- package/afm-cc/tsconfig.json +40 -0
- package/afm-products/tsconfig.json +40 -0
- package/dist/cjs/PopupTriggerWithHover.js +158 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/useHoverDelay.js +38 -0
- package/dist/cjs/useHoverTriggerRef.js +155 -0
- package/dist/cjs/usePreloadRef.js +119 -0
- package/dist/cjs/usePressableTriggerRef.js +69 -0
- package/dist/cjs/utils.js +48 -0
- package/dist/es2019/PopupTriggerWithHover.js +139 -0
- package/dist/es2019/index.js +1 -0
- package/dist/es2019/useHoverDelay.js +32 -0
- package/dist/es2019/useHoverTriggerRef.js +139 -0
- package/dist/es2019/usePreloadRef.js +115 -0
- package/dist/es2019/usePressableTriggerRef.js +62 -0
- package/dist/es2019/utils.js +40 -0
- package/dist/esm/PopupTriggerWithHover.js +149 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/useHoverDelay.js +34 -0
- package/dist/esm/useHoverTriggerRef.js +149 -0
- package/dist/esm/usePreloadRef.js +113 -0
- package/dist/esm/usePressableTriggerRef.js +63 -0
- package/dist/esm/utils.js +41 -0
- package/dist/types/PopupTriggerWithHover.d.ts +28 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/useHoverDelay.d.ts +8 -0
- package/dist/types/useHoverTriggerRef.d.ts +19 -0
- package/dist/types/usePreloadRef.d.ts +13 -0
- package/dist/types/usePressableTriggerRef.d.ts +9 -0
- package/dist/types/utils.d.ts +16 -0
- package/dist/types-ts4.5/PopupTriggerWithHover.d.ts +28 -0
- package/dist/types-ts4.5/index.d.ts +1 -0
- package/dist/types-ts4.5/useHoverDelay.d.ts +8 -0
- package/dist/types-ts4.5/useHoverTriggerRef.d.ts +19 -0
- package/dist/types-ts4.5/usePreloadRef.d.ts +13 -0
- package/dist/types-ts4.5/usePressableTriggerRef.d.ts +9 -0
- package/dist/types-ts4.5/utils.d.ts +16 -0
- package/package.json +81 -0
- package/popup-trigger-with-hover/package.json +17 -0
- package/src/PopupTriggerWithHover.tsx +240 -0
- package/src/index.ts +5 -0
- package/src/useHoverDelay.ts +42 -0
- package/src/useHoverTriggerRef.ts +177 -0
- package/src/usePreloadRef.ts +152 -0
- package/src/usePressableTriggerRef.ts +89 -0
- package/src/utils.ts +49 -0
- package/tsconfig.app.json +46 -0
- package/tsconfig.dev.json +45 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../../../tsconfig.local-consumption.json",
|
|
3
|
+
"include": [
|
|
4
|
+
"../src/**/*.ts",
|
|
5
|
+
"../src/**/*.tsx"
|
|
6
|
+
],
|
|
7
|
+
"exclude": [
|
|
8
|
+
"../src/**/__tests__/*",
|
|
9
|
+
"../src/**/*.test.*",
|
|
10
|
+
"../src/**/test.*",
|
|
11
|
+
"../src/**/mocks/*",
|
|
12
|
+
"../src/**/examples.*"
|
|
13
|
+
],
|
|
14
|
+
"compilerOptions": {
|
|
15
|
+
"outDir": "../../../../../confluence/tsDist/@atlaskit__teams-app-internal-popup-adaptor",
|
|
16
|
+
"rootDir": "../",
|
|
17
|
+
"composite": true,
|
|
18
|
+
"noCheck": true
|
|
19
|
+
},
|
|
20
|
+
"references": [
|
|
21
|
+
{
|
|
22
|
+
"path": "../../../design-system/popup/afm-cc/tsconfig.json"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"path": "../../../design-system/spinner/afm-cc/tsconfig.json"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"path": "../../../entry-points/entry-point-types/afm-cc/tsconfig.json"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"path": "../../../entry-points/internal-entry-point-container/afm-cc/tsconfig.json"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"path": "../../../async/react-async/afm-cc/tsconfig.json"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"path": "../../../relay/relay-environment-provider/afm-cc/tsconfig.json"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../../../tsconfig.local-consumption.json",
|
|
3
|
+
"include": [
|
|
4
|
+
"../src/**/*.ts",
|
|
5
|
+
"../src/**/*.tsx"
|
|
6
|
+
],
|
|
7
|
+
"exclude": [
|
|
8
|
+
"../src/**/__tests__/*",
|
|
9
|
+
"../src/**/*.test.*",
|
|
10
|
+
"../src/**/test.*",
|
|
11
|
+
"../src/**/mocks/*",
|
|
12
|
+
"../src/**/examples.*"
|
|
13
|
+
],
|
|
14
|
+
"compilerOptions": {
|
|
15
|
+
"outDir": "../../../../../tsDist/@atlaskit__teams-app-internal-popup-adaptor/app",
|
|
16
|
+
"rootDir": "../",
|
|
17
|
+
"composite": true,
|
|
18
|
+
"noCheck": true
|
|
19
|
+
},
|
|
20
|
+
"references": [
|
|
21
|
+
{
|
|
22
|
+
"path": "../../../design-system/popup/afm-products/tsconfig.json"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"path": "../../../design-system/spinner/afm-products/tsconfig.json"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"path": "../../../entry-points/entry-point-types/afm-products/tsconfig.json"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"path": "../../../entry-points/internal-entry-point-container/afm-products/tsconfig.json"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"path": "../../../async/react-async/afm-products/tsconfig.json"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"path": "../../../relay/relay-environment-provider/afm-products/tsconfig.json"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.PopupTriggerWithHover = PopupTriggerWithHover;
|
|
9
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
12
|
+
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
13
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
14
|
+
var _reactRelay = require("react-relay");
|
|
15
|
+
var _useCallbackRef = require("use-callback-ref");
|
|
16
|
+
var _popup = require("@atlaskit/popup");
|
|
17
|
+
var _spinner = _interopRequireDefault(require("@atlaskit/spinner"));
|
|
18
|
+
var _internalEntryPointContainer = require("@atlassian/internal-entry-point-container");
|
|
19
|
+
var _relayEnvironmentProvider = require("@atlassian/relay-environment-provider");
|
|
20
|
+
var _useHoverTriggerRef2 = require("./useHoverTriggerRef");
|
|
21
|
+
var _usePreloadRef = require("./usePreloadRef");
|
|
22
|
+
var _usePressableTriggerRef = require("./usePressableTriggerRef");
|
|
23
|
+
var _excluded = ["trigger", "triggerMode", "entryPoint", "entryPointParams", "entryPointProps", "fallback", "errorFallback", "onError", "forcedReportErrorUFO", "onOpen", "onClose"];
|
|
24
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
|
|
25
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
26
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
27
|
+
var emptyEntryPointParams = {};
|
|
28
|
+
var emptyEntryPointProps = {};
|
|
29
|
+
var FallbackComponent = function FallbackComponent(_ref) {
|
|
30
|
+
var fallback = _ref.fallback,
|
|
31
|
+
onUnmount = _ref.onUnmount;
|
|
32
|
+
(0, _react.useEffect)(function () {
|
|
33
|
+
return function () {
|
|
34
|
+
return onUnmount();
|
|
35
|
+
};
|
|
36
|
+
}, [onUnmount]);
|
|
37
|
+
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, fallback || /*#__PURE__*/_react.default.createElement(_spinner.default, null));
|
|
38
|
+
};
|
|
39
|
+
function PopupTriggerWithHover(_ref2) {
|
|
40
|
+
var trigger = _ref2.trigger,
|
|
41
|
+
_ref2$triggerMode = _ref2.triggerMode,
|
|
42
|
+
triggerMode = _ref2$triggerMode === void 0 ? 'click' : _ref2$triggerMode,
|
|
43
|
+
entryPoint = _ref2.entryPoint,
|
|
44
|
+
entryPointParams = _ref2.entryPointParams,
|
|
45
|
+
entryPointProps = _ref2.entryPointProps,
|
|
46
|
+
fallback = _ref2.fallback,
|
|
47
|
+
errorFallback = _ref2.errorFallback,
|
|
48
|
+
onError = _ref2.onError,
|
|
49
|
+
forcedReportErrorUFO = _ref2.forcedReportErrorUFO,
|
|
50
|
+
onOpen = _ref2.onOpen,
|
|
51
|
+
onClose = _ref2.onClose,
|
|
52
|
+
popupProps = (0, _objectWithoutProperties2.default)(_ref2, _excluded);
|
|
53
|
+
var environmentProvider = (0, _relayEnvironmentProvider.useRelayEnvironmentProvider)();
|
|
54
|
+
var id = (0, _react.useMemo)(function () {
|
|
55
|
+
return entryPoint.root.getModuleName() || 'unknown';
|
|
56
|
+
}, [entryPoint]);
|
|
57
|
+
var _useState = (0, _react.useState)(false),
|
|
58
|
+
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
59
|
+
isOpen = _useState2[0],
|
|
60
|
+
setIsOpen = _useState2[1];
|
|
61
|
+
var _useState3 = (0, _react.useState)(null),
|
|
62
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
63
|
+
content = _useState4[0],
|
|
64
|
+
setContent = _useState4[1];
|
|
65
|
+
var updateRef = (0, _react.useRef)(null);
|
|
66
|
+
var openedByRef = (0, _react.useRef)(null);
|
|
67
|
+
var isOpenRef = (0, _react.useRef)(isOpen);
|
|
68
|
+
var triggers = Array.isArray(triggerMode) ? triggerMode : [triggerMode];
|
|
69
|
+
(0, _react.useLayoutEffect)(function () {
|
|
70
|
+
isOpenRef.current = isOpen;
|
|
71
|
+
}, [isOpen]);
|
|
72
|
+
var handleOpen = (0, _react.useCallback)(function (method) {
|
|
73
|
+
setIsOpen(true);
|
|
74
|
+
if (method) {
|
|
75
|
+
onOpen === null || onOpen === void 0 || onOpen(method);
|
|
76
|
+
}
|
|
77
|
+
}, [onOpen]);
|
|
78
|
+
var handleClose = (0, _react.useCallback)(function (event, currentLevel) {
|
|
79
|
+
setIsOpen(false);
|
|
80
|
+
onClose === null || onClose === void 0 || onClose(event !== null && event !== void 0 ? event : null, currentLevel);
|
|
81
|
+
}, [onClose]);
|
|
82
|
+
var load = (0, _react.useCallback)(function () {
|
|
83
|
+
return (0, _reactRelay.loadEntryPoint)(environmentProvider, entryPoint, entryPointParams !== null && entryPointParams !== void 0 ? entryPointParams : emptyEntryPointParams);
|
|
84
|
+
}, [entryPoint, entryPointParams, environmentProvider]);
|
|
85
|
+
var onLoad = (0, _react.useCallback)(function (_ref3) {
|
|
86
|
+
var entryPointReference = _ref3.reference;
|
|
87
|
+
if (isOpenRef.current) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
handleOpen(openedByRef.current);
|
|
91
|
+
setContent( /*#__PURE__*/_react.default.createElement(_internalEntryPointContainer.InternalEntryPointContainer, {
|
|
92
|
+
id: id,
|
|
93
|
+
entryPointReference: entryPointReference,
|
|
94
|
+
fallback: /*#__PURE__*/_react.default.createElement(FallbackComponent, {
|
|
95
|
+
fallback: fallback,
|
|
96
|
+
onUnmount: function onUnmount() {
|
|
97
|
+
var _updateRef$current;
|
|
98
|
+
return (_updateRef$current = updateRef.current) === null || _updateRef$current === void 0 ? void 0 : _updateRef$current.call(updateRef);
|
|
99
|
+
}
|
|
100
|
+
}),
|
|
101
|
+
errorFallback: errorFallback,
|
|
102
|
+
runtimeProps: _objectSpread(_objectSpread({}, entryPointProps !== null && entryPointProps !== void 0 ? entryPointProps : emptyEntryPointProps), {}, {
|
|
103
|
+
onContentResized: function onContentResized() {
|
|
104
|
+
var _updateRef$current2;
|
|
105
|
+
(_updateRef$current2 = updateRef.current) === null || _updateRef$current2 === void 0 || _updateRef$current2.call(updateRef);
|
|
106
|
+
},
|
|
107
|
+
onClose: handleClose
|
|
108
|
+
}),
|
|
109
|
+
onError: onError,
|
|
110
|
+
forcedError: forcedReportErrorUFO
|
|
111
|
+
}));
|
|
112
|
+
}, [setContent, id, entryPointProps, fallback, forcedReportErrorUFO, errorFallback, handleOpen, onError, handleClose]);
|
|
113
|
+
var preloadRef = (0, _usePreloadRef.usePreloadRef)({
|
|
114
|
+
load: load,
|
|
115
|
+
onLoad: onLoad
|
|
116
|
+
});
|
|
117
|
+
var pressableRef = (0, _usePressableTriggerRef.usePressableTriggerRef)({
|
|
118
|
+
onOpen: preloadRef.loadAndOpen,
|
|
119
|
+
onClose: handleClose,
|
|
120
|
+
isOpen: isOpen,
|
|
121
|
+
isDisabled: !triggers.includes('click'),
|
|
122
|
+
openedByRef: openedByRef
|
|
123
|
+
});
|
|
124
|
+
var _useHoverTriggerRef = (0, _useHoverTriggerRef2.useHoverTriggerRef)({
|
|
125
|
+
onOpen: preloadRef.loadAndOpen,
|
|
126
|
+
onClose: handleClose,
|
|
127
|
+
isOpen: isOpen,
|
|
128
|
+
isDisabled: !triggers.includes('hover'),
|
|
129
|
+
openedByRef: openedByRef
|
|
130
|
+
}),
|
|
131
|
+
hoverTriggerRef = _useHoverTriggerRef.triggerRef,
|
|
132
|
+
hoverContentRef = _useHoverTriggerRef.contentRef;
|
|
133
|
+
(0, _react.useEffect)(function () {
|
|
134
|
+
if (!isOpen) {
|
|
135
|
+
openedByRef.current = null;
|
|
136
|
+
}
|
|
137
|
+
}, [isOpen]);
|
|
138
|
+
var popupTrigger = (0, _react.useCallback)(function (triggerProps) {
|
|
139
|
+
var mergedRef = (0, _useCallbackRef.mergeRefs)([preloadRef, pressableRef, hoverTriggerRef, triggerProps.ref]);
|
|
140
|
+
return trigger(_objectSpread(_objectSpread({}, triggerProps), {}, {
|
|
141
|
+
ref: mergedRef
|
|
142
|
+
}));
|
|
143
|
+
}, [trigger, preloadRef, pressableRef, hoverTriggerRef]);
|
|
144
|
+
var popupContent = (0, _react.useCallback)(function (_ref4) {
|
|
145
|
+
var update = _ref4.update;
|
|
146
|
+
updateRef.current = update;
|
|
147
|
+
return /*#__PURE__*/_react.default.createElement("div", {
|
|
148
|
+
ref: hoverContentRef,
|
|
149
|
+
role: "none"
|
|
150
|
+
}, content);
|
|
151
|
+
}, [content, hoverContentRef]);
|
|
152
|
+
return /*#__PURE__*/_react.default.createElement(_popup.Popup, (0, _extends2.default)({}, popupProps, {
|
|
153
|
+
isOpen: isOpen,
|
|
154
|
+
onClose: handleClose,
|
|
155
|
+
trigger: popupTrigger,
|
|
156
|
+
content: popupContent
|
|
157
|
+
}));
|
|
158
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "PopupTriggerWithHover", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function get() {
|
|
9
|
+
return _PopupTriggerWithHover.PopupTriggerWithHover;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _PopupTriggerWithHover = require("./PopupTriggerWithHover");
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useHoverDelay = useHoverDelay;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
/**
|
|
9
|
+
* Hook for managing delayed hover actions with timeout management.
|
|
10
|
+
*/
|
|
11
|
+
function useHoverDelay(callback, delay) {
|
|
12
|
+
var timeoutRef = (0, _react.useRef)(null);
|
|
13
|
+
var callbackRef = (0, _react.useRef)(callback);
|
|
14
|
+
(0, _react.useEffect)(function () {
|
|
15
|
+
callbackRef.current = callback;
|
|
16
|
+
}, [callback]);
|
|
17
|
+
var clear = (0, _react.useCallback)(function () {
|
|
18
|
+
if (timeoutRef.current) {
|
|
19
|
+
clearTimeout(timeoutRef.current);
|
|
20
|
+
timeoutRef.current = null;
|
|
21
|
+
}
|
|
22
|
+
}, []);
|
|
23
|
+
var schedule = (0, _react.useCallback)(function () {
|
|
24
|
+
clear();
|
|
25
|
+
timeoutRef.current = window.setTimeout(function () {
|
|
26
|
+
callbackRef.current();
|
|
27
|
+
}, delay);
|
|
28
|
+
}, [delay, clear]);
|
|
29
|
+
(0, _react.useEffect)(function () {
|
|
30
|
+
return function () {
|
|
31
|
+
return clear();
|
|
32
|
+
};
|
|
33
|
+
}, [clear]);
|
|
34
|
+
return {
|
|
35
|
+
schedule: schedule,
|
|
36
|
+
clear: clear
|
|
37
|
+
};
|
|
38
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useHoverTriggerRef = useHoverTriggerRef;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _bindEventListener = require("bind-event-listener");
|
|
9
|
+
var _useHoverDelay = require("./useHoverDelay");
|
|
10
|
+
var _utils = require("./utils");
|
|
11
|
+
var HOVER_OPEN_DELAY = 800;
|
|
12
|
+
var HOVER_CLOSE_DELAY = 200;
|
|
13
|
+
/**
|
|
14
|
+
* Hover behavior for popup trigger and content with delayed open/close.
|
|
15
|
+
*/
|
|
16
|
+
function useHoverTriggerRef(_ref) {
|
|
17
|
+
var onOpen = _ref.onOpen,
|
|
18
|
+
onClose = _ref.onClose,
|
|
19
|
+
_ref$isOpen = _ref.isOpen,
|
|
20
|
+
isOpen = _ref$isOpen === void 0 ? false : _ref$isOpen,
|
|
21
|
+
_ref$isDisabled = _ref.isDisabled,
|
|
22
|
+
isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled,
|
|
23
|
+
openedByRef = _ref.openedByRef,
|
|
24
|
+
_ref$delays = _ref.delays,
|
|
25
|
+
delays = _ref$delays === void 0 ? {} : _ref$delays;
|
|
26
|
+
var _delays$hoverOpen = delays.hoverOpen,
|
|
27
|
+
hoverOpen = _delays$hoverOpen === void 0 ? HOVER_OPEN_DELAY : _delays$hoverOpen,
|
|
28
|
+
_delays$hoverClose = delays.hoverClose,
|
|
29
|
+
hoverClose = _delays$hoverClose === void 0 ? HOVER_CLOSE_DELAY : _delays$hoverClose;
|
|
30
|
+
var triggerNodeRef = (0, _react.useRef)(null);
|
|
31
|
+
var triggerListeners = (0, _react.useRef)([]);
|
|
32
|
+
var contentNodeRef = (0, _react.useRef)(null);
|
|
33
|
+
var contentListeners = (0, _react.useRef)(new Map());
|
|
34
|
+
var isOpenRef = (0, _react.useRef)(isOpen);
|
|
35
|
+
(0, _react.useLayoutEffect)(function () {
|
|
36
|
+
isOpenRef.current = isOpen;
|
|
37
|
+
}, [isOpen]);
|
|
38
|
+
var openDelay = (0, _useHoverDelay.useHoverDelay)(function () {
|
|
39
|
+
if (isOpenRef.current) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
if (openedByRef) {
|
|
43
|
+
openedByRef.current = 'hover';
|
|
44
|
+
}
|
|
45
|
+
onOpen();
|
|
46
|
+
}, hoverOpen);
|
|
47
|
+
var closeDelay = (0, _useHoverDelay.useHoverDelay)(function () {
|
|
48
|
+
if (!isOpenRef.current) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!openedByRef || openedByRef.current === 'hover') {
|
|
52
|
+
onClose === null || onClose === void 0 || onClose();
|
|
53
|
+
}
|
|
54
|
+
}, hoverClose);
|
|
55
|
+
var openDelayRef = (0, _react.useRef)(openDelay);
|
|
56
|
+
var closeDelayRef = (0, _react.useRef)(closeDelay);
|
|
57
|
+
openDelayRef.current = openDelay;
|
|
58
|
+
closeDelayRef.current = closeDelay;
|
|
59
|
+
var handleTriggerEnter = (0, _react.useCallback)(function () {
|
|
60
|
+
closeDelayRef.current.clear();
|
|
61
|
+
openDelayRef.current.schedule();
|
|
62
|
+
}, []);
|
|
63
|
+
var handleTriggerLeave = (0, _react.useCallback)(function () {
|
|
64
|
+
openDelayRef.current.clear();
|
|
65
|
+
closeDelayRef.current.schedule();
|
|
66
|
+
}, []);
|
|
67
|
+
var triggerRef = (0, _react.useCallback)(function (element) {
|
|
68
|
+
if (element === triggerNodeRef.current) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
triggerListeners.current.forEach(function (unbind) {
|
|
72
|
+
return unbind();
|
|
73
|
+
});
|
|
74
|
+
triggerListeners.current = [];
|
|
75
|
+
triggerNodeRef.current = element;
|
|
76
|
+
if (element && !isDisabled) {
|
|
77
|
+
triggerListeners.current.push((0, _bindEventListener.bind)(element, {
|
|
78
|
+
type: 'mouseenter',
|
|
79
|
+
listener: handleTriggerEnter
|
|
80
|
+
}), (0, _bindEventListener.bind)(element, {
|
|
81
|
+
type: 'mouseleave',
|
|
82
|
+
listener: handleTriggerLeave
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
}, [handleTriggerEnter, handleTriggerLeave, isDisabled]);
|
|
86
|
+
var handleContentEnter = (0, _react.useCallback)(function () {
|
|
87
|
+
closeDelayRef.current.clear();
|
|
88
|
+
}, []);
|
|
89
|
+
var cleanupContentListeners = (0, _react.useCallback)(function () {
|
|
90
|
+
contentListeners.current.forEach(function (unbind) {
|
|
91
|
+
return unbind();
|
|
92
|
+
});
|
|
93
|
+
contentListeners.current.clear();
|
|
94
|
+
}, []);
|
|
95
|
+
var attachContentListeners = (0, _react.useCallback)(function (element) {
|
|
96
|
+
if (contentListeners.current.has(element)) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
var handleMouseLeave = function handleMouseLeave(event) {
|
|
100
|
+
if (!(0, _utils.hasRelatedTarget)(event)) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
var relatedTarget = event.relatedTarget;
|
|
104
|
+
if ((0, _utils.isMovingToKudos)(relatedTarget)) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
var childPortal = (0, _utils.getChildPortalFromParentPopup)(relatedTarget, contentNodeRef.current);
|
|
108
|
+
if (childPortal) {
|
|
109
|
+
attachContentListeners(childPortal);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
closeDelayRef.current.schedule();
|
|
113
|
+
};
|
|
114
|
+
var unbindEnter = (0, _bindEventListener.bind)(element, {
|
|
115
|
+
type: 'mouseenter',
|
|
116
|
+
listener: handleContentEnter
|
|
117
|
+
});
|
|
118
|
+
var unbindLeave = (0, _bindEventListener.bind)(element, {
|
|
119
|
+
type: 'mouseleave',
|
|
120
|
+
listener: handleMouseLeave
|
|
121
|
+
});
|
|
122
|
+
contentListeners.current.set(element, function () {
|
|
123
|
+
unbindEnter();
|
|
124
|
+
unbindLeave();
|
|
125
|
+
});
|
|
126
|
+
}, [handleContentEnter]);
|
|
127
|
+
var contentRef = (0, _react.useCallback)(function (element) {
|
|
128
|
+
if (element === contentNodeRef.current) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
cleanupContentListeners();
|
|
132
|
+
contentNodeRef.current = element;
|
|
133
|
+
if (element && !isDisabled) {
|
|
134
|
+
attachContentListeners(element);
|
|
135
|
+
}
|
|
136
|
+
}, [attachContentListeners, cleanupContentListeners, isDisabled]);
|
|
137
|
+
(0, _react.useEffect)(function () {
|
|
138
|
+
var listeners = contentListeners.current;
|
|
139
|
+
var triggers = triggerListeners.current;
|
|
140
|
+
return function () {
|
|
141
|
+
openDelayRef.current.clear();
|
|
142
|
+
closeDelayRef.current.clear();
|
|
143
|
+
triggers.forEach(function (unbind) {
|
|
144
|
+
return unbind();
|
|
145
|
+
});
|
|
146
|
+
listeners.forEach(function (unbind) {
|
|
147
|
+
return unbind();
|
|
148
|
+
});
|
|
149
|
+
};
|
|
150
|
+
}, []);
|
|
151
|
+
return {
|
|
152
|
+
triggerRef: triggerRef,
|
|
153
|
+
contentRef: contentRef
|
|
154
|
+
};
|
|
155
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.usePreloadRef = usePreloadRef;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _bindEventListener = require("bind-event-listener");
|
|
9
|
+
var PRELOAD_MAX_AGE = 5 * 60 * 1000;
|
|
10
|
+
var TIME_TO_INTENT = 200;
|
|
11
|
+
function usePreloadRef(_ref) {
|
|
12
|
+
var load = _ref.load,
|
|
13
|
+
onLoad = _ref.onLoad;
|
|
14
|
+
var nodeRef = (0, _react.useRef)(null);
|
|
15
|
+
var eventListeners = (0, _react.useRef)([]);
|
|
16
|
+
var _useMemo = (0, _react.useMemo)(function () {
|
|
17
|
+
var request = {};
|
|
18
|
+
var clearPreloadTimeouts = function clearPreloadTimeouts() {
|
|
19
|
+
if (request.preloadIntentTimeout != null) {
|
|
20
|
+
clearTimeout(request.preloadIntentTimeout);
|
|
21
|
+
delete request.preloadIntentTimeout;
|
|
22
|
+
}
|
|
23
|
+
if (request.preloadMaxAgeTimeout != null) {
|
|
24
|
+
clearTimeout(request.preloadMaxAgeTimeout);
|
|
25
|
+
delete request.preloadMaxAgeTimeout;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var cancelPreload = function cancelPreload() {
|
|
29
|
+
var _request$preload;
|
|
30
|
+
clearPreloadTimeouts();
|
|
31
|
+
(_request$preload = request.preload) === null || _request$preload === void 0 || _request$preload.dispose();
|
|
32
|
+
};
|
|
33
|
+
var loadReference = function loadReference() {
|
|
34
|
+
var _request$preload$refe, _request$preload2;
|
|
35
|
+
if (request.load) {
|
|
36
|
+
return request.load;
|
|
37
|
+
}
|
|
38
|
+
var reference = (_request$preload$refe = (_request$preload2 = request.preload) === null || _request$preload2 === void 0 ? void 0 : _request$preload2.reference) !== null && _request$preload$refe !== void 0 ? _request$preload$refe : load();
|
|
39
|
+
if (request.preload) {
|
|
40
|
+
delete request.preload;
|
|
41
|
+
}
|
|
42
|
+
request.load = {
|
|
43
|
+
reference: reference,
|
|
44
|
+
dispose: function dispose() {
|
|
45
|
+
reference.dispose();
|
|
46
|
+
delete request.load;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
return request.load;
|
|
50
|
+
};
|
|
51
|
+
var loadAndOpen = function loadAndOpen() {
|
|
52
|
+
clearPreloadTimeouts();
|
|
53
|
+
onLoad(loadReference());
|
|
54
|
+
};
|
|
55
|
+
var preloadReference = function preloadReference() {
|
|
56
|
+
if (request.preloadIntentTimeout || request.preload) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
request.preloadIntentTimeout = setTimeout(function () {
|
|
60
|
+
delete request.preloadIntentTimeout;
|
|
61
|
+
var reference = load();
|
|
62
|
+
request.preload = {
|
|
63
|
+
reference: reference,
|
|
64
|
+
dispose: function dispose() {
|
|
65
|
+
reference.dispose();
|
|
66
|
+
delete request.preload;
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
request.preloadMaxAgeTimeout = setTimeout(function () {
|
|
70
|
+
var _request$preload3;
|
|
71
|
+
delete request.preloadMaxAgeTimeout;
|
|
72
|
+
(_request$preload3 = request.preload) === null || _request$preload3 === void 0 || _request$preload3.dispose();
|
|
73
|
+
}, PRELOAD_MAX_AGE);
|
|
74
|
+
}, TIME_TO_INTENT);
|
|
75
|
+
};
|
|
76
|
+
return {
|
|
77
|
+
loadAndOpen: loadAndOpen,
|
|
78
|
+
preloadReference: preloadReference,
|
|
79
|
+
cancelPreload: cancelPreload
|
|
80
|
+
};
|
|
81
|
+
}, [load, onLoad]),
|
|
82
|
+
loadAndOpen = _useMemo.loadAndOpen,
|
|
83
|
+
preloadReference = _useMemo.preloadReference,
|
|
84
|
+
cancelPreload = _useMemo.cancelPreload;
|
|
85
|
+
var cleanUpEventListeners = (0, _react.useCallback)(function () {
|
|
86
|
+
eventListeners.current.forEach(function (unbind) {
|
|
87
|
+
unbind();
|
|
88
|
+
});
|
|
89
|
+
eventListeners.current = [];
|
|
90
|
+
}, []);
|
|
91
|
+
var addEventListener = (0, _react.useCallback)(function (element, type, callback) {
|
|
92
|
+
var unbind = (0, _bindEventListener.bind)(element, {
|
|
93
|
+
type: type,
|
|
94
|
+
listener: callback
|
|
95
|
+
});
|
|
96
|
+
eventListeners.current.push(unbind);
|
|
97
|
+
}, []);
|
|
98
|
+
var refCallback = (0, _react.useCallback)(function (element) {
|
|
99
|
+
if (element !== nodeRef.current) {
|
|
100
|
+
if (nodeRef.current) {
|
|
101
|
+
cancelPreload();
|
|
102
|
+
cleanUpEventListeners();
|
|
103
|
+
}
|
|
104
|
+
if (element) {
|
|
105
|
+
addEventListener(element, 'mouseenter', preloadReference);
|
|
106
|
+
addEventListener(element, 'mouseleave', cancelPreload);
|
|
107
|
+
}
|
|
108
|
+
nodeRef.current = element;
|
|
109
|
+
}
|
|
110
|
+
}, [preloadReference, cancelPreload, addEventListener, cleanUpEventListeners]);
|
|
111
|
+
(0, _react.useEffect)(function () {
|
|
112
|
+
return function () {
|
|
113
|
+
cleanUpEventListeners();
|
|
114
|
+
};
|
|
115
|
+
}, [cleanUpEventListeners]);
|
|
116
|
+
return Object.assign(refCallback, {
|
|
117
|
+
loadAndOpen: loadAndOpen
|
|
118
|
+
});
|
|
119
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.usePressableTriggerRef = usePressableTriggerRef;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _bindEventListener = require("bind-event-listener");
|
|
9
|
+
function usePressableTriggerRef(_ref) {
|
|
10
|
+
var onOpen = _ref.onOpen,
|
|
11
|
+
onClose = _ref.onClose,
|
|
12
|
+
_ref$isOpen = _ref.isOpen,
|
|
13
|
+
isOpen = _ref$isOpen === void 0 ? false : _ref$isOpen,
|
|
14
|
+
_ref$isDisabled = _ref.isDisabled,
|
|
15
|
+
isDisabled = _ref$isDisabled === void 0 ? false : _ref$isDisabled,
|
|
16
|
+
openedByRef = _ref.openedByRef;
|
|
17
|
+
var nodeRef = (0, _react.useRef)(null);
|
|
18
|
+
var eventListeners = (0, _react.useRef)([]);
|
|
19
|
+
var handleOpen = (0, _react.useCallback)(function () {
|
|
20
|
+
if (isOpen) {
|
|
21
|
+
onClose === null || onClose === void 0 || onClose();
|
|
22
|
+
} else {
|
|
23
|
+
if (openedByRef) {
|
|
24
|
+
openedByRef.current = 'click';
|
|
25
|
+
}
|
|
26
|
+
onOpen();
|
|
27
|
+
}
|
|
28
|
+
}, [isOpen, onClose, openedByRef, onOpen]);
|
|
29
|
+
var keydownListener = (0, _react.useCallback)(function (event) {
|
|
30
|
+
if (event instanceof KeyboardEvent && (event.key === 'Enter' || event.key === ' ')) {
|
|
31
|
+
event.preventDefault();
|
|
32
|
+
handleOpen();
|
|
33
|
+
}
|
|
34
|
+
}, [handleOpen]);
|
|
35
|
+
var cleanUpEventListeners = (0, _react.useCallback)(function () {
|
|
36
|
+
eventListeners.current.forEach(function (unbind) {
|
|
37
|
+
unbind();
|
|
38
|
+
});
|
|
39
|
+
eventListeners.current = [];
|
|
40
|
+
}, []);
|
|
41
|
+
var addEventListener = (0, _react.useCallback)(function (element, type, callback) {
|
|
42
|
+
var unbind = (0, _bindEventListener.bind)(element, {
|
|
43
|
+
type: type,
|
|
44
|
+
listener: callback
|
|
45
|
+
});
|
|
46
|
+
eventListeners.current.push(unbind);
|
|
47
|
+
}, []);
|
|
48
|
+
var refCallback = (0, _react.useCallback)(function (element) {
|
|
49
|
+
if (element !== nodeRef.current) {
|
|
50
|
+
if (nodeRef.current) {
|
|
51
|
+
cleanUpEventListeners();
|
|
52
|
+
}
|
|
53
|
+
if (element) {
|
|
54
|
+
if (!isDisabled) {
|
|
55
|
+
addEventListener(element, 'click', handleOpen);
|
|
56
|
+
}
|
|
57
|
+
// Always attach keydown for keyboard accessibility
|
|
58
|
+
addEventListener(element, 'keydown', keydownListener);
|
|
59
|
+
}
|
|
60
|
+
nodeRef.current = element;
|
|
61
|
+
}
|
|
62
|
+
}, [handleOpen, keydownListener, addEventListener, cleanUpEventListeners, isDisabled]);
|
|
63
|
+
(0, _react.useEffect)(function () {
|
|
64
|
+
return function () {
|
|
65
|
+
cleanUpEventListeners();
|
|
66
|
+
};
|
|
67
|
+
}, [cleanUpEventListeners]);
|
|
68
|
+
return refCallback;
|
|
69
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getChildPortalFromParentPopup = getChildPortalFromParentPopup;
|
|
7
|
+
exports.hasRelatedTarget = hasRelatedTarget;
|
|
8
|
+
exports.isMovingToKudos = isMovingToKudos;
|
|
9
|
+
/**
|
|
10
|
+
* Type guard to check if an event has a relatedTarget property.
|
|
11
|
+
*/
|
|
12
|
+
function hasRelatedTarget(event) {
|
|
13
|
+
return 'relatedTarget' in event;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Checks if the mouse is moving to an atlaskit portal or kudos modal
|
|
18
|
+
* where we should prevent the popup from closing
|
|
19
|
+
*/
|
|
20
|
+
function isMovingToKudos(relatedTarget) {
|
|
21
|
+
var _relatedTarget$closes;
|
|
22
|
+
if (!(relatedTarget instanceof HTMLElement)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
var iframe = ((_relatedTarget$closes = relatedTarget.closest('.atlaskit-portal')) === null || _relatedTarget$closes === void 0 ? void 0 : _relatedTarget$closes.querySelector('iframe')) || relatedTarget.closest('iframe');
|
|
26
|
+
return iframe instanceof HTMLIFrameElement && iframe.src.includes('give-kudos');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Returns the child portal if mouse is moving to a portal controlled by the parent popup.
|
|
31
|
+
*/
|
|
32
|
+
function getChildPortalFromParentPopup(relatedTarget, parentPopupElement) {
|
|
33
|
+
if (!(relatedTarget instanceof HTMLElement) || !parentPopupElement) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
var portal = relatedTarget.closest('.atlaskit-portal');
|
|
37
|
+
if (!portal) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
for (var _i = 0, _Array$from = Array.from(parentPopupElement.querySelectorAll('[aria-controls]')); _i < _Array$from.length; _i++) {
|
|
41
|
+
var trigger = _Array$from[_i];
|
|
42
|
+
var controlsId = trigger.getAttribute('aria-controls');
|
|
43
|
+
if (controlsId && portal.querySelector("#".concat(controlsId))) {
|
|
44
|
+
return portal;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|