@rc-component/trigger 2.2.6 → 3.0.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/es/Popup/Arrow.js +23 -20
- package/es/Popup/Mask.d.ts +1 -1
- package/es/Popup/Mask.js +17 -16
- package/es/Popup/PopupContent.js +3 -6
- package/es/Popup/index.d.ts +1 -1
- package/es/Popup/index.js +83 -78
- package/es/TriggerWrapper.js +9 -7
- package/es/context.js +1 -1
- package/es/hooks/useAction.js +5 -5
- package/es/hooks/useAlign.js +205 -215
- package/es/hooks/useWatch.js +11 -12
- package/es/hooks/useWinClick.js +14 -16
- package/es/index.d.ts +2 -14
- package/es/index.js +167 -244
- package/es/interface.d.ts +1 -1
- package/es/mock.js +10 -13
- package/es/util.d.ts +1 -4
- package/es/util.js +57 -75
- package/lib/Popup/Arrow.js +26 -22
- package/lib/Popup/Mask.d.ts +1 -1
- package/lib/Popup/Mask.js +21 -19
- package/lib/Popup/PopupContent.js +5 -7
- package/lib/Popup/index.d.ts +1 -1
- package/lib/Popup/index.js +89 -83
- package/lib/TriggerWrapper.js +11 -8
- package/lib/context.js +3 -2
- package/lib/hooks/useAction.js +7 -6
- package/lib/hooks/useAlign.js +208 -217
- package/lib/hooks/useWatch.js +12 -13
- package/lib/hooks/useWinClick.js +16 -17
- package/lib/index.d.ts +2 -14
- package/lib/index.js +172 -248
- package/lib/interface.d.ts +1 -1
- package/lib/mock.js +12 -15
- package/lib/util.d.ts +1 -4
- package/lib/util.js +57 -77
- package/package.json +10 -11
package/lib/index.js
CHANGED
|
@@ -1,140 +1,127 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
|
|
5
3
|
Object.defineProperty(exports, "__esModule", {
|
|
6
4
|
value: true
|
|
7
5
|
});
|
|
8
6
|
exports.default = void 0;
|
|
9
7
|
exports.generateTrigger = generateTrigger;
|
|
10
|
-
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
11
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
12
|
-
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
13
8
|
var _portal = _interopRequireDefault(require("@rc-component/portal"));
|
|
14
9
|
var _classnames = _interopRequireDefault(require("classnames"));
|
|
15
|
-
var
|
|
16
|
-
var _findDOMNode = require("rc-util/lib/Dom/findDOMNode");
|
|
17
|
-
var _shadow = require("rc-util/lib/Dom/shadow");
|
|
18
|
-
var _useEvent = _interopRequireDefault(require("rc-util/lib/hooks/useEvent"));
|
|
19
|
-
var _useId = _interopRequireDefault(require("rc-util/lib/hooks/useId"));
|
|
20
|
-
var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
|
|
21
|
-
var _isMobile = _interopRequireDefault(require("rc-util/lib/isMobile"));
|
|
10
|
+
var _resizeObserver = _interopRequireDefault(require("@rc-component/resize-observer"));
|
|
11
|
+
var _findDOMNode = require("@rc-component/util/lib/Dom/findDOMNode");
|
|
12
|
+
var _shadow = require("@rc-component/util/lib/Dom/shadow");
|
|
13
|
+
var _useEvent = _interopRequireDefault(require("@rc-component/util/lib/hooks/useEvent"));
|
|
14
|
+
var _useId = _interopRequireDefault(require("@rc-component/util/lib/hooks/useId"));
|
|
15
|
+
var _useLayoutEffect = _interopRequireDefault(require("@rc-component/util/lib/hooks/useLayoutEffect"));
|
|
16
|
+
var _isMobile = _interopRequireDefault(require("@rc-component/util/lib/isMobile"));
|
|
22
17
|
var React = _interopRequireWildcard(require("react"));
|
|
23
18
|
var _Popup = _interopRequireDefault(require("./Popup"));
|
|
24
19
|
var _TriggerWrapper = _interopRequireDefault(require("./TriggerWrapper"));
|
|
25
20
|
var _context = _interopRequireDefault(require("./context"));
|
|
26
|
-
var
|
|
27
|
-
var
|
|
21
|
+
var _useAction = _interopRequireDefault(require("./hooks/useAction"));
|
|
22
|
+
var _useAlign = _interopRequireDefault(require("./hooks/useAlign"));
|
|
28
23
|
var _useWatch = _interopRequireDefault(require("./hooks/useWatch"));
|
|
29
24
|
var _useWinClick = _interopRequireDefault(require("./hooks/useWinClick"));
|
|
30
25
|
var _util = require("./util");
|
|
31
|
-
|
|
26
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
27
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
28
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
32
29
|
// Removed Props List
|
|
33
30
|
// Seems this can be auto
|
|
34
31
|
// getDocument?: (element?: HTMLElement) => Document;
|
|
35
32
|
|
|
36
33
|
// New version will not wrap popup with `rc-trigger-popup-content` when multiple children
|
|
37
34
|
|
|
38
|
-
function generateTrigger() {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
popupVisible
|
|
49
|
-
defaultPopupVisible
|
|
50
|
-
onPopupVisibleChange
|
|
51
|
-
afterPopupVisibleChange
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
mouseLeaveDelay =
|
|
55
|
-
focusDelay
|
|
56
|
-
blurDelay
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
maskClosable =
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
builtinPlacements =
|
|
70
|
-
popupAlign
|
|
71
|
-
zIndex
|
|
72
|
-
stretch
|
|
73
|
-
getPopupClassNameFromAlign
|
|
74
|
-
fresh
|
|
75
|
-
alignPoint
|
|
76
|
-
onPopupClick
|
|
77
|
-
onPopupAlign
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
var mergedAutoDestroy = autoDestroy || destroyPopupOnHide || false;
|
|
35
|
+
function generateTrigger(PortalComponent = _portal.default) {
|
|
36
|
+
const Trigger = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
37
|
+
const {
|
|
38
|
+
prefixCls = 'rc-trigger-popup',
|
|
39
|
+
children,
|
|
40
|
+
// Action
|
|
41
|
+
action = 'hover',
|
|
42
|
+
showAction,
|
|
43
|
+
hideAction,
|
|
44
|
+
// Open
|
|
45
|
+
popupVisible,
|
|
46
|
+
defaultPopupVisible,
|
|
47
|
+
onPopupVisibleChange,
|
|
48
|
+
afterPopupVisibleChange,
|
|
49
|
+
// Delay
|
|
50
|
+
mouseEnterDelay,
|
|
51
|
+
mouseLeaveDelay = 0.1,
|
|
52
|
+
focusDelay,
|
|
53
|
+
blurDelay,
|
|
54
|
+
// Mask
|
|
55
|
+
mask,
|
|
56
|
+
maskClosable = true,
|
|
57
|
+
// Portal
|
|
58
|
+
getPopupContainer,
|
|
59
|
+
forceRender,
|
|
60
|
+
autoDestroy,
|
|
61
|
+
// Popup
|
|
62
|
+
popup,
|
|
63
|
+
popupClassName,
|
|
64
|
+
popupStyle,
|
|
65
|
+
popupPlacement,
|
|
66
|
+
builtinPlacements = {},
|
|
67
|
+
popupAlign,
|
|
68
|
+
zIndex,
|
|
69
|
+
stretch,
|
|
70
|
+
getPopupClassNameFromAlign,
|
|
71
|
+
fresh,
|
|
72
|
+
alignPoint,
|
|
73
|
+
onPopupClick,
|
|
74
|
+
onPopupAlign,
|
|
75
|
+
// Arrow
|
|
76
|
+
arrow,
|
|
77
|
+
// Motion
|
|
78
|
+
popupMotion,
|
|
79
|
+
maskMotion,
|
|
80
|
+
// Private
|
|
81
|
+
getTriggerDOMNode,
|
|
82
|
+
...restProps
|
|
83
|
+
} = props;
|
|
84
|
+
const mergedAutoDestroy = autoDestroy || false;
|
|
89
85
|
|
|
90
86
|
// =========================== Mobile ===========================
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
mobile = _React$useState2[0],
|
|
94
|
-
setMobile = _React$useState2[1];
|
|
95
|
-
(0, _useLayoutEffect.default)(function () {
|
|
87
|
+
const [mobile, setMobile] = React.useState(false);
|
|
88
|
+
(0, _useLayoutEffect.default)(() => {
|
|
96
89
|
setMobile((0, _isMobile.default)());
|
|
97
90
|
}, []);
|
|
98
91
|
|
|
99
92
|
// ========================== Context ===========================
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
93
|
+
const subPopupElements = React.useRef({});
|
|
94
|
+
const parentContext = React.useContext(_context.default);
|
|
95
|
+
const context = React.useMemo(() => {
|
|
103
96
|
return {
|
|
104
|
-
registerSubPopup:
|
|
97
|
+
registerSubPopup: (id, subPopupEle) => {
|
|
105
98
|
subPopupElements.current[id] = subPopupEle;
|
|
106
|
-
parentContext
|
|
99
|
+
parentContext?.registerSubPopup(id, subPopupEle);
|
|
107
100
|
}
|
|
108
101
|
};
|
|
109
102
|
}, [parentContext]);
|
|
110
103
|
|
|
111
104
|
// =========================== Popup ============================
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
_React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
|
|
115
|
-
popupEle = _React$useState4[0],
|
|
116
|
-
setPopupEle = _React$useState4[1];
|
|
105
|
+
const id = (0, _useId.default)();
|
|
106
|
+
const [popupEle, setPopupEle] = React.useState(null);
|
|
117
107
|
|
|
118
108
|
// Used for forwardRef popup. Not use internal
|
|
119
|
-
|
|
120
|
-
|
|
109
|
+
const externalPopupRef = React.useRef(null);
|
|
110
|
+
const setPopupRef = (0, _useEvent.default)(node => {
|
|
121
111
|
externalPopupRef.current = node;
|
|
122
112
|
if ((0, _findDOMNode.isDOM)(node) && popupEle !== node) {
|
|
123
113
|
setPopupEle(node);
|
|
124
114
|
}
|
|
125
|
-
parentContext
|
|
115
|
+
parentContext?.registerSubPopup(id, node);
|
|
126
116
|
});
|
|
127
117
|
|
|
128
118
|
// =========================== Target ===========================
|
|
129
119
|
// Use state to control here since `useRef` update not trigger render
|
|
130
|
-
|
|
131
|
-
_React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2),
|
|
132
|
-
targetEle = _React$useState6[0],
|
|
133
|
-
setTargetEle = _React$useState6[1];
|
|
120
|
+
const [targetEle, setTargetEle] = React.useState(null);
|
|
134
121
|
|
|
135
122
|
// Used for forwardRef target. Not use internal
|
|
136
|
-
|
|
137
|
-
|
|
123
|
+
const externalForwardRef = React.useRef(null);
|
|
124
|
+
const setTargetRef = (0, _useEvent.default)(node => {
|
|
138
125
|
if ((0, _findDOMNode.isDOM)(node) && targetEle !== node) {
|
|
139
126
|
setTargetEle(node);
|
|
140
127
|
externalForwardRef.current = node;
|
|
@@ -142,191 +129,141 @@ function generateTrigger() {
|
|
|
142
129
|
});
|
|
143
130
|
|
|
144
131
|
// ========================== Children ==========================
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
return (childDOM === null || childDOM === void 0 ? void 0 : childDOM.contains(ele)) || ((_getShadowRoot = (0, _shadow.getShadowRoot)(childDOM)) === null || _getShadowRoot === void 0 ? void 0 : _getShadowRoot.host) === ele || ele === childDOM || (popupEle === null || popupEle === void 0 ? void 0 : popupEle.contains(ele)) || ((_getShadowRoot2 = (0, _shadow.getShadowRoot)(popupEle)) === null || _getShadowRoot2 === void 0 ? void 0 : _getShadowRoot2.host) === ele || ele === popupEle || Object.values(subPopupElements.current).some(function (subPopupEle) {
|
|
152
|
-
return (subPopupEle === null || subPopupEle === void 0 ? void 0 : subPopupEle.contains(ele)) || ele === subPopupEle;
|
|
153
|
-
});
|
|
132
|
+
const child = React.Children.only(children);
|
|
133
|
+
const originChildProps = child?.props || {};
|
|
134
|
+
const cloneProps = {};
|
|
135
|
+
const inPopupOrChild = (0, _useEvent.default)(ele => {
|
|
136
|
+
const childDOM = targetEle;
|
|
137
|
+
return childDOM?.contains(ele) || (0, _shadow.getShadowRoot)(childDOM)?.host === ele || ele === childDOM || popupEle?.contains(ele) || (0, _shadow.getShadowRoot)(popupEle)?.host === ele || ele === popupEle || Object.values(subPopupElements.current).some(subPopupEle => subPopupEle?.contains(ele) || ele === subPopupEle);
|
|
154
138
|
});
|
|
155
139
|
|
|
156
|
-
// =========================== Motion ===========================
|
|
157
|
-
var mergePopupMotion = (0, _util.getMotion)(prefixCls, popupMotion, popupAnimation, popupTransitionName);
|
|
158
|
-
var mergeMaskMotion = (0, _util.getMotion)(prefixCls, maskMotion, maskAnimation, maskTransitionName);
|
|
159
|
-
|
|
160
140
|
// ============================ Open ============================
|
|
161
|
-
|
|
162
|
-
_React$useState8 = (0, _slicedToArray2.default)(_React$useState7, 2),
|
|
163
|
-
internalOpen = _React$useState8[0],
|
|
164
|
-
setInternalOpen = _React$useState8[1];
|
|
141
|
+
const [internalOpen, setInternalOpen] = React.useState(defaultPopupVisible || false);
|
|
165
142
|
|
|
166
143
|
// Render still use props as first priority
|
|
167
|
-
|
|
144
|
+
const mergedOpen = popupVisible ?? internalOpen;
|
|
168
145
|
|
|
169
146
|
// We use effect sync here in case `popupVisible` back to `undefined`
|
|
170
|
-
|
|
147
|
+
const setMergedOpen = (0, _useEvent.default)(nextOpen => {
|
|
171
148
|
if (popupVisible === undefined) {
|
|
172
149
|
setInternalOpen(nextOpen);
|
|
173
150
|
}
|
|
174
151
|
});
|
|
175
|
-
(0, _useLayoutEffect.default)(
|
|
152
|
+
(0, _useLayoutEffect.default)(() => {
|
|
176
153
|
setInternalOpen(popupVisible || false);
|
|
177
154
|
}, [popupVisible]);
|
|
178
|
-
|
|
155
|
+
const openRef = React.useRef(mergedOpen);
|
|
179
156
|
openRef.current = mergedOpen;
|
|
180
|
-
|
|
157
|
+
const lastTriggerRef = React.useRef([]);
|
|
181
158
|
lastTriggerRef.current = [];
|
|
182
|
-
|
|
183
|
-
var _lastTriggerRef$curre;
|
|
159
|
+
const internalTriggerOpen = (0, _useEvent.default)(nextOpen => {
|
|
184
160
|
setMergedOpen(nextOpen);
|
|
185
161
|
|
|
186
162
|
// Enter or Pointer will both trigger open state change
|
|
187
163
|
// We only need take one to avoid duplicated change event trigger
|
|
188
164
|
// Use `lastTriggerRef` to record last open type
|
|
189
|
-
if ((
|
|
165
|
+
if ((lastTriggerRef.current[lastTriggerRef.current.length - 1] ?? mergedOpen) !== nextOpen) {
|
|
190
166
|
lastTriggerRef.current.push(nextOpen);
|
|
191
|
-
onPopupVisibleChange
|
|
167
|
+
onPopupVisibleChange?.(nextOpen);
|
|
192
168
|
}
|
|
193
169
|
});
|
|
194
170
|
|
|
195
171
|
// Trigger for delay
|
|
196
|
-
|
|
197
|
-
|
|
172
|
+
const delayRef = React.useRef();
|
|
173
|
+
const clearDelay = () => {
|
|
198
174
|
clearTimeout(delayRef.current);
|
|
199
175
|
};
|
|
200
|
-
|
|
201
|
-
var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
|
|
176
|
+
const triggerOpen = (nextOpen, delay = 0) => {
|
|
202
177
|
clearDelay();
|
|
203
178
|
if (delay === 0) {
|
|
204
179
|
internalTriggerOpen(nextOpen);
|
|
205
180
|
} else {
|
|
206
|
-
delayRef.current = setTimeout(
|
|
181
|
+
delayRef.current = setTimeout(() => {
|
|
207
182
|
internalTriggerOpen(nextOpen);
|
|
208
183
|
}, delay * 1000);
|
|
209
184
|
}
|
|
210
185
|
};
|
|
211
|
-
React.useEffect(
|
|
212
|
-
return clearDelay;
|
|
213
|
-
}, []);
|
|
186
|
+
React.useEffect(() => clearDelay, []);
|
|
214
187
|
|
|
215
188
|
// ========================== Motion ============================
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
inMotion = _React$useState10[0],
|
|
219
|
-
setInMotion = _React$useState10[1];
|
|
220
|
-
(0, _useLayoutEffect.default)(function (firstMount) {
|
|
189
|
+
const [inMotion, setInMotion] = React.useState(false);
|
|
190
|
+
(0, _useLayoutEffect.default)(firstMount => {
|
|
221
191
|
if (!firstMount || mergedOpen) {
|
|
222
192
|
setInMotion(true);
|
|
223
193
|
}
|
|
224
194
|
}, [mergedOpen]);
|
|
225
|
-
|
|
226
|
-
_React$useState12 = (0, _slicedToArray2.default)(_React$useState11, 2),
|
|
227
|
-
motionPrepareResolve = _React$useState12[0],
|
|
228
|
-
setMotionPrepareResolve = _React$useState12[1];
|
|
195
|
+
const [motionPrepareResolve, setMotionPrepareResolve] = React.useState(null);
|
|
229
196
|
|
|
230
197
|
// =========================== Align ============================
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
mousePos = _React$useState14[0],
|
|
234
|
-
setMousePos = _React$useState14[1];
|
|
235
|
-
var setMousePosByEvent = function setMousePosByEvent(event) {
|
|
198
|
+
const [mousePos, setMousePos] = React.useState(null);
|
|
199
|
+
const setMousePosByEvent = event => {
|
|
236
200
|
setMousePos([event.clientX, event.clientY]);
|
|
237
201
|
};
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
offsetR = _useAlign2[3],
|
|
244
|
-
offsetB = _useAlign2[4],
|
|
245
|
-
arrowX = _useAlign2[5],
|
|
246
|
-
arrowY = _useAlign2[6],
|
|
247
|
-
scaleX = _useAlign2[7],
|
|
248
|
-
scaleY = _useAlign2[8],
|
|
249
|
-
alignInfo = _useAlign2[9],
|
|
250
|
-
onAlign = _useAlign2[10];
|
|
251
|
-
var _useAction = (0, _useAction3.default)(mobile, action, showAction, hideAction),
|
|
252
|
-
_useAction2 = (0, _slicedToArray2.default)(_useAction, 2),
|
|
253
|
-
showActions = _useAction2[0],
|
|
254
|
-
hideActions = _useAction2[1];
|
|
255
|
-
var clickToShow = showActions.has('click');
|
|
256
|
-
var clickToHide = hideActions.has('click') || hideActions.has('contextMenu');
|
|
257
|
-
var triggerAlign = (0, _useEvent.default)(function () {
|
|
202
|
+
const [ready, offsetX, offsetY, offsetR, offsetB, arrowX, arrowY, scaleX, scaleY, alignInfo, onAlign] = (0, _useAlign.default)(mergedOpen, popupEle, alignPoint && mousePos !== null ? mousePos : targetEle, popupPlacement, builtinPlacements, popupAlign, onPopupAlign);
|
|
203
|
+
const [showActions, hideActions] = (0, _useAction.default)(mobile, action, showAction, hideAction);
|
|
204
|
+
const clickToShow = showActions.has('click');
|
|
205
|
+
const clickToHide = hideActions.has('click') || hideActions.has('contextMenu');
|
|
206
|
+
const triggerAlign = (0, _useEvent.default)(() => {
|
|
258
207
|
if (!inMotion) {
|
|
259
208
|
onAlign();
|
|
260
209
|
}
|
|
261
210
|
});
|
|
262
|
-
|
|
211
|
+
const onScroll = () => {
|
|
263
212
|
if (openRef.current && alignPoint && clickToHide) {
|
|
264
213
|
triggerOpen(false);
|
|
265
214
|
}
|
|
266
215
|
};
|
|
267
216
|
(0, _useWatch.default)(mergedOpen, targetEle, popupEle, triggerAlign, onScroll);
|
|
268
|
-
(0, _useLayoutEffect.default)(
|
|
217
|
+
(0, _useLayoutEffect.default)(() => {
|
|
269
218
|
triggerAlign();
|
|
270
219
|
}, [mousePos, popupPlacement]);
|
|
271
220
|
|
|
272
221
|
// When no builtinPlacements and popupAlign changed
|
|
273
|
-
(0, _useLayoutEffect.default)(
|
|
274
|
-
if (mergedOpen && !
|
|
222
|
+
(0, _useLayoutEffect.default)(() => {
|
|
223
|
+
if (mergedOpen && !builtinPlacements?.[popupPlacement]) {
|
|
275
224
|
triggerAlign();
|
|
276
225
|
}
|
|
277
226
|
}, [JSON.stringify(popupAlign)]);
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
return (0, _classnames.default)(baseClassName, getPopupClassNameFromAlign
|
|
227
|
+
const alignedClassName = React.useMemo(() => {
|
|
228
|
+
const baseClassName = (0, _util.getAlignPopupClassName)(builtinPlacements, prefixCls, alignInfo, alignPoint);
|
|
229
|
+
return (0, _classnames.default)(baseClassName, getPopupClassNameFromAlign?.(alignInfo));
|
|
281
230
|
}, [alignInfo, getPopupClassNameFromAlign, builtinPlacements, prefixCls, alignPoint]);
|
|
282
231
|
|
|
283
232
|
// ============================ Refs ============================
|
|
284
|
-
React.useImperativeHandle(ref,
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
};
|
|
290
|
-
});
|
|
233
|
+
React.useImperativeHandle(ref, () => ({
|
|
234
|
+
nativeElement: externalForwardRef.current,
|
|
235
|
+
popupElement: externalPopupRef.current,
|
|
236
|
+
forceAlign: triggerAlign
|
|
237
|
+
}));
|
|
291
238
|
|
|
292
239
|
// ========================== Stretch ===========================
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
setTargetWidth = _React$useState16[1];
|
|
297
|
-
var _React$useState17 = React.useState(0),
|
|
298
|
-
_React$useState18 = (0, _slicedToArray2.default)(_React$useState17, 2),
|
|
299
|
-
targetHeight = _React$useState18[0],
|
|
300
|
-
setTargetHeight = _React$useState18[1];
|
|
301
|
-
var syncTargetSize = function syncTargetSize() {
|
|
240
|
+
const [targetWidth, setTargetWidth] = React.useState(0);
|
|
241
|
+
const [targetHeight, setTargetHeight] = React.useState(0);
|
|
242
|
+
const syncTargetSize = () => {
|
|
302
243
|
if (stretch && targetEle) {
|
|
303
|
-
|
|
244
|
+
const rect = targetEle.getBoundingClientRect();
|
|
304
245
|
setTargetWidth(rect.width);
|
|
305
246
|
setTargetHeight(rect.height);
|
|
306
247
|
}
|
|
307
248
|
};
|
|
308
|
-
|
|
249
|
+
const onTargetResize = () => {
|
|
309
250
|
syncTargetSize();
|
|
310
251
|
triggerAlign();
|
|
311
252
|
};
|
|
312
253
|
|
|
313
254
|
// ========================== Motion ============================
|
|
314
|
-
|
|
255
|
+
const onVisibleChanged = visible => {
|
|
315
256
|
setInMotion(false);
|
|
316
257
|
onAlign();
|
|
317
|
-
afterPopupVisibleChange
|
|
258
|
+
afterPopupVisibleChange?.(visible);
|
|
318
259
|
};
|
|
319
260
|
|
|
320
261
|
// We will trigger align when motion is in prepare
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
});
|
|
327
|
-
});
|
|
328
|
-
};
|
|
329
|
-
(0, _useLayoutEffect.default)(function () {
|
|
262
|
+
const onPrepare = () => new Promise(resolve => {
|
|
263
|
+
syncTargetSize();
|
|
264
|
+
setMotionPrepareResolve(() => resolve);
|
|
265
|
+
});
|
|
266
|
+
(0, _useLayoutEffect.default)(() => {
|
|
330
267
|
if (motionPrepareResolve) {
|
|
331
268
|
onAlign();
|
|
332
269
|
motionPrepareResolve();
|
|
@@ -339,23 +276,18 @@ function generateTrigger() {
|
|
|
339
276
|
* Util wrapper for trigger action
|
|
340
277
|
*/
|
|
341
278
|
function wrapperAction(eventName, nextOpen, delay, preEvent) {
|
|
342
|
-
cloneProps[eventName] =
|
|
343
|
-
|
|
344
|
-
preEvent === null || preEvent === void 0 || preEvent(event);
|
|
279
|
+
cloneProps[eventName] = (event, ...args) => {
|
|
280
|
+
preEvent?.(event);
|
|
345
281
|
triggerOpen(nextOpen, delay);
|
|
346
282
|
|
|
347
283
|
// Pass to origin
|
|
348
|
-
|
|
349
|
-
args[_key - 1] = arguments[_key];
|
|
350
|
-
}
|
|
351
|
-
(_originChildProps$eve = originChildProps[eventName]) === null || _originChildProps$eve === void 0 || _originChildProps$eve.call.apply(_originChildProps$eve, [originChildProps, event].concat(args));
|
|
284
|
+
originChildProps[eventName]?.(event, ...args);
|
|
352
285
|
};
|
|
353
286
|
}
|
|
354
287
|
|
|
355
288
|
// ======================= Action: Click ========================
|
|
356
289
|
if (clickToShow || clickToHide) {
|
|
357
|
-
cloneProps.onClick =
|
|
358
|
-
var _originChildProps$onC;
|
|
290
|
+
cloneProps.onClick = (event, ...args) => {
|
|
359
291
|
if (openRef.current && clickToHide) {
|
|
360
292
|
triggerOpen(false);
|
|
361
293
|
} else if (!openRef.current && clickToShow) {
|
|
@@ -364,49 +296,45 @@ function generateTrigger() {
|
|
|
364
296
|
}
|
|
365
297
|
|
|
366
298
|
// Pass to origin
|
|
367
|
-
|
|
368
|
-
args[_key2 - 1] = arguments[_key2];
|
|
369
|
-
}
|
|
370
|
-
(_originChildProps$onC = originChildProps.onClick) === null || _originChildProps$onC === void 0 || _originChildProps$onC.call.apply(_originChildProps$onC, [originChildProps, event].concat(args));
|
|
299
|
+
originChildProps.onClick?.(event, ...args);
|
|
371
300
|
};
|
|
372
301
|
}
|
|
373
302
|
|
|
374
303
|
// Click to hide is special action since click popup element should not hide
|
|
375
|
-
|
|
304
|
+
const onPopupPointerDown = (0, _useWinClick.default)(mergedOpen, clickToHide, targetEle, popupEle, mask, maskClosable, inPopupOrChild, triggerOpen);
|
|
376
305
|
|
|
377
306
|
// ======================= Action: Hover ========================
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
307
|
+
const hoverToShow = showActions.has('hover');
|
|
308
|
+
const hoverToHide = hideActions.has('hover');
|
|
309
|
+
let onPopupMouseEnter;
|
|
310
|
+
let onPopupMouseLeave;
|
|
382
311
|
if (hoverToShow) {
|
|
383
312
|
// Compatible with old browser which not support pointer event
|
|
384
|
-
wrapperAction('onMouseEnter', true, mouseEnterDelay,
|
|
313
|
+
wrapperAction('onMouseEnter', true, mouseEnterDelay, event => {
|
|
385
314
|
setMousePosByEvent(event);
|
|
386
315
|
});
|
|
387
|
-
wrapperAction('onPointerEnter', true, mouseEnterDelay,
|
|
316
|
+
wrapperAction('onPointerEnter', true, mouseEnterDelay, event => {
|
|
388
317
|
setMousePosByEvent(event);
|
|
389
318
|
});
|
|
390
|
-
onPopupMouseEnter =
|
|
319
|
+
onPopupMouseEnter = event => {
|
|
391
320
|
// Only trigger re-open when popup is visible
|
|
392
|
-
if ((mergedOpen || inMotion) && popupEle
|
|
321
|
+
if ((mergedOpen || inMotion) && popupEle?.contains(event.target)) {
|
|
393
322
|
triggerOpen(true, mouseEnterDelay);
|
|
394
323
|
}
|
|
395
324
|
};
|
|
396
325
|
|
|
397
326
|
// Align Point
|
|
398
327
|
if (alignPoint) {
|
|
399
|
-
cloneProps.onMouseMove =
|
|
400
|
-
var _originChildProps$onM;
|
|
328
|
+
cloneProps.onMouseMove = event => {
|
|
401
329
|
// setMousePosByEvent(event);
|
|
402
|
-
|
|
330
|
+
originChildProps.onMouseMove?.(event);
|
|
403
331
|
};
|
|
404
332
|
}
|
|
405
333
|
}
|
|
406
334
|
if (hoverToHide) {
|
|
407
335
|
wrapperAction('onMouseLeave', false, mouseLeaveDelay);
|
|
408
336
|
wrapperAction('onPointerLeave', false, mouseLeaveDelay);
|
|
409
|
-
onPopupMouseLeave =
|
|
337
|
+
onPopupMouseLeave = () => {
|
|
410
338
|
triggerOpen(false, mouseLeaveDelay);
|
|
411
339
|
};
|
|
412
340
|
}
|
|
@@ -421,8 +349,7 @@ function generateTrigger() {
|
|
|
421
349
|
|
|
422
350
|
// ==================== Action: ContextMenu =====================
|
|
423
351
|
if (showActions.has('contextMenu')) {
|
|
424
|
-
cloneProps.onContextMenu =
|
|
425
|
-
var _originChildProps$onC2;
|
|
352
|
+
cloneProps.onContextMenu = (event, ...args) => {
|
|
426
353
|
if (openRef.current && hideActions.has('contextMenu')) {
|
|
427
354
|
triggerOpen(false);
|
|
428
355
|
} else {
|
|
@@ -432,47 +359,44 @@ function generateTrigger() {
|
|
|
432
359
|
event.preventDefault();
|
|
433
360
|
|
|
434
361
|
// Pass to origin
|
|
435
|
-
|
|
436
|
-
args[_key3 - 1] = arguments[_key3];
|
|
437
|
-
}
|
|
438
|
-
(_originChildProps$onC2 = originChildProps.onContextMenu) === null || _originChildProps$onC2 === void 0 || _originChildProps$onC2.call.apply(_originChildProps$onC2, [originChildProps, event].concat(args));
|
|
362
|
+
originChildProps.onContextMenu?.(event, ...args);
|
|
439
363
|
};
|
|
440
364
|
}
|
|
441
365
|
|
|
442
|
-
// ========================= ClassName ==========================
|
|
443
|
-
if (className) {
|
|
444
|
-
cloneProps.className = (0, _classnames.default)(originChildProps.className, className);
|
|
445
|
-
}
|
|
446
|
-
|
|
447
366
|
// =========================== Render ===========================
|
|
448
|
-
|
|
367
|
+
const mergedChildrenProps = {
|
|
368
|
+
...originChildProps,
|
|
369
|
+
...cloneProps
|
|
370
|
+
};
|
|
449
371
|
|
|
450
372
|
// Pass props into cloneProps for nest usage
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
passedEventList.forEach(
|
|
373
|
+
const passedProps = {};
|
|
374
|
+
const passedEventList = ['onContextMenu', 'onClick', 'onMouseDown', 'onTouchStart', 'onMouseEnter', 'onMouseLeave', 'onFocus', 'onBlur'];
|
|
375
|
+
passedEventList.forEach(eventName => {
|
|
454
376
|
if (restProps[eventName]) {
|
|
455
|
-
passedProps[eventName] =
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
args[_key4] = arguments[_key4];
|
|
459
|
-
}
|
|
460
|
-
(_mergedChildrenProps$ = mergedChildrenProps[eventName]) === null || _mergedChildrenProps$ === void 0 || _mergedChildrenProps$.call.apply(_mergedChildrenProps$, [mergedChildrenProps].concat(args));
|
|
461
|
-
restProps[eventName].apply(restProps, args);
|
|
377
|
+
passedProps[eventName] = (...args) => {
|
|
378
|
+
mergedChildrenProps[eventName]?.(...args);
|
|
379
|
+
restProps[eventName](...args);
|
|
462
380
|
};
|
|
463
381
|
}
|
|
464
382
|
});
|
|
465
383
|
|
|
466
384
|
// Child Node
|
|
467
|
-
|
|
468
|
-
|
|
385
|
+
const triggerNode = /*#__PURE__*/React.cloneElement(child, {
|
|
386
|
+
...mergedChildrenProps,
|
|
387
|
+
...passedProps
|
|
388
|
+
});
|
|
389
|
+
const arrowPos = {
|
|
469
390
|
x: arrowX,
|
|
470
391
|
y: arrowY
|
|
471
392
|
};
|
|
472
|
-
|
|
393
|
+
const innerArrow = arrow ? {
|
|
394
|
+
// true and Object likely
|
|
395
|
+
...(arrow !== true ? arrow : {})
|
|
396
|
+
} : null;
|
|
473
397
|
|
|
474
398
|
// Render
|
|
475
|
-
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(
|
|
399
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_resizeObserver.default, {
|
|
476
400
|
disabled: !mergedOpen,
|
|
477
401
|
ref: setTargetRef,
|
|
478
402
|
onResize: onTargetResize
|
|
@@ -508,8 +432,8 @@ function generateTrigger() {
|
|
|
508
432
|
mask: mask
|
|
509
433
|
// Motion
|
|
510
434
|
,
|
|
511
|
-
motion:
|
|
512
|
-
maskMotion:
|
|
435
|
+
motion: popupMotion,
|
|
436
|
+
maskMotion: maskMotion,
|
|
513
437
|
onVisibleChanged: onVisibleChanged,
|
|
514
438
|
onPrepare: onPrepare
|
|
515
439
|
// Portal
|