@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.
- package/es/hooks/useWinClick.d.ts +1 -0
- package/es/hooks/useWinClick.js +67 -0
- package/es/index.js +3 -45
- package/lib/hooks/useWinClick.d.ts +1 -0
- package/lib/hooks/useWinClick.js +75 -0
- package/lib/index.js +2 -44
- package/package.json +1 -1
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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');
|