@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.
Files changed (57) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +17 -0
  3. package/__tests__/unit/PopupTriggerWithHover.test.tsx +141 -0
  4. package/__tests__/unit/useHoverDelay.test.tsx +99 -0
  5. package/__tests__/unit/useHoverTriggerRef.test.tsx +121 -0
  6. package/__tests__/unit/usePreloadRef.test.tsx +118 -0
  7. package/__tests__/unit/usePressableTriggerRef.test.tsx +104 -0
  8. package/__tests__/unit/utils.test.tsx +86 -0
  9. package/afm-cc/tsconfig.json +40 -0
  10. package/afm-products/tsconfig.json +40 -0
  11. package/dist/cjs/PopupTriggerWithHover.js +158 -0
  12. package/dist/cjs/index.js +12 -0
  13. package/dist/cjs/useHoverDelay.js +38 -0
  14. package/dist/cjs/useHoverTriggerRef.js +155 -0
  15. package/dist/cjs/usePreloadRef.js +119 -0
  16. package/dist/cjs/usePressableTriggerRef.js +69 -0
  17. package/dist/cjs/utils.js +48 -0
  18. package/dist/es2019/PopupTriggerWithHover.js +139 -0
  19. package/dist/es2019/index.js +1 -0
  20. package/dist/es2019/useHoverDelay.js +32 -0
  21. package/dist/es2019/useHoverTriggerRef.js +139 -0
  22. package/dist/es2019/usePreloadRef.js +115 -0
  23. package/dist/es2019/usePressableTriggerRef.js +62 -0
  24. package/dist/es2019/utils.js +40 -0
  25. package/dist/esm/PopupTriggerWithHover.js +149 -0
  26. package/dist/esm/index.js +1 -0
  27. package/dist/esm/useHoverDelay.js +34 -0
  28. package/dist/esm/useHoverTriggerRef.js +149 -0
  29. package/dist/esm/usePreloadRef.js +113 -0
  30. package/dist/esm/usePressableTriggerRef.js +63 -0
  31. package/dist/esm/utils.js +41 -0
  32. package/dist/types/PopupTriggerWithHover.d.ts +28 -0
  33. package/dist/types/index.d.ts +1 -0
  34. package/dist/types/useHoverDelay.d.ts +8 -0
  35. package/dist/types/useHoverTriggerRef.d.ts +19 -0
  36. package/dist/types/usePreloadRef.d.ts +13 -0
  37. package/dist/types/usePressableTriggerRef.d.ts +9 -0
  38. package/dist/types/utils.d.ts +16 -0
  39. package/dist/types-ts4.5/PopupTriggerWithHover.d.ts +28 -0
  40. package/dist/types-ts4.5/index.d.ts +1 -0
  41. package/dist/types-ts4.5/useHoverDelay.d.ts +8 -0
  42. package/dist/types-ts4.5/useHoverTriggerRef.d.ts +19 -0
  43. package/dist/types-ts4.5/usePreloadRef.d.ts +13 -0
  44. package/dist/types-ts4.5/usePressableTriggerRef.d.ts +9 -0
  45. package/dist/types-ts4.5/utils.d.ts +16 -0
  46. package/package.json +81 -0
  47. package/popup-trigger-with-hover/package.json +17 -0
  48. package/src/PopupTriggerWithHover.tsx +240 -0
  49. package/src/index.ts +5 -0
  50. package/src/useHoverDelay.ts +42 -0
  51. package/src/useHoverTriggerRef.ts +177 -0
  52. package/src/usePreloadRef.ts +152 -0
  53. package/src/usePressableTriggerRef.ts +89 -0
  54. package/src/utils.ts +49 -0
  55. package/tsconfig.app.json +46 -0
  56. package/tsconfig.dev.json +45 -0
  57. 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
+ }