@rc-component/trigger 1.13.0 → 1.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ export default function useWinClick(open: boolean, clickToHide: boolean, targetEle: HTMLElement, popupEle: HTMLElement, mask: boolean, maskClosable: boolean, inPopupOrChild: (target: EventTarget) => boolean, triggerOpen: (open: boolean) => void): void;
@@ -0,0 +1,67 @@
1
+ import { warning } from 'rc-util';
2
+ import raf from "rc-util/es/raf";
3
+ import * as React from 'react';
4
+ import { getWin } from "../util";
5
+ export default function useWinClick(open, clickToHide, targetEle, popupEle, mask, maskClosable, inPopupOrChild, triggerOpen) {
6
+ var openRef = React.useRef(open);
7
+
8
+ // Window click to hide should be lock to avoid trigger lock immediately
9
+ var lockRef = React.useRef(false);
10
+ if (openRef.current !== open) {
11
+ lockRef.current = true;
12
+ openRef.current = open;
13
+ }
14
+ React.useEffect(function () {
15
+ var id = raf(function () {
16
+ lockRef.current = false;
17
+ });
18
+ return function () {
19
+ raf.cancel(id);
20
+ };
21
+ }, [open]);
22
+
23
+ // Click to hide is special action since click popup element should not hide
24
+ React.useEffect(function () {
25
+ if (clickToHide && popupEle && (!mask || maskClosable)) {
26
+ var clickInside = false;
27
+
28
+ // User may mouseDown inside and drag out of popup and mouse up
29
+ // Record here to prevent close
30
+ var onWindowMouseDown = function onWindowMouseDown(_ref) {
31
+ var target = _ref.target;
32
+ clickInside = inPopupOrChild(target);
33
+ };
34
+ var onWindowClick = function onWindowClick(_ref2) {
35
+ var target = _ref2.target;
36
+ if (!lockRef.current && openRef.current && !clickInside && !inPopupOrChild(target)) {
37
+ triggerOpen(false);
38
+ }
39
+ };
40
+ var win = getWin(popupEle);
41
+ var targetRoot = targetEle === null || targetEle === void 0 ? void 0 : targetEle.getRootNode();
42
+ win.addEventListener('mousedown', onWindowMouseDown);
43
+ win.addEventListener('click', onWindowClick);
44
+
45
+ // shadow root
46
+ var inShadow = targetRoot && targetRoot !== targetEle.ownerDocument;
47
+ if (inShadow) {
48
+ targetRoot.addEventListener('mousedown', onWindowMouseDown);
49
+ targetRoot.addEventListener('click', onWindowClick);
50
+ }
51
+
52
+ // Warning if target and popup not in same root
53
+ if (process.env.NODE_ENV !== 'production') {
54
+ var popupRoot = popupEle.getRootNode();
55
+ warning(targetRoot === popupRoot, "trigger element and popup element should in same shadow root.");
56
+ }
57
+ return function () {
58
+ win.removeEventListener('mousedown', onWindowMouseDown);
59
+ win.removeEventListener('click', onWindowClick);
60
+ if (inShadow) {
61
+ targetRoot.removeEventListener('mousedown', onWindowMouseDown);
62
+ targetRoot.removeEventListener('click', onWindowClick);
63
+ }
64
+ };
65
+ }
66
+ }, [clickToHide, targetEle, popupEle, mask, maskClosable]);
67
+ }
package/es/index.js CHANGED
@@ -10,15 +10,15 @@ import useEvent from "rc-util/es/hooks/useEvent";
10
10
  import useId from "rc-util/es/hooks/useId";
11
11
  import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
12
12
  import isMobile from "rc-util/es/isMobile";
13
- import warning from "rc-util/es/warning";
14
13
  import * as React from 'react';
15
14
  import TriggerContext from "./context";
16
15
  import useAction from "./hooks/useAction";
17
16
  import useAlign from "./hooks/useAlign";
18
17
  import useWatch from "./hooks/useWatch";
18
+ import useWinClick from "./hooks/useWinClick";
19
19
  import Popup from "./Popup";
20
20
  import TriggerWrapper from "./TriggerWrapper";
21
- import { getAlignPopupClassName, getMotion, getWin } from "./util";
21
+ import { getAlignPopupClassName, getMotion } from "./util";
22
22
  export function generateTrigger() {
23
23
  var PortalComponent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Portal;
24
24
  var Trigger = /*#__PURE__*/React.forwardRef(function (props, ref) {
@@ -325,49 +325,7 @@ export function generateTrigger() {
325
325
  }
326
326
 
327
327
  // Click to hide is special action since click popup element should not hide
328
- React.useEffect(function () {
329
- if (clickToHide && popupEle && (!mask || maskClosable)) {
330
- var clickInside = false;
331
-
332
- // User may mouseDown inside and drag out of popup and mouse up
333
- // Record here to prevent close
334
- var onWindowMouseDown = function onWindowMouseDown(_ref) {
335
- var target = _ref.target;
336
- clickInside = inPopupOrChild(target);
337
- };
338
- var onWindowClick = function onWindowClick(_ref2) {
339
- var target = _ref2.target;
340
- if (openRef.current && !clickInside && !inPopupOrChild(target)) {
341
- triggerOpen(false);
342
- }
343
- };
344
- var win = getWin(popupEle);
345
- var targetRoot = targetEle === null || targetEle === void 0 ? void 0 : targetEle.getRootNode();
346
- win.addEventListener('mousedown', onWindowMouseDown);
347
- win.addEventListener('click', onWindowClick);
348
-
349
- // shadow root
350
- var inShadow = targetRoot && targetRoot !== targetEle.ownerDocument;
351
- if (inShadow) {
352
- targetRoot.addEventListener('mousedown', onWindowMouseDown);
353
- targetRoot.addEventListener('click', onWindowClick);
354
- }
355
-
356
- // Warning if target and popup not in same root
357
- if (process.env.NODE_ENV !== 'production') {
358
- var popupRoot = popupEle.getRootNode();
359
- warning(targetRoot === popupRoot, "trigger element and popup element should in same shadow root.");
360
- }
361
- return function () {
362
- win.removeEventListener('mousedown', onWindowMouseDown);
363
- win.removeEventListener('click', onWindowClick);
364
- if (inShadow) {
365
- targetRoot.removeEventListener('mousedown', onWindowMouseDown);
366
- targetRoot.removeEventListener('click', onWindowClick);
367
- }
368
- };
369
- }
370
- }, [clickToHide, targetEle, popupEle, mask, maskClosable]);
328
+ useWinClick(mergedOpen, clickToHide, targetEle, popupEle, mask, maskClosable, inPopupOrChild, triggerOpen);
371
329
 
372
330
  // ======================= Action: Hover ========================
373
331
  var hoverToShow = showActions.has('hover');
@@ -0,0 +1 @@
1
+ export default function useWinClick(open: boolean, clickToHide: boolean, targetEle: HTMLElement, popupEle: HTMLElement, mask: boolean, maskClosable: boolean, inPopupOrChild: (target: EventTarget) => boolean, triggerOpen: (open: boolean) => void): void;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = useWinClick;
9
+ var _rcUtil = require("rc-util");
10
+ var _raf = _interopRequireDefault(require("rc-util/lib/raf"));
11
+ var React = _interopRequireWildcard(require("react"));
12
+ var _util = require("../util");
13
+ function useWinClick(open, clickToHide, targetEle, popupEle, mask, maskClosable, inPopupOrChild, triggerOpen) {
14
+ var openRef = React.useRef(open);
15
+
16
+ // Window click to hide should be lock to avoid trigger lock immediately
17
+ var lockRef = React.useRef(false);
18
+ if (openRef.current !== open) {
19
+ lockRef.current = true;
20
+ openRef.current = open;
21
+ }
22
+ React.useEffect(function () {
23
+ var id = (0, _raf.default)(function () {
24
+ lockRef.current = false;
25
+ });
26
+ return function () {
27
+ _raf.default.cancel(id);
28
+ };
29
+ }, [open]);
30
+
31
+ // Click to hide is special action since click popup element should not hide
32
+ React.useEffect(function () {
33
+ if (clickToHide && popupEle && (!mask || maskClosable)) {
34
+ var clickInside = false;
35
+
36
+ // User may mouseDown inside and drag out of popup and mouse up
37
+ // Record here to prevent close
38
+ var onWindowMouseDown = function onWindowMouseDown(_ref) {
39
+ var target = _ref.target;
40
+ clickInside = inPopupOrChild(target);
41
+ };
42
+ var onWindowClick = function onWindowClick(_ref2) {
43
+ var target = _ref2.target;
44
+ if (!lockRef.current && openRef.current && !clickInside && !inPopupOrChild(target)) {
45
+ triggerOpen(false);
46
+ }
47
+ };
48
+ var win = (0, _util.getWin)(popupEle);
49
+ var targetRoot = targetEle === null || targetEle === void 0 ? void 0 : targetEle.getRootNode();
50
+ win.addEventListener('mousedown', onWindowMouseDown);
51
+ win.addEventListener('click', onWindowClick);
52
+
53
+ // shadow root
54
+ var inShadow = targetRoot && targetRoot !== targetEle.ownerDocument;
55
+ if (inShadow) {
56
+ targetRoot.addEventListener('mousedown', onWindowMouseDown);
57
+ targetRoot.addEventListener('click', onWindowClick);
58
+ }
59
+
60
+ // Warning if target and popup not in same root
61
+ if (process.env.NODE_ENV !== 'production') {
62
+ var popupRoot = popupEle.getRootNode();
63
+ (0, _rcUtil.warning)(targetRoot === popupRoot, "trigger element and popup element should in same shadow root.");
64
+ }
65
+ return function () {
66
+ win.removeEventListener('mousedown', onWindowMouseDown);
67
+ win.removeEventListener('click', onWindowClick);
68
+ if (inShadow) {
69
+ targetRoot.removeEventListener('mousedown', onWindowMouseDown);
70
+ targetRoot.removeEventListener('click', onWindowClick);
71
+ }
72
+ };
73
+ }
74
+ }, [clickToHide, targetEle, popupEle, mask, maskClosable]);
75
+ }
package/lib/index.js CHANGED
@@ -18,12 +18,12 @@ var _useEvent = _interopRequireDefault(require("rc-util/lib/hooks/useEvent"));
18
18
  var _useId = _interopRequireDefault(require("rc-util/lib/hooks/useId"));
19
19
  var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
20
20
  var _isMobile = _interopRequireDefault(require("rc-util/lib/isMobile"));
21
- var _warning = _interopRequireDefault(require("rc-util/lib/warning"));
22
21
  var React = _interopRequireWildcard(require("react"));
23
22
  var _context = _interopRequireDefault(require("./context"));
24
23
  var _useAction3 = _interopRequireDefault(require("./hooks/useAction"));
25
24
  var _useAlign3 = _interopRequireDefault(require("./hooks/useAlign"));
26
25
  var _useWatch = _interopRequireDefault(require("./hooks/useWatch"));
26
+ var _useWinClick = _interopRequireDefault(require("./hooks/useWinClick"));
27
27
  var _Popup = _interopRequireDefault(require("./Popup"));
28
28
  var _TriggerWrapper = _interopRequireDefault(require("./TriggerWrapper"));
29
29
  var _util = require("./util");
@@ -334,49 +334,7 @@ function generateTrigger() {
334
334
  }
335
335
 
336
336
  // Click to hide is special action since click popup element should not hide
337
- React.useEffect(function () {
338
- if (clickToHide && popupEle && (!mask || maskClosable)) {
339
- var clickInside = false;
340
-
341
- // User may mouseDown inside and drag out of popup and mouse up
342
- // Record here to prevent close
343
- var onWindowMouseDown = function onWindowMouseDown(_ref) {
344
- var target = _ref.target;
345
- clickInside = inPopupOrChild(target);
346
- };
347
- var onWindowClick = function onWindowClick(_ref2) {
348
- var target = _ref2.target;
349
- if (openRef.current && !clickInside && !inPopupOrChild(target)) {
350
- triggerOpen(false);
351
- }
352
- };
353
- var win = (0, _util.getWin)(popupEle);
354
- var targetRoot = targetEle === null || targetEle === void 0 ? void 0 : targetEle.getRootNode();
355
- win.addEventListener('mousedown', onWindowMouseDown);
356
- win.addEventListener('click', onWindowClick);
357
-
358
- // shadow root
359
- var inShadow = targetRoot && targetRoot !== targetEle.ownerDocument;
360
- if (inShadow) {
361
- targetRoot.addEventListener('mousedown', onWindowMouseDown);
362
- targetRoot.addEventListener('click', onWindowClick);
363
- }
364
-
365
- // Warning if target and popup not in same root
366
- if (process.env.NODE_ENV !== 'production') {
367
- var popupRoot = popupEle.getRootNode();
368
- (0, _warning.default)(targetRoot === popupRoot, "trigger element and popup element should in same shadow root.");
369
- }
370
- return function () {
371
- win.removeEventListener('mousedown', onWindowMouseDown);
372
- win.removeEventListener('click', onWindowClick);
373
- if (inShadow) {
374
- targetRoot.removeEventListener('mousedown', onWindowMouseDown);
375
- targetRoot.removeEventListener('click', onWindowClick);
376
- }
377
- };
378
- }
379
- }, [clickToHide, targetEle, popupEle, mask, maskClosable]);
337
+ (0, _useWinClick.default)(mergedOpen, clickToHide, targetEle, popupEle, mask, maskClosable, inPopupOrChild, triggerOpen);
380
338
 
381
339
  // ======================= Action: Hover ========================
382
340
  var hoverToShow = showActions.has('hover');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rc-component/trigger",
3
- "version": "1.13.0",
3
+ "version": "1.13.1",
4
4
  "description": "base abstract trigger component for react",
5
5
  "engines": {
6
6
  "node": ">=8.x"