@ringcentral/juno 2.2.0 → 2.3.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 (142) hide show
  1. package/README.md +1 -2
  2. package/components/Animations/Highlight/Highlight.d.ts +2 -2
  3. package/components/Downshift/SuggestionList/utils/useSuggestionList.js +1 -2
  4. package/components/Downshift/utils/useDownshift.js +2 -3
  5. package/components/Downshift/utils/useDownshiftTag.js +1 -2
  6. package/components/Forms/Picker/DatePicker/DatePicker.js +10 -11
  7. package/components/Forms/Select/PlainSelect/PlainSelect.js +1 -2
  8. package/components/Table/Table.d.ts +14 -0
  9. package/components/Table/Table.js +17 -0
  10. package/components/Table/TableBody/TableBody.d.ts +8 -0
  11. package/components/Table/TableBody/TableBody.js +14 -0
  12. package/components/Table/TableBody/index.d.ts +1 -0
  13. package/components/Table/TableBody/index.js +4 -0
  14. package/components/Table/TableCell/TableCell.d.ts +27 -0
  15. package/components/Table/TableCell/TableCell.js +39 -0
  16. package/components/Table/TableCell/index.d.ts +1 -0
  17. package/components/Table/TableCell/index.js +4 -0
  18. package/components/Table/TableCell/styles/TableCellStyle.d.ts +3 -0
  19. package/components/Table/TableCell/styles/TableCellStyle.js +16 -0
  20. package/components/Table/TableCell/styles/index.d.ts +1 -0
  21. package/components/Table/TableCell/styles/index.js +4 -0
  22. package/components/Table/TableCell/utils/TableCellUtils.d.ts +1 -0
  23. package/components/Table/TableCell/utils/TableCellUtils.js +4 -0
  24. package/components/Table/TableCell/utils/index.d.ts +1 -0
  25. package/components/Table/TableCell/utils/index.js +4 -0
  26. package/components/Table/TableContainer/TableContainer.d.ts +19 -0
  27. package/components/Table/TableContainer/TableContainer.js +22 -0
  28. package/components/Table/TableContainer/index.d.ts +1 -0
  29. package/components/Table/TableContainer/index.js +4 -0
  30. package/components/Table/TableContainer/styles/TableContainerStyle.d.ts +3 -0
  31. package/components/Table/TableContainer/styles/TableContainerStyle.js +13 -0
  32. package/components/Table/TableContainer/styles/index.d.ts +1 -0
  33. package/components/Table/TableContainer/styles/index.js +4 -0
  34. package/components/Table/TableHead/TableHead.d.ts +8 -0
  35. package/components/Table/TableHead/TableHead.js +14 -0
  36. package/components/Table/TableHead/index.d.ts +1 -0
  37. package/components/Table/TableHead/index.js +4 -0
  38. package/components/Table/TableRow/TableRow.d.ts +15 -0
  39. package/components/Table/TableRow/TableRow.js +20 -0
  40. package/components/Table/TableRow/index.d.ts +1 -0
  41. package/components/Table/TableRow/index.js +4 -0
  42. package/components/Table/TableRow/styles/TableRowStyle.d.ts +3 -0
  43. package/components/Table/TableRow/styles/TableRowStyle.js +9 -0
  44. package/components/Table/TableRow/styles/index.d.ts +1 -0
  45. package/components/Table/TableRow/styles/index.js +4 -0
  46. package/components/Table/TableRow/utils/TableRowUtils.d.ts +1 -0
  47. package/components/Table/TableRow/utils/TableRowUtils.js +4 -0
  48. package/components/Table/TableRow/utils/index.d.ts +1 -0
  49. package/components/Table/TableRow/utils/index.js +4 -0
  50. package/components/Table/context.d.ts +10 -0
  51. package/components/Table/context.js +4 -0
  52. package/components/Table/index.d.ts +8 -0
  53. package/components/Table/index.js +10 -0
  54. package/components/Table/types.d.ts +1 -0
  55. package/components/Table/types.js +2 -0
  56. package/components/Tables/TableHead.d.ts +1 -1
  57. package/components/Tables/TableHead.js +1 -3
  58. package/components/Tables/TableHeadCell.d.ts +1 -1
  59. package/components/Tables/TableHeadCell.js +1 -2
  60. package/components/Tooltip/utils/useTooltipForceHide.js +24 -10
  61. package/components/index.d.ts +1 -1
  62. package/components/index.js +1 -1
  63. package/es6/README.md +1 -2
  64. package/es6/components/Downshift/SuggestionList/utils/useSuggestionList.js +1 -2
  65. package/es6/components/Downshift/utils/useDownshift.js +1 -2
  66. package/es6/components/Downshift/utils/useDownshiftTag.js +1 -2
  67. package/es6/components/Forms/Picker/DatePicker/DatePicker.js +1 -2
  68. package/es6/components/Forms/Select/PlainSelect/PlainSelect.js +1 -2
  69. package/es6/components/Table/Table.js +15 -0
  70. package/es6/components/Table/TableBody/TableBody.js +12 -0
  71. package/es6/components/Table/TableBody/index.js +1 -0
  72. package/es6/components/Table/TableCell/TableCell.js +37 -0
  73. package/es6/components/Table/TableCell/index.js +1 -0
  74. package/es6/components/Table/TableCell/styles/TableCellStyle.js +14 -0
  75. package/es6/components/Table/TableCell/styles/index.js +1 -0
  76. package/es6/components/Table/TableCell/utils/TableCellUtils.js +2 -0
  77. package/es6/components/Table/TableCell/utils/index.js +1 -0
  78. package/es6/components/Table/TableContainer/TableContainer.js +20 -0
  79. package/es6/components/Table/TableContainer/index.js +1 -0
  80. package/es6/components/Table/TableContainer/styles/TableContainerStyle.js +11 -0
  81. package/es6/components/Table/TableContainer/styles/index.js +1 -0
  82. package/es6/components/Table/TableHead/TableHead.js +12 -0
  83. package/es6/components/Table/TableHead/index.js +1 -0
  84. package/es6/components/Table/TableRow/TableRow.js +18 -0
  85. package/es6/components/Table/TableRow/index.js +1 -0
  86. package/es6/components/Table/TableRow/styles/TableRowStyle.js +7 -0
  87. package/es6/components/Table/TableRow/styles/index.js +1 -0
  88. package/es6/components/Table/TableRow/utils/TableRowUtils.js +2 -0
  89. package/es6/components/Table/TableRow/utils/index.js +1 -0
  90. package/es6/components/Table/context.js +2 -0
  91. package/es6/components/Table/index.js +7 -0
  92. package/es6/components/Table/types.js +0 -0
  93. package/es6/components/Tables/TableHead.js +1 -3
  94. package/es6/components/Tables/TableHeadCell.js +2 -3
  95. package/es6/components/Tooltip/utils/useTooltipForceHide.js +25 -11
  96. package/es6/components/index.js +1 -1
  97. package/es6/foundation/hooks/index.js +2 -0
  98. package/es6/foundation/hooks/useControlled/index.js +1 -0
  99. package/es6/foundation/hooks/useControlled/useControlled.js +1 -0
  100. package/es6/foundation/hooks/useEventListener/useEventListener.js +8 -6
  101. package/es6/foundation/hooks/useGlobalListener/index.js +1 -0
  102. package/es6/foundation/hooks/useGlobalListener/useGlobalListener.js +130 -0
  103. package/es6/foundation/hooks/useHiddenTabindex/useHiddenTabindex.js +4 -3
  104. package/es6/foundation/hooks/useLongPress/useLongPress.js +2 -3
  105. package/es6/foundation/hooks/useOverflow/useOverflow.js +18 -15
  106. package/es6/foundation/hooks/useResizeObserver/useResizeObserver.js +4 -4
  107. package/es6/foundation/hooks/useTouchMouseEvent/useTouchMouseEvent.js +8 -5
  108. package/es6/foundation/utils/getRefElement.js +13 -0
  109. package/es6/foundation/utils/index.js +1 -0
  110. package/es6/foundation/utils/removeClassName.js +4 -3
  111. package/es6/foundation/utils/selectionHandler.js +7 -6
  112. package/foundation/hooks/index.d.ts +2 -0
  113. package/foundation/hooks/index.js +2 -0
  114. package/foundation/hooks/useControlled/index.d.ts +1 -0
  115. package/foundation/hooks/useControlled/index.js +4 -0
  116. package/foundation/hooks/useControlled/useControlled.d.ts +1 -0
  117. package/foundation/hooks/useControlled/useControlled.js +4 -0
  118. package/foundation/hooks/useEventListener/useEventListener.d.ts +2 -2
  119. package/foundation/hooks/useEventListener/useEventListener.js +8 -6
  120. package/foundation/hooks/useGlobalListener/index.d.ts +1 -0
  121. package/foundation/hooks/useGlobalListener/index.js +4 -0
  122. package/foundation/hooks/useGlobalListener/useGlobalListener.d.ts +108 -0
  123. package/foundation/hooks/useGlobalListener/useGlobalListener.js +133 -0
  124. package/foundation/hooks/useHiddenTabindex/useHiddenTabindex.d.ts +2 -2
  125. package/foundation/hooks/useHiddenTabindex/useHiddenTabindex.js +4 -3
  126. package/foundation/hooks/useLongPress/useLongPress.js +1 -2
  127. package/foundation/hooks/useOverflow/useOverflow.d.ts +2 -3
  128. package/foundation/hooks/useOverflow/useOverflow.js +18 -15
  129. package/foundation/hooks/useResizeObserver/useResizeObserver.d.ts +2 -3
  130. package/foundation/hooks/useResizeObserver/useResizeObserver.js +3 -3
  131. package/foundation/hooks/useTouchMouseEvent/useTouchMouseEvent.d.ts +5 -1
  132. package/foundation/hooks/useTouchMouseEvent/useTouchMouseEvent.js +8 -5
  133. package/foundation/theme/theme.type.d.ts +6 -3
  134. package/foundation/utils/getRefElement.d.ts +6 -0
  135. package/foundation/utils/getRefElement.js +15 -0
  136. package/foundation/utils/index.d.ts +1 -0
  137. package/foundation/utils/index.js +1 -0
  138. package/foundation/utils/removeClassName.d.ts +3 -3
  139. package/foundation/utils/removeClassName.js +4 -3
  140. package/foundation/utils/selectionHandler.d.ts +3 -3
  141. package/foundation/utils/selectionHandler.js +7 -6
  142. package/package.json +1 -1
@@ -1,11 +1,12 @@
1
1
  import { useRef } from 'react';
2
+ import { getRefElement } from '../../utils';
2
3
  import { useResizeObserver } from '../useResizeObserver';
3
4
  /**
4
5
  * trigger when overflow state change
5
6
  */
6
7
  export var useOverflow = function (
7
8
  /** target element ref */
8
- innerRef,
9
+ target,
9
10
  /** trigger when `ResizeObserver` emit */
10
11
  cb,
11
12
  /**
@@ -20,19 +21,21 @@ performance) {
20
21
  }; }
21
22
  // * not have default value for that can trigger change first time.
22
23
  var showRef = useRef();
23
- return useResizeObserver(innerRef, function () {
24
- if (innerRef.current) {
25
- var _a = innerRef.current, scrollWidth = _a.scrollWidth, clientWidth = _a.clientWidth, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight;
26
- var show = scrollWidth > clientWidth || scrollHeight > clientHeight;
27
- if (showRef.current !== show) {
28
- showRef.current = show;
29
- cb(show, {
30
- scrollWidth: scrollWidth,
31
- clientWidth: clientWidth,
32
- scrollHeight: scrollHeight,
33
- clientHeight: clientHeight,
34
- });
35
- }
36
- }
24
+ return useResizeObserver(target, function () {
25
+ var element = getRefElement(target);
26
+ if (!element)
27
+ return;
28
+ var scrollWidth = element.scrollWidth, clientWidth = element.clientWidth, scrollHeight = element.scrollHeight, clientHeight = element.clientHeight;
29
+ var show = scrollWidth > clientWidth || scrollHeight > clientHeight;
30
+ if (showRef.current === show)
31
+ return;
32
+ // only emit when state change
33
+ showRef.current = show;
34
+ cb(show, {
35
+ scrollWidth: scrollWidth,
36
+ clientWidth: clientWidth,
37
+ scrollHeight: scrollHeight,
38
+ clientHeight: clientHeight,
39
+ });
37
40
  }, performance);
38
41
  };
@@ -4,7 +4,7 @@ import debounce from 'lodash/debounce';
4
4
  import throttle from 'lodash/throttle';
5
5
  import ResizeObserverPolyfill from 'resize-observer-polyfill';
6
6
  import { useRcPortalWindowContext } from '../../contexts';
7
- import { logInDev } from '../../utils';
7
+ import { getRefElement, logInDev } from '../../utils';
8
8
  import { useEventCallback } from '../useEventCallback';
9
9
  import { useResultRef } from '../useResultRef';
10
10
  /**
@@ -38,7 +38,7 @@ export var getResizeObserver = function (callback, externalWindow) {
38
38
  */
39
39
  export var useResizeObserver = function (
40
40
  /** target element ref */
41
- ref,
41
+ target,
42
42
  /** trigger when `ResizeObserver` emit */
43
43
  callback,
44
44
  /** performance options, `mode`, `time`, `ignoreFireWhenObserve` */
@@ -74,8 +74,8 @@ performance) {
74
74
  return getResizeObserver(resizeCallback, externalWindow);
75
75
  });
76
76
  useLayoutEffect(function () {
77
+ var elm = getRefElement(target);
77
78
  var observer = observerRef.current;
78
- var elm = ref.current;
79
79
  if (!elm) {
80
80
  throw new Error('please check element exist before bind resize observer');
81
81
  }
@@ -85,6 +85,6 @@ performance) {
85
85
  };
86
86
  // TODO: wait https://github.com/facebook/react/pull/20477 eslint support to remove this exhaustive-deps comment with support custom hooks
87
87
  // eslint-disable-next-line react-hooks/exhaustive-deps
88
- }, [ref]);
88
+ }, [target]);
89
89
  return observerRef.current;
90
90
  };
@@ -1,4 +1,5 @@
1
1
  import { useRef } from 'react';
2
+ import { getRefElement } from '../../utils';
2
3
  import { useEventCallback } from '../useEventCallback';
3
4
  /**
4
5
  * Provide a utils for switch trigger touch event or mouse event between different device
@@ -72,9 +73,11 @@ export var useTouchMouseEvent = function (_a, _b) {
72
73
  onMouseUp: onMouseUp,
73
74
  };
74
75
  };
75
- export var isElmEqualOrContainRef = function (elm, elmRef) {
76
- var _a;
77
- return (elm &&
78
- elmRef &&
79
- (elmRef.current === elm || ((_a = elmRef.current) === null || _a === void 0 ? void 0 : _a.contains(elm))));
76
+ /**
77
+ * check is element equal or contains target element
78
+ */
79
+ export var isElmEqualOrContain = function (sourceTarget, containTarget) {
80
+ var elm = getRefElement(sourceTarget);
81
+ var target = getRefElement(containTarget);
82
+ return elm && target && (target === elm || target.contains(elm));
80
83
  };
@@ -0,0 +1,13 @@
1
+ import { isRef } from './isRef';
2
+ /**
3
+ * get element from React ref or callback
4
+ */
5
+ export var getRefElement = function (ref) {
6
+ if (typeof ref === 'function') {
7
+ return ref();
8
+ }
9
+ if (isRef(ref)) {
10
+ return ref.current;
11
+ }
12
+ return ref;
13
+ };
@@ -4,6 +4,7 @@ export * from './classes';
4
4
  export * from './clearReactReferencesInNode';
5
5
  export * from './combineProps';
6
6
  export * from './deepmerge';
7
+ export * from './getRefElement';
7
8
  export * from './getScrollbarSize';
8
9
  export * from './hasValue';
9
10
  export * from './isRcElement';
@@ -1,7 +1,8 @@
1
+ import { getRefElement } from './getRefElement';
1
2
  /**
2
3
  * remove className from element, default will not scan child nodes, if you want to scan child nodes, set `scanChildren` to `true`.
3
4
  *
4
- * @param elmRef target element reference
5
+ * @param target target element reference or element or callback
5
6
  * @param removeClass className to remove, default will use class `includes` to check, if you want to use full match, set `fullMatch` to `true`
6
7
  *
7
8
  * @example
@@ -16,9 +17,9 @@
16
17
  * elm => <div class="efg"></div>
17
18
  * ```
18
19
  */
19
- export function removeClassName(elmRef, removeClass, _a) {
20
+ export function removeClassName(target, removeClass, _a) {
20
21
  var _b = _a === void 0 ? {} : _a, _c = _b.scanChildren, scanChildren = _c === void 0 ? false : _c, _d = _b.fullMatch, fullMatch = _d === void 0 ? false : _d;
21
- var elm = elmRef.current;
22
+ var elm = getRefElement(target);
22
23
  if (!elm)
23
24
  return;
24
25
  if (elm.className.includes(removeClass)) {
@@ -1,10 +1,11 @@
1
+ import { getRefElement } from './getRefElement';
1
2
  /**
2
3
  * get current input element selection position and is that selectRange state
3
4
  */
4
- export function getSelectionPosition(inputRef) {
5
- var _a, _b;
6
- var currentPosition = (_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.selectionStart;
7
- var currentPositionEnd = (_b = inputRef.current) === null || _b === void 0 ? void 0 : _b.selectionEnd;
5
+ export function getSelectionPosition(sourceTarget) {
6
+ var input = getRefElement(sourceTarget);
7
+ var currentPosition = input === null || input === void 0 ? void 0 : input.selectionStart;
8
+ var currentPositionEnd = input === null || input === void 0 ? void 0 : input.selectionEnd;
8
9
  var isSelectRange = currentPosition !== currentPositionEnd;
9
10
  return {
10
11
  isSelectRange: isSelectRange,
@@ -15,8 +16,8 @@ export function getSelectionPosition(inputRef) {
15
16
  * set input element selection position position,
16
17
  * if you need scroll that into view set `scrollIntoView` as true
17
18
  */
18
- export function setSelectionPosition(inputRef, options) {
19
- var elm = inputRef.current;
19
+ export function setSelectionPosition(target, options) {
20
+ var elm = getRefElement(target);
20
21
  if (elm && options.start !== null && options.end !== null) {
21
22
  // * use blur and refocus to refocus position into view
22
23
  if (options.scrollIntoView)
@@ -2,12 +2,14 @@ export * from './useA11yKeyEvent';
2
2
  export * from './useAnnouncer';
3
3
  export * from './useAudio';
4
4
  export * from './useChange';
5
+ export * from './useControlled';
5
6
  export * from './useDebounce';
6
7
  export * from './useEventCallback';
7
8
  export * from './useEventListener';
8
9
  export * from './useEver';
9
10
  export * from './useForceUpdate';
10
11
  export * from './useForkRef';
12
+ export * from './useGlobalListener';
11
13
  export * from './useHiddenTabindex';
12
14
  export * from './useId';
13
15
  export * from './useInterval';
@@ -5,12 +5,14 @@ tslib_1.__exportStar(require("./useA11yKeyEvent"), exports);
5
5
  tslib_1.__exportStar(require("./useAnnouncer"), exports);
6
6
  tslib_1.__exportStar(require("./useAudio"), exports);
7
7
  tslib_1.__exportStar(require("./useChange"), exports);
8
+ tslib_1.__exportStar(require("./useControlled"), exports);
8
9
  tslib_1.__exportStar(require("./useDebounce"), exports);
9
10
  tslib_1.__exportStar(require("./useEventCallback"), exports);
10
11
  tslib_1.__exportStar(require("./useEventListener"), exports);
11
12
  tslib_1.__exportStar(require("./useEver"), exports);
12
13
  tslib_1.__exportStar(require("./useForceUpdate"), exports);
13
14
  tslib_1.__exportStar(require("./useForkRef"), exports);
15
+ tslib_1.__exportStar(require("./useGlobalListener"), exports);
14
16
  tslib_1.__exportStar(require("./useHiddenTabindex"), exports);
15
17
  tslib_1.__exportStar(require("./useId"), exports);
16
18
  tslib_1.__exportStar(require("./useInterval"), exports);
@@ -0,0 +1 @@
1
+ export * from './useControlled';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./useControlled"), exports);
@@ -0,0 +1 @@
1
+ export { useControlled } from '@material-ui/core/utils';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var utils_1 = require("@material-ui/core/utils");
4
+ exports.useControlled = utils_1.useControlled;
@@ -1,4 +1,4 @@
1
- /// <reference types="react" />
1
+ import { RefOrElementOrCallback } from '../../utils';
2
2
  /**
3
3
  * bind event when component mount and auto remove event when destroy.
4
4
  * can remove listener by call returned function or pass empty 'target'.
@@ -14,7 +14,7 @@
14
14
  * useEventListener(window, 'keyup', () => console.log('window key up'))
15
15
  * ```
16
16
  */
17
- export declare function useEventListener(target?: EventTarget | null | React.RefObject<HTMLElement>, ...o: Parameters<EventTarget['addEventListener']>): {
17
+ export declare function useEventListener(target?: RefOrElementOrCallback | EventTarget, ...o: Parameters<EventTarget['addEventListener']>): {
18
18
  listen: () => void;
19
19
  remove: () => void;
20
20
  };
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var tslib_1 = require("tslib");
4
4
  var react_1 = require("react");
5
- var isRef_1 = require("../../utils/isRef");
5
+ var utils_1 = require("../../utils");
6
6
  var useEventCallback_1 = require("../useEventCallback");
7
7
  /**
8
8
  * bind event when component mount and auto remove event when destroy.
@@ -28,16 +28,18 @@ function useEventListener(target) {
28
28
  var listener = useEventCallback_1.useEventCallback(cb);
29
29
  var cancelRef = react_1.useRef(function () { });
30
30
  var bindRef = react_1.useRef(function () { });
31
- var currentRefElm = isRef_1.isRef(target) && target.current;
31
+ var currentRefElm = utils_1.getRefElement(target);
32
32
  react_1.useEffect(function () {
33
33
  if (!target)
34
34
  return;
35
- var elm = isRef_1.isRef(target) ? target.current : target;
36
- if (!elm) {
35
+ var currentElm = utils_1.getRefElement(target);
36
+ if (!currentElm) {
37
37
  return cancelRef.current;
38
38
  }
39
- bindRef.current = function () { return elm.addEventListener(key, listener, options); };
40
- cancelRef.current = function () { return elm.removeEventListener(key, listener, options); };
39
+ bindRef.current = function () { return currentElm.addEventListener(key, listener, options); };
40
+ cancelRef.current = function () {
41
+ return currentElm.removeEventListener(key, listener, options);
42
+ };
41
43
  bindRef.current();
42
44
  return cancelRef.current;
43
45
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -0,0 +1 @@
1
+ export * from './useGlobalListener';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./useGlobalListener"), exports);
@@ -0,0 +1,108 @@
1
+ /// <reference types="react" />
2
+ /// <reference types="styled-jsx" />
3
+ import { RefOrElementOrCallback } from '../../utils';
4
+ export declare const globalListenerEventMap: Map<string, {
5
+ /**
6
+ * listener exec method
7
+ */
8
+ exec: (e: any) => void;
9
+ /**
10
+ * all listener
11
+ */
12
+ listeners: Set<(e: any) => void>;
13
+ }>;
14
+ /**
15
+ * create globalListener handler for share one listener event
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * const globalListener = createGlobalListener('focus', () => { console.log('focus') });
20
+ * const globalListener2 = createGlobalListener('focus', () => { console.log('focus') });
21
+ * globalListener.listen();
22
+ * globalListener2.listen();
23
+ *
24
+ * => // that will only create an event listener on window, but every callback will get emit value when event triggered
25
+ * ```
26
+ */
27
+ export declare const createGlobalListener: (key: string, listener: EventListener, { customKey, target: targetProp, }?: {
28
+ /**
29
+ * custom key for determining different event group, default is same as `key`
30
+ */
31
+ customKey?: string | undefined;
32
+ /**
33
+ * custom binding event target, default is `window`
34
+ */
35
+ target?: EventTarget | HTMLElement | import("react").RefObject<HTMLElement> | (() => HTMLElement) | undefined;
36
+ }) => {
37
+ /**
38
+ * bind listener again
39
+ */
40
+ listen: () => void;
41
+ /**
42
+ * remove listener
43
+ */
44
+ remove: () => void;
45
+ /**
46
+ * current listener state
47
+ */
48
+ readonly state: {
49
+ /**
50
+ * current listener state count
51
+ */
52
+ readonly count: number;
53
+ /**
54
+ * is that be listening
55
+ */
56
+ listening: boolean;
57
+ };
58
+ };
59
+ /**
60
+ * bind global event, when you bind same key event,
61
+ * that will reuse one event listener and trigger both callback once that listener be triggered.
62
+ *
63
+ * also you can control listener with method `listen` and `remove`
64
+ * and get listener `state` for check listener count number and current listing state.
65
+ *
66
+ * - `key` `options` only work when set first time, never change after first render
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * useGlobalListener('keyup', () => console.log('window key up1'))
71
+ * useGlobalListener('keyup', () => console.log('window key up2'))
72
+ * useGlobalListener('keyup', () => console.log('window key up3'))
73
+ *
74
+ * => // that will only create an event listener on `window`, but every callback will get emit value when event triggered
75
+ * ```
76
+ */
77
+ export declare function useGlobalListener(key: string, listener: EventListener, options?: {
78
+ /**
79
+ * custom key for determining different event group, default is same as `key`
80
+ */
81
+ customKey?: string;
82
+ /**
83
+ * custom binding event target, default is `window`
84
+ */
85
+ target?: RefOrElementOrCallback | EventTarget;
86
+ }): {
87
+ /**
88
+ * bind listener again
89
+ */
90
+ listen: () => void;
91
+ /**
92
+ * remove listener
93
+ */
94
+ remove: () => void;
95
+ /**
96
+ * current listener state
97
+ */
98
+ readonly state: {
99
+ /**
100
+ * current listener state count
101
+ */
102
+ readonly count: number;
103
+ /**
104
+ * is that be listening
105
+ */
106
+ listening: boolean;
107
+ };
108
+ };
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var react_1 = require("react");
4
+ var utils_1 = require("../../utils");
5
+ var useEventCallback_1 = require("../useEventCallback");
6
+ exports.globalListenerEventMap = new Map();
7
+ /**
8
+ * create globalListener handler for share one listener event
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const globalListener = createGlobalListener('focus', () => { console.log('focus') });
13
+ * const globalListener2 = createGlobalListener('focus', () => { console.log('focus') });
14
+ * globalListener.listen();
15
+ * globalListener2.listen();
16
+ *
17
+ * => // that will only create an event listener on window, but every callback will get emit value when event triggered
18
+ * ```
19
+ */
20
+ exports.createGlobalListener = function (key, listener, _a) {
21
+ var _b = _a === void 0 ? {} : _a, _c = _b.customKey, customKey = _c === void 0 ? key : _c, _d = _b.target, targetProp = _d === void 0 ? window : _d;
22
+ var listening = false;
23
+ var getMapValue = function () { return exports.globalListenerEventMap.get(customKey); };
24
+ var addListener = function () {
25
+ if (listening)
26
+ return;
27
+ var savedEvent = getMapValue();
28
+ if (!(savedEvent === null || savedEvent === void 0 ? void 0 : savedEvent.exec)) {
29
+ var exec = function (e) {
30
+ var event = getMapValue();
31
+ event === null || event === void 0 ? void 0 : event.listeners.forEach(function (c) { return c(e); });
32
+ };
33
+ exports.globalListenerEventMap.set(customKey, {
34
+ exec: exec,
35
+ listeners: new Set([listener]),
36
+ });
37
+ var target = utils_1.getRefElement(targetProp);
38
+ target === null || target === void 0 ? void 0 : target.addEventListener(key, exec);
39
+ }
40
+ else {
41
+ savedEvent.listeners.add(listener);
42
+ }
43
+ listening = true;
44
+ };
45
+ var removeListener = function () {
46
+ if (!listening)
47
+ return;
48
+ listening = false;
49
+ var _savedEvent = getMapValue();
50
+ if (!_savedEvent)
51
+ return;
52
+ var listeners = _savedEvent.listeners;
53
+ listeners.delete(listener);
54
+ if (listeners.size === 0) {
55
+ var target = utils_1.getRefElement(targetProp);
56
+ target === null || target === void 0 ? void 0 : target.removeEventListener(key, _savedEvent.exec);
57
+ exports.globalListenerEventMap.delete(customKey);
58
+ }
59
+ };
60
+ return {
61
+ /**
62
+ * bind listener again
63
+ */
64
+ listen: function () { return addListener(); },
65
+ /**
66
+ * remove listener
67
+ */
68
+ remove: function () { return removeListener(); },
69
+ /**
70
+ * current listener state
71
+ */
72
+ get state() {
73
+ return {
74
+ /**
75
+ * current listener state count
76
+ */
77
+ get count() {
78
+ var _a;
79
+ return ((_a = getMapValue()) === null || _a === void 0 ? void 0 : _a.listeners.size) || 0;
80
+ },
81
+ /**
82
+ * is that be listening
83
+ */
84
+ listening: listening,
85
+ };
86
+ },
87
+ };
88
+ };
89
+ /**
90
+ * bind global event, when you bind same key event,
91
+ * that will reuse one event listener and trigger both callback once that listener be triggered.
92
+ *
93
+ * also you can control listener with method `listen` and `remove`
94
+ * and get listener `state` for check listener count number and current listing state.
95
+ *
96
+ * - `key` `options` only work when set first time, never change after first render
97
+ *
98
+ * @example
99
+ * ```ts
100
+ * useGlobalListener('keyup', () => console.log('window key up1'))
101
+ * useGlobalListener('keyup', () => console.log('window key up2'))
102
+ * useGlobalListener('keyup', () => console.log('window key up3'))
103
+ *
104
+ * => // that will only create an event listener on `window`, but every callback will get emit value when event triggered
105
+ * ```
106
+ */
107
+ function useGlobalListener(key, listener, options) {
108
+ if (options === void 0) { options = {}; }
109
+ var _listener = useEventCallback_1.useEventCallback(listener);
110
+ var globalListener = react_1.useRef(exports.createGlobalListener(key, _listener, options)).current;
111
+ if (process.env.NODE_ENV !== 'production') {
112
+ var _a = options.customKey, customKey_1 = _a === void 0 ? key : _a, _b = options.target, targetProp_1 = _b === void 0 ? window : _b;
113
+ // eslint-disable-next-line react-hooks/rules-of-hooks
114
+ react_1.useEffect(function () {
115
+ var target = utils_1.getRefElement(targetProp_1);
116
+ if (target !== window && customKey_1 === key) {
117
+ utils_1.logInDev({
118
+ component: 'useGlobalListener',
119
+ message: 'When you custom binding event target, you must custom key for determining different event group',
120
+ level: 'error',
121
+ });
122
+ }
123
+ // eslint-disable-next-line react-hooks/exhaustive-deps
124
+ }, []);
125
+ }
126
+ react_1.useEffect(function () {
127
+ globalListener.listen();
128
+ return globalListener.remove;
129
+ // eslint-disable-next-line react-hooks/exhaustive-deps
130
+ }, []);
131
+ return globalListener;
132
+ }
133
+ exports.useGlobalListener = useGlobalListener;
@@ -1,9 +1,9 @@
1
- import React from 'react';
1
+ import { RefOrElementOrCallback } from '../../utils';
2
2
  /**
3
3
  * group hidden logic, when binding events element focus,
4
4
  * that hiddenRef will auto be `tabindex={-1}` *
5
5
  */
6
- export declare const useHiddenTabindex: <T extends HTMLElement>(hiddenRef: React.RefObject<T>) => {
6
+ export declare const useHiddenTabindex: <T extends HTMLElement>(target: RefOrElementOrCallback<T>) => {
7
7
  onFocus: () => void;
8
8
  onBlur: () => void;
9
9
  };
@@ -1,19 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ var utils_1 = require("../../utils");
3
4
  var useEventCallback_1 = require("../useEventCallback");
4
5
  /**
5
6
  * group hidden logic, when binding events element focus,
6
7
  * that hiddenRef will auto be `tabindex={-1}` *
7
8
  */
8
- exports.useHiddenTabindex = function (hiddenRef) {
9
+ exports.useHiddenTabindex = function (target) {
9
10
  var handleFocus = useEventCallback_1.useEventCallback(function () {
10
- var hiddenElm = hiddenRef.current;
11
+ var hiddenElm = utils_1.getRefElement(target);
11
12
  if (hiddenElm && hiddenElm.tabIndex === 0) {
12
13
  hiddenElm.tabIndex = -1;
13
14
  }
14
15
  });
15
16
  var handleBlur = useEventCallback_1.useEventCallback(function () {
16
- var hiddenElm = hiddenRef.current;
17
+ var hiddenElm = utils_1.getRefElement(target);
17
18
  if (hiddenElm && hiddenElm.tabIndex === -1) {
18
19
  hiddenElm.tabIndex = 0;
19
20
  }
@@ -32,8 +32,7 @@ exports.useLongPress = function (_a, _b, _c) {
32
32
  var end = function (e) {
33
33
  // ! mouse up only trigger when up on element, so we host that in document
34
34
  document.removeEventListener('mouseup', onMouseUp);
35
- if (!isEmittedRef.current &&
36
- useTouchMouseEvent_1.isElmEqualOrContainRef(e.target, elmRef)) {
35
+ if (!isEmittedRef.current && useTouchMouseEvent_1.isElmEqualOrContain(e.target, elmRef)) {
37
36
  onTap === null || onTap === void 0 ? void 0 : onTap(e, reasonRef.current);
38
37
  }
39
38
  reasonRef.current = 'click';
@@ -1,10 +1,9 @@
1
- /// <reference types="react" />
2
- /// <reference types="styled-jsx" />
1
+ import { RefOrElementOrCallback } from '../../utils';
3
2
  import { PerformanceOptions } from '../useResizeObserver';
4
3
  /**
5
4
  * trigger when overflow state change
6
5
  */
7
- export declare const useOverflow: (innerRef: import("react").RefObject<HTMLElement>, cb: (state: boolean, value: {
6
+ export declare const useOverflow: (target: RefOrElementOrCallback<HTMLElement>, cb: (state: boolean, value: {
8
7
  scrollWidth: number;
9
8
  clientWidth: number;
10
9
  scrollHeight: number;
@@ -1,13 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  var react_1 = require("react");
4
+ var utils_1 = require("../../utils");
4
5
  var useResizeObserver_1 = require("../useResizeObserver");
5
6
  /**
6
7
  * trigger when overflow state change
7
8
  */
8
9
  exports.useOverflow = function (
9
10
  /** target element ref */
10
- innerRef,
11
+ target,
11
12
  /** trigger when `ResizeObserver` emit */
12
13
  cb,
13
14
  /**
@@ -22,19 +23,21 @@ performance) {
22
23
  }; }
23
24
  // * not have default value for that can trigger change first time.
24
25
  var showRef = react_1.useRef();
25
- return useResizeObserver_1.useResizeObserver(innerRef, function () {
26
- if (innerRef.current) {
27
- var _a = innerRef.current, scrollWidth = _a.scrollWidth, clientWidth = _a.clientWidth, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight;
28
- var show = scrollWidth > clientWidth || scrollHeight > clientHeight;
29
- if (showRef.current !== show) {
30
- showRef.current = show;
31
- cb(show, {
32
- scrollWidth: scrollWidth,
33
- clientWidth: clientWidth,
34
- scrollHeight: scrollHeight,
35
- clientHeight: clientHeight,
36
- });
37
- }
38
- }
26
+ return useResizeObserver_1.useResizeObserver(target, function () {
27
+ var element = utils_1.getRefElement(target);
28
+ if (!element)
29
+ return;
30
+ var scrollWidth = element.scrollWidth, clientWidth = element.clientWidth, scrollHeight = element.scrollHeight, clientHeight = element.clientHeight;
31
+ var show = scrollWidth > clientWidth || scrollHeight > clientHeight;
32
+ if (showRef.current === show)
33
+ return;
34
+ // only emit when state change
35
+ showRef.current = show;
36
+ cb(show, {
37
+ scrollWidth: scrollWidth,
38
+ clientWidth: clientWidth,
39
+ scrollHeight: scrollHeight,
40
+ clientHeight: clientHeight,
41
+ });
39
42
  }, performance);
40
43
  };