@rc-component/trigger 1.0.0 → 1.0.2

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/lib/index.js CHANGED
@@ -6,9 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.default = void 0;
9
+ exports.generateTrigger = generateTrigger;
9
10
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
10
11
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
12
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
+ var _portal = _interopRequireDefault(require("@rc-component/portal"));
12
14
  var _classnames = _interopRequireDefault(require("classnames"));
13
15
  var _rcResizeObserver = _interopRequireDefault(require("rc-resize-observer"));
14
16
  var _useEvent = _interopRequireDefault(require("rc-util/lib/hooks/useEvent"));
@@ -23,435 +25,441 @@ var _useWatch = _interopRequireDefault(require("./hooks/useWatch"));
23
25
  var _Popup = _interopRequireDefault(require("./Popup"));
24
26
  var _TriggerWrapper = _interopRequireDefault(require("./TriggerWrapper"));
25
27
  var _util = require("./util");
26
- var _excluded = ["prefixCls", "children", "action", "showAction", "hideAction", "popupVisible", "defaultPopupVisible", "onPopupVisibleChange", "afterPopupVisibleChange", "mouseEnterDelay", "mouseLeaveDelay", "focusDelay", "blurDelay", "mask", "maskClosable", "getPopupContainer", "forceRender", "autoDestroy", "destroyPopupOnHide", "popup", "popupClassName", "popupStyle", "popupPlacement", "builtinPlacements", "popupAlign", "zIndex", "stretch", "getPopupClassNameFromAlign", "alignPoint", "onPopupClick", "arrow", "popupMotion", "maskMotion", "popupTransitionName", "popupAnimation", "maskTransitionName", "maskAnimation", "className", "getTriggerDOMNode"];
27
- var Trigger = /*#__PURE__*/React.forwardRef(function (props, ref) {
28
- var _props$prefixCls = props.prefixCls,
29
- prefixCls = _props$prefixCls === void 0 ? 'rc-trigger-popup' : _props$prefixCls,
30
- children = props.children,
31
- _props$action = props.action,
32
- action = _props$action === void 0 ? 'hover' : _props$action,
33
- showAction = props.showAction,
34
- hideAction = props.hideAction,
35
- popupVisible = props.popupVisible,
36
- defaultPopupVisible = props.defaultPopupVisible,
37
- onPopupVisibleChange = props.onPopupVisibleChange,
38
- afterPopupVisibleChange = props.afterPopupVisibleChange,
39
- mouseEnterDelay = props.mouseEnterDelay,
40
- _props$mouseLeaveDela = props.mouseLeaveDelay,
41
- mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela,
42
- focusDelay = props.focusDelay,
43
- blurDelay = props.blurDelay,
44
- mask = props.mask,
45
- _props$maskClosable = props.maskClosable,
46
- maskClosable = _props$maskClosable === void 0 ? true : _props$maskClosable,
47
- getPopupContainer = props.getPopupContainer,
48
- forceRender = props.forceRender,
49
- autoDestroy = props.autoDestroy,
50
- destroyPopupOnHide = props.destroyPopupOnHide,
51
- popup = props.popup,
52
- popupClassName = props.popupClassName,
53
- popupStyle = props.popupStyle,
54
- popupPlacement = props.popupPlacement,
55
- _props$builtinPlaceme = props.builtinPlacements,
56
- builtinPlacements = _props$builtinPlaceme === void 0 ? {} : _props$builtinPlaceme,
57
- popupAlign = props.popupAlign,
58
- zIndex = props.zIndex,
59
- stretch = props.stretch,
60
- getPopupClassNameFromAlign = props.getPopupClassNameFromAlign,
61
- alignPoint = props.alignPoint,
62
- onPopupClick = props.onPopupClick,
63
- arrow = props.arrow,
64
- popupMotion = props.popupMotion,
65
- maskMotion = props.maskMotion,
66
- popupTransitionName = props.popupTransitionName,
67
- popupAnimation = props.popupAnimation,
68
- maskTransitionName = props.maskTransitionName,
69
- maskAnimation = props.maskAnimation,
70
- className = props.className,
71
- getTriggerDOMNode = props.getTriggerDOMNode,
72
- restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
73
- var mergedAutoDestroy = autoDestroy || destroyPopupOnHide || false;
28
+ var _excluded = ["prefixCls", "children", "action", "showAction", "hideAction", "popupVisible", "defaultPopupVisible", "onPopupVisibleChange", "afterPopupVisibleChange", "mouseEnterDelay", "mouseLeaveDelay", "focusDelay", "blurDelay", "mask", "maskClosable", "getPopupContainer", "forceRender", "autoDestroy", "destroyPopupOnHide", "popup", "popupClassName", "popupStyle", "popupPlacement", "builtinPlacements", "popupAlign", "zIndex", "stretch", "getPopupClassNameFromAlign", "alignPoint", "onPopupClick", "onPopupAlign", "arrow", "popupMotion", "maskMotion", "popupTransitionName", "popupAnimation", "maskTransitionName", "maskAnimation", "className", "getTriggerDOMNode"];
29
+ function generateTrigger() {
30
+ var PortalComponent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _portal.default;
31
+ var Trigger = /*#__PURE__*/React.forwardRef(function (props, ref) {
32
+ var _props$prefixCls = props.prefixCls,
33
+ prefixCls = _props$prefixCls === void 0 ? 'rc-trigger-popup' : _props$prefixCls,
34
+ children = props.children,
35
+ _props$action = props.action,
36
+ action = _props$action === void 0 ? 'hover' : _props$action,
37
+ showAction = props.showAction,
38
+ hideAction = props.hideAction,
39
+ popupVisible = props.popupVisible,
40
+ defaultPopupVisible = props.defaultPopupVisible,
41
+ onPopupVisibleChange = props.onPopupVisibleChange,
42
+ afterPopupVisibleChange = props.afterPopupVisibleChange,
43
+ mouseEnterDelay = props.mouseEnterDelay,
44
+ _props$mouseLeaveDela = props.mouseLeaveDelay,
45
+ mouseLeaveDelay = _props$mouseLeaveDela === void 0 ? 0.1 : _props$mouseLeaveDela,
46
+ focusDelay = props.focusDelay,
47
+ blurDelay = props.blurDelay,
48
+ mask = props.mask,
49
+ _props$maskClosable = props.maskClosable,
50
+ maskClosable = _props$maskClosable === void 0 ? true : _props$maskClosable,
51
+ getPopupContainer = props.getPopupContainer,
52
+ forceRender = props.forceRender,
53
+ autoDestroy = props.autoDestroy,
54
+ destroyPopupOnHide = props.destroyPopupOnHide,
55
+ popup = props.popup,
56
+ popupClassName = props.popupClassName,
57
+ popupStyle = props.popupStyle,
58
+ popupPlacement = props.popupPlacement,
59
+ _props$builtinPlaceme = props.builtinPlacements,
60
+ builtinPlacements = _props$builtinPlaceme === void 0 ? {} : _props$builtinPlaceme,
61
+ popupAlign = props.popupAlign,
62
+ zIndex = props.zIndex,
63
+ stretch = props.stretch,
64
+ getPopupClassNameFromAlign = props.getPopupClassNameFromAlign,
65
+ alignPoint = props.alignPoint,
66
+ onPopupClick = props.onPopupClick,
67
+ onPopupAlign = props.onPopupAlign,
68
+ arrow = props.arrow,
69
+ popupMotion = props.popupMotion,
70
+ maskMotion = props.maskMotion,
71
+ popupTransitionName = props.popupTransitionName,
72
+ popupAnimation = props.popupAnimation,
73
+ maskTransitionName = props.maskTransitionName,
74
+ maskAnimation = props.maskAnimation,
75
+ className = props.className,
76
+ getTriggerDOMNode = props.getTriggerDOMNode,
77
+ restProps = (0, _objectWithoutProperties2.default)(props, _excluded);
78
+ var mergedAutoDestroy = autoDestroy || destroyPopupOnHide || false;
74
79
 
75
- // ========================== Context ===========================
76
- var subPopupElements = React.useRef({});
77
- var parentContext = React.useContext(_context.default);
78
- var context = React.useMemo(function () {
79
- return {
80
- registerSubPopup: function registerSubPopup(id, subPopupEle) {
81
- subPopupElements.current[id] = subPopupEle;
82
- parentContext === null || parentContext === void 0 ? void 0 : parentContext.registerSubPopup(id, subPopupEle);
83
- }
84
- };
85
- }, [parentContext]);
80
+ // ========================== Context ===========================
81
+ var subPopupElements = React.useRef({});
82
+ var parentContext = React.useContext(_context.default);
83
+ var context = React.useMemo(function () {
84
+ return {
85
+ registerSubPopup: function registerSubPopup(id, subPopupEle) {
86
+ subPopupElements.current[id] = subPopupEle;
87
+ parentContext === null || parentContext === void 0 ? void 0 : parentContext.registerSubPopup(id, subPopupEle);
88
+ }
89
+ };
90
+ }, [parentContext]);
86
91
 
87
- // =========================== Popup ============================
88
- var id = (0, _useId.default)();
89
- var _React$useState = React.useState(null),
90
- _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
91
- popupEle = _React$useState2[0],
92
- setPopupEle = _React$useState2[1];
93
- var setPopupRef = React.useCallback(function (node) {
94
- if (node instanceof HTMLElement) {
95
- setPopupEle(node);
96
- }
97
- parentContext === null || parentContext === void 0 ? void 0 : parentContext.registerSubPopup(id, node);
98
- }, []);
92
+ // =========================== Popup ============================
93
+ var id = (0, _useId.default)();
94
+ var _React$useState = React.useState(null),
95
+ _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
96
+ popupEle = _React$useState2[0],
97
+ setPopupEle = _React$useState2[1];
98
+ var setPopupRef = React.useCallback(function (node) {
99
+ if (node instanceof HTMLElement) {
100
+ setPopupEle(node);
101
+ }
102
+ parentContext === null || parentContext === void 0 ? void 0 : parentContext.registerSubPopup(id, node);
103
+ }, []);
99
104
 
100
- // =========================== Target ===========================
101
- // Use state to control here since `useRef` update not trigger render
102
- var _React$useState3 = React.useState(null),
103
- _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
104
- targetEle = _React$useState4[0],
105
- setTargetEle = _React$useState4[1];
106
- var setTargetRef = React.useCallback(function (node) {
107
- if (node instanceof HTMLElement) {
108
- setTargetEle(node);
109
- }
110
- }, []);
105
+ // =========================== Target ===========================
106
+ // Use state to control here since `useRef` update not trigger render
107
+ var _React$useState3 = React.useState(null),
108
+ _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
109
+ targetEle = _React$useState4[0],
110
+ setTargetEle = _React$useState4[1];
111
+ var setTargetRef = React.useCallback(function (node) {
112
+ if (node instanceof HTMLElement) {
113
+ setTargetEle(node);
114
+ }
115
+ }, []);
111
116
 
112
- // ========================== Children ==========================
113
- var child = React.Children.only(children);
114
- var originChildProps = (child === null || child === void 0 ? void 0 : child.props) || {};
115
- var cloneProps = {};
116
- var inPopupOrChild = (0, _useEvent.default)(function (ele) {
117
- var childDOM = targetEle;
118
- return (childDOM === null || childDOM === void 0 ? void 0 : childDOM.contains(ele)) || ele === childDOM || (popupEle === null || popupEle === void 0 ? void 0 : popupEle.contains(ele)) || ele === popupEle || Object.values(subPopupElements.current).some(function (subPopupEle) {
119
- return subPopupEle.contains(ele) || ele === subPopupEle;
117
+ // ========================== Children ==========================
118
+ var child = React.Children.only(children);
119
+ var originChildProps = (child === null || child === void 0 ? void 0 : child.props) || {};
120
+ var cloneProps = {};
121
+ var inPopupOrChild = (0, _useEvent.default)(function (ele) {
122
+ var childDOM = targetEle;
123
+ return (childDOM === null || childDOM === void 0 ? void 0 : childDOM.contains(ele)) || ele === childDOM || (popupEle === null || popupEle === void 0 ? void 0 : popupEle.contains(ele)) || ele === popupEle || Object.values(subPopupElements.current).some(function (subPopupEle) {
124
+ return subPopupEle.contains(ele) || ele === subPopupEle;
125
+ });
120
126
  });
121
- });
122
127
 
123
- // =========================== Motion ===========================
124
- var mergePopupMotion = (0, _util.getMotion)(prefixCls, popupMotion, popupAnimation, popupTransitionName);
125
- var mergeMaskMotion = (0, _util.getMotion)(prefixCls, maskMotion, maskAnimation, maskTransitionName);
128
+ // =========================== Motion ===========================
129
+ var mergePopupMotion = (0, _util.getMotion)(prefixCls, popupMotion, popupAnimation, popupTransitionName);
130
+ var mergeMaskMotion = (0, _util.getMotion)(prefixCls, maskMotion, maskAnimation, maskTransitionName);
126
131
 
127
- // ============================ Open ============================
128
- var _useMergedState = (0, _useMergedState3.default)(defaultPopupVisible || false, {
129
- value: popupVisible
130
- }),
131
- _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
132
- mergedOpen = _useMergedState2[0],
133
- setMergedOpen = _useMergedState2[1];
134
- var openRef = React.useRef(mergedOpen);
135
- openRef.current = mergedOpen;
136
- var internalTriggerOpen = (0, _useEvent.default)(function (nextOpen) {
137
- if (mergedOpen !== nextOpen) {
138
- setMergedOpen(nextOpen);
139
- onPopupVisibleChange === null || onPopupVisibleChange === void 0 ? void 0 : onPopupVisibleChange(nextOpen);
140
- }
141
- });
132
+ // ============================ Open ============================
133
+ var _useMergedState = (0, _useMergedState3.default)(defaultPopupVisible || false, {
134
+ value: popupVisible
135
+ }),
136
+ _useMergedState2 = (0, _slicedToArray2.default)(_useMergedState, 2),
137
+ mergedOpen = _useMergedState2[0],
138
+ setMergedOpen = _useMergedState2[1];
139
+ var openRef = React.useRef(mergedOpen);
140
+ openRef.current = mergedOpen;
141
+ var internalTriggerOpen = (0, _useEvent.default)(function (nextOpen) {
142
+ if (mergedOpen !== nextOpen) {
143
+ setMergedOpen(nextOpen);
144
+ onPopupVisibleChange === null || onPopupVisibleChange === void 0 ? void 0 : onPopupVisibleChange(nextOpen);
145
+ }
146
+ });
142
147
 
143
- // Trigger for delay
144
- var delayRef = React.useRef();
145
- var clearDelay = function clearDelay() {
146
- clearTimeout(delayRef.current);
147
- };
148
- var triggerOpen = function triggerOpen(nextOpen) {
149
- var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
150
- clearDelay();
151
- if (delay === 0) {
152
- internalTriggerOpen(nextOpen);
153
- } else {
154
- delayRef.current = setTimeout(function () {
148
+ // Trigger for delay
149
+ var delayRef = React.useRef();
150
+ var clearDelay = function clearDelay() {
151
+ clearTimeout(delayRef.current);
152
+ };
153
+ var triggerOpen = function triggerOpen(nextOpen) {
154
+ var delay = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
155
+ clearDelay();
156
+ if (delay === 0) {
155
157
  internalTriggerOpen(nextOpen);
156
- }, delay * 1000);
157
- }
158
- };
159
- React.useEffect(function () {
160
- return clearDelay;
161
- }, []);
162
-
163
- // ========================== Motion ============================
164
- var _React$useState5 = React.useState(false),
165
- _React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2),
166
- inMotion = _React$useState6[0],
167
- setInMotion = _React$useState6[1];
168
- (0, _useLayoutEffect.default)(function () {
169
- setInMotion(true);
170
- }, [mergedOpen]);
171
- var _React$useState7 = React.useState(null),
172
- _React$useState8 = (0, _slicedToArray2.default)(_React$useState7, 2),
173
- motionPrepareResolve = _React$useState8[0],
174
- setMotionPrepareResolve = _React$useState8[1];
175
-
176
- // =========================== Align ============================
177
- var _React$useState9 = React.useState([0, 0]),
178
- _React$useState10 = (0, _slicedToArray2.default)(_React$useState9, 2),
179
- mousePos = _React$useState10[0],
180
- setMousePos = _React$useState10[1];
181
- var setMousePosByEvent = function setMousePosByEvent(event) {
182
- setMousePos([event.clientX, event.clientY]);
183
- };
184
- var _useAlign = (0, _useAlign3.default)(mergedOpen, popupEle, alignPoint ? mousePos : targetEle, popupPlacement, builtinPlacements, popupAlign),
185
- _useAlign2 = (0, _slicedToArray2.default)(_useAlign, 9),
186
- ready = _useAlign2[0],
187
- offsetX = _useAlign2[1],
188
- offsetY = _useAlign2[2],
189
- arrowX = _useAlign2[3],
190
- arrowY = _useAlign2[4],
191
- scaleX = _useAlign2[5],
192
- scaleY = _useAlign2[6],
193
- alignInfo = _useAlign2[7],
194
- onAlign = _useAlign2[8];
195
- var triggerAlign = (0, _useEvent.default)(function () {
196
- if (!inMotion) {
197
- onAlign();
198
- }
199
- });
200
- (0, _useWatch.default)(mergedOpen, targetEle, popupEle, triggerAlign);
201
- (0, _useLayoutEffect.default)(function () {
202
- triggerAlign();
203
- }, [mousePos]);
204
- var alignedClassName = React.useMemo(function () {
205
- var baseClassName = (0, _util.getAlignPopupClassName)(builtinPlacements, prefixCls, alignInfo, alignPoint);
206
- return (0, _classnames.default)(baseClassName, getPopupClassNameFromAlign === null || getPopupClassNameFromAlign === void 0 ? void 0 : getPopupClassNameFromAlign(alignInfo));
207
- }, [alignInfo, getPopupClassNameFromAlign, builtinPlacements, prefixCls, alignPoint]);
208
- React.useImperativeHandle(ref, function () {
209
- return {
210
- forceAlign: triggerAlign
158
+ } else {
159
+ delayRef.current = setTimeout(function () {
160
+ internalTriggerOpen(nextOpen);
161
+ }, delay * 1000);
162
+ }
211
163
  };
212
- });
164
+ React.useEffect(function () {
165
+ return clearDelay;
166
+ }, []);
213
167
 
214
- // ========================== Motion ============================
215
- var onVisibleChanged = function onVisibleChanged(visible) {
216
- setInMotion(false);
217
- onAlign();
218
- afterPopupVisibleChange === null || afterPopupVisibleChange === void 0 ? void 0 : afterPopupVisibleChange(visible);
219
- };
168
+ // ========================== Motion ============================
169
+ var _React$useState5 = React.useState(false),
170
+ _React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2),
171
+ inMotion = _React$useState6[0],
172
+ setInMotion = _React$useState6[1];
173
+ (0, _useLayoutEffect.default)(function () {
174
+ setInMotion(true);
175
+ }, [mergedOpen]);
176
+ var _React$useState7 = React.useState(null),
177
+ _React$useState8 = (0, _slicedToArray2.default)(_React$useState7, 2),
178
+ motionPrepareResolve = _React$useState8[0],
179
+ setMotionPrepareResolve = _React$useState8[1];
220
180
 
221
- // We will trigger align when motion is in prepare
222
- var onPrepare = function onPrepare() {
223
- return new Promise(function (resolve) {
224
- setMotionPrepareResolve(function () {
225
- return resolve;
226
- });
181
+ // =========================== Align ============================
182
+ var _React$useState9 = React.useState([0, 0]),
183
+ _React$useState10 = (0, _slicedToArray2.default)(_React$useState9, 2),
184
+ mousePos = _React$useState10[0],
185
+ setMousePos = _React$useState10[1];
186
+ var setMousePosByEvent = function setMousePosByEvent(event) {
187
+ setMousePos([event.clientX, event.clientY]);
188
+ };
189
+ var _useAlign = (0, _useAlign3.default)(mergedOpen, popupEle, alignPoint ? mousePos : targetEle, popupPlacement, builtinPlacements, popupAlign, onPopupAlign),
190
+ _useAlign2 = (0, _slicedToArray2.default)(_useAlign, 9),
191
+ ready = _useAlign2[0],
192
+ offsetX = _useAlign2[1],
193
+ offsetY = _useAlign2[2],
194
+ arrowX = _useAlign2[3],
195
+ arrowY = _useAlign2[4],
196
+ scaleX = _useAlign2[5],
197
+ scaleY = _useAlign2[6],
198
+ alignInfo = _useAlign2[7],
199
+ onAlign = _useAlign2[8];
200
+ var triggerAlign = (0, _useEvent.default)(function () {
201
+ if (!inMotion) {
202
+ onAlign();
203
+ }
204
+ });
205
+ (0, _useWatch.default)(mergedOpen, targetEle, popupEle, triggerAlign);
206
+ (0, _useLayoutEffect.default)(function () {
207
+ triggerAlign();
208
+ }, [mousePos]);
209
+ var alignedClassName = React.useMemo(function () {
210
+ var baseClassName = (0, _util.getAlignPopupClassName)(builtinPlacements, prefixCls, alignInfo, alignPoint);
211
+ return (0, _classnames.default)(baseClassName, getPopupClassNameFromAlign === null || getPopupClassNameFromAlign === void 0 ? void 0 : getPopupClassNameFromAlign(alignInfo));
212
+ }, [alignInfo, getPopupClassNameFromAlign, builtinPlacements, prefixCls, alignPoint]);
213
+ React.useImperativeHandle(ref, function () {
214
+ return {
215
+ forceAlign: triggerAlign
216
+ };
227
217
  });
228
- };
229
- (0, _useLayoutEffect.default)(function () {
230
- if (motionPrepareResolve) {
231
- onAlign();
232
- motionPrepareResolve();
233
- setMotionPrepareResolve(null);
234
- }
235
- }, [motionPrepareResolve]);
236
-
237
- // ========================== Stretch ===========================
238
- var _React$useState11 = React.useState(0),
239
- _React$useState12 = (0, _slicedToArray2.default)(_React$useState11, 2),
240
- targetWidth = _React$useState12[0],
241
- setTargetWidth = _React$useState12[1];
242
- var _React$useState13 = React.useState(0),
243
- _React$useState14 = (0, _slicedToArray2.default)(_React$useState13, 2),
244
- targetHeight = _React$useState14[0],
245
- setTargetHeight = _React$useState14[1];
246
- var onTargetResize = function onTargetResize(_, ele) {
247
- triggerAlign();
248
- if (stretch) {
249
- var rect = ele.getBoundingClientRect();
250
- setTargetWidth(rect.width);
251
- setTargetHeight(rect.height);
252
- }
253
- };
254
-
255
- // =========================== Action ===========================
256
- var _useAction = (0, _useAction3.default)(action, showAction, hideAction),
257
- _useAction2 = (0, _slicedToArray2.default)(_useAction, 2),
258
- showActions = _useAction2[0],
259
- hideActions = _useAction2[1];
260
-
261
- // Util wrapper for trigger action
262
- var wrapperAction = function wrapperAction(eventName, nextOpen, delay, preEvent) {
263
- cloneProps[eventName] = function (event) {
264
- var _originChildProps$eve;
265
- preEvent === null || preEvent === void 0 ? void 0 : preEvent(event);
266
- triggerOpen(nextOpen, delay);
267
218
 
268
- // Pass to origin
269
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
270
- args[_key - 1] = arguments[_key];
271
- }
272
- (_originChildProps$eve = originChildProps[eventName]) === null || _originChildProps$eve === void 0 ? void 0 : _originChildProps$eve.call.apply(_originChildProps$eve, [originChildProps, event].concat(args));
219
+ // ========================== Motion ============================
220
+ var onVisibleChanged = function onVisibleChanged(visible) {
221
+ setInMotion(false);
222
+ onAlign();
223
+ afterPopupVisibleChange === null || afterPopupVisibleChange === void 0 ? void 0 : afterPopupVisibleChange(visible);
273
224
  };
274
- };
275
225
 
276
- // ======================= Action: Click ========================
277
- var clickToShow = showActions.has('click');
278
- var clickToHide = hideActions.has('click') || hideActions.has('contextMenu');
279
- if (clickToShow || clickToHide) {
280
- cloneProps.onClick = function (event) {
281
- var _originChildProps$onC;
282
- if (openRef.current && clickToHide) {
283
- triggerOpen(false);
284
- } else if (!openRef.current && clickToShow) {
285
- setMousePosByEvent(event);
286
- triggerOpen(true);
226
+ // We will trigger align when motion is in prepare
227
+ var onPrepare = function onPrepare() {
228
+ return new Promise(function (resolve) {
229
+ setMotionPrepareResolve(function () {
230
+ return resolve;
231
+ });
232
+ });
233
+ };
234
+ (0, _useLayoutEffect.default)(function () {
235
+ if (motionPrepareResolve) {
236
+ onAlign();
237
+ motionPrepareResolve();
238
+ setMotionPrepareResolve(null);
287
239
  }
240
+ }, [motionPrepareResolve]);
288
241
 
289
- // Pass to origin
290
- for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
291
- args[_key2 - 1] = arguments[_key2];
242
+ // ========================== Stretch ===========================
243
+ var _React$useState11 = React.useState(0),
244
+ _React$useState12 = (0, _slicedToArray2.default)(_React$useState11, 2),
245
+ targetWidth = _React$useState12[0],
246
+ setTargetWidth = _React$useState12[1];
247
+ var _React$useState13 = React.useState(0),
248
+ _React$useState14 = (0, _slicedToArray2.default)(_React$useState13, 2),
249
+ targetHeight = _React$useState14[0],
250
+ setTargetHeight = _React$useState14[1];
251
+ var onTargetResize = function onTargetResize(_, ele) {
252
+ triggerAlign();
253
+ if (stretch) {
254
+ var rect = ele.getBoundingClientRect();
255
+ setTargetWidth(rect.width);
256
+ setTargetHeight(rect.height);
292
257
  }
293
- (_originChildProps$onC = originChildProps.onClick) === null || _originChildProps$onC === void 0 ? void 0 : _originChildProps$onC.call.apply(_originChildProps$onC, [originChildProps, event].concat(args));
294
258
  };
295
- }
296
259
 
297
- // Click to hide is special action since click popup element should not hide
298
- React.useEffect(function () {
299
- if (clickToHide && popupEle && (!mask || maskClosable)) {
300
- var onWindowClick = function onWindowClick(_ref) {
301
- var target = _ref.target;
302
- if (openRef.current && !inPopupOrChild(target)) {
303
- triggerOpen(false);
260
+ // =========================== Action ===========================
261
+ var _useAction = (0, _useAction3.default)(action, showAction, hideAction),
262
+ _useAction2 = (0, _slicedToArray2.default)(_useAction, 2),
263
+ showActions = _useAction2[0],
264
+ hideActions = _useAction2[1];
265
+
266
+ // Util wrapper for trigger action
267
+ var wrapperAction = function wrapperAction(eventName, nextOpen, delay, preEvent) {
268
+ cloneProps[eventName] = function (event) {
269
+ var _originChildProps$eve;
270
+ preEvent === null || preEvent === void 0 ? void 0 : preEvent(event);
271
+ triggerOpen(nextOpen, delay);
272
+
273
+ // Pass to origin
274
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
275
+ args[_key - 1] = arguments[_key];
304
276
  }
277
+ (_originChildProps$eve = originChildProps[eventName]) === null || _originChildProps$eve === void 0 ? void 0 : _originChildProps$eve.call.apply(_originChildProps$eve, [originChildProps, event].concat(args));
305
278
  };
306
- var win = (0, _util.getWin)(popupEle);
307
- win.addEventListener('click', onWindowClick);
308
- return function () {
309
- win.removeEventListener('click', onWindowClick);
310
- };
311
- }
312
- }, [clickToHide, popupEle, mask, maskClosable]);
313
-
314
- // ======================= Action: Hover ========================
315
- var hoverToShow = showActions.has('hover');
316
- var hoverToHide = hideActions.has('hover');
317
- var onPopupMouseEnter;
318
- var onPopupMouseLeave;
319
- if (hoverToShow) {
320
- wrapperAction('onMouseEnter', true, mouseEnterDelay, function (event) {
321
- setMousePosByEvent(event);
322
- });
323
- onPopupMouseEnter = function onPopupMouseEnter() {
324
- triggerOpen(true, mouseEnterDelay);
325
279
  };
326
280
 
327
- // Align Point
328
- if (alignPoint) {
329
- cloneProps.onMouseMove = function (event) {
330
- var _originChildProps$onM;
331
- // setMousePosByEvent(event);
332
- (_originChildProps$onM = originChildProps.onMouseMove) === null || _originChildProps$onM === void 0 ? void 0 : _originChildProps$onM.call(originChildProps, event);
281
+ // ======================= Action: Click ========================
282
+ var clickToShow = showActions.has('click');
283
+ var clickToHide = hideActions.has('click') || hideActions.has('contextMenu');
284
+ if (clickToShow || clickToHide) {
285
+ cloneProps.onClick = function (event) {
286
+ var _originChildProps$onC;
287
+ if (openRef.current && clickToHide) {
288
+ triggerOpen(false);
289
+ } else if (!openRef.current && clickToShow) {
290
+ setMousePosByEvent(event);
291
+ triggerOpen(true);
292
+ }
293
+
294
+ // Pass to origin
295
+ for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
296
+ args[_key2 - 1] = arguments[_key2];
297
+ }
298
+ (_originChildProps$onC = originChildProps.onClick) === null || _originChildProps$onC === void 0 ? void 0 : _originChildProps$onC.call.apply(_originChildProps$onC, [originChildProps, event].concat(args));
333
299
  };
334
300
  }
335
- }
336
- if (hoverToHide) {
337
- wrapperAction('onMouseLeave', false, mouseLeaveDelay);
338
- onPopupMouseLeave = function onPopupMouseLeave() {
339
- triggerOpen(false, mouseLeaveDelay);
340
- };
341
- }
342
301
 
343
- // ======================= Action: Focus ========================
344
- if (showActions.has('focus')) {
345
- wrapperAction('onFocus', true, focusDelay);
346
- }
347
- if (hideActions.has('focus')) {
348
- wrapperAction('onBlur', false, blurDelay);
349
- }
302
+ // Click to hide is special action since click popup element should not hide
303
+ React.useEffect(function () {
304
+ if (clickToHide && popupEle && (!mask || maskClosable)) {
305
+ var onWindowClick = function onWindowClick(_ref) {
306
+ var target = _ref.target;
307
+ if (openRef.current && !inPopupOrChild(target)) {
308
+ triggerOpen(false);
309
+ }
310
+ };
311
+ var win = (0, _util.getWin)(popupEle);
312
+ win.addEventListener('click', onWindowClick);
313
+ return function () {
314
+ win.removeEventListener('click', onWindowClick);
315
+ };
316
+ }
317
+ }, [clickToHide, popupEle, mask, maskClosable]);
350
318
 
351
- // ==================== Action: ContextMenu =====================
352
- if (showActions.has('contextMenu')) {
353
- cloneProps.onContextMenu = function (event) {
354
- var _originChildProps$onC2;
355
- setMousePosByEvent(event);
356
- triggerOpen(true);
357
- event.preventDefault();
319
+ // ======================= Action: Hover ========================
320
+ var hoverToShow = showActions.has('hover');
321
+ var hoverToHide = hideActions.has('hover');
322
+ var onPopupMouseEnter;
323
+ var onPopupMouseLeave;
324
+ if (hoverToShow) {
325
+ wrapperAction('onMouseEnter', true, mouseEnterDelay, function (event) {
326
+ setMousePosByEvent(event);
327
+ });
328
+ onPopupMouseEnter = function onPopupMouseEnter() {
329
+ triggerOpen(true, mouseEnterDelay);
330
+ };
358
331
 
359
- // Pass to origin
360
- for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
361
- args[_key3 - 1] = arguments[_key3];
332
+ // Align Point
333
+ if (alignPoint) {
334
+ cloneProps.onMouseMove = function (event) {
335
+ var _originChildProps$onM;
336
+ // setMousePosByEvent(event);
337
+ (_originChildProps$onM = originChildProps.onMouseMove) === null || _originChildProps$onM === void 0 ? void 0 : _originChildProps$onM.call(originChildProps, event);
338
+ };
362
339
  }
363
- (_originChildProps$onC2 = originChildProps.onContextMenu) === null || _originChildProps$onC2 === void 0 ? void 0 : _originChildProps$onC2.call.apply(_originChildProps$onC2, [originChildProps, event].concat(args));
364
- };
365
- }
340
+ }
341
+ if (hoverToHide) {
342
+ wrapperAction('onMouseLeave', false, mouseLeaveDelay);
343
+ onPopupMouseLeave = function onPopupMouseLeave() {
344
+ triggerOpen(false, mouseLeaveDelay);
345
+ };
346
+ }
366
347
 
367
- // ========================= ClassName ==========================
368
- if (className) {
369
- cloneProps.className = (0, _classnames.default)(originChildProps.className, className);
370
- }
348
+ // ======================= Action: Focus ========================
349
+ if (showActions.has('focus')) {
350
+ wrapperAction('onFocus', true, focusDelay);
351
+ }
352
+ if (hideActions.has('focus')) {
353
+ wrapperAction('onBlur', false, blurDelay);
354
+ }
371
355
 
372
- // =========================== Render ===========================
373
- var mergedChildrenProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originChildProps), cloneProps);
356
+ // ==================== Action: ContextMenu =====================
357
+ if (showActions.has('contextMenu')) {
358
+ cloneProps.onContextMenu = function (event) {
359
+ var _originChildProps$onC2;
360
+ setMousePosByEvent(event);
361
+ triggerOpen(true);
362
+ event.preventDefault();
374
363
 
375
- // Pass props into cloneProps for nest usage
376
- var passedProps = {};
377
- var passedEventList = ['onContextMenu', 'onClick', 'onMouseDown', 'onTouchStart', 'onMouseEnter', 'onMouseLeave', 'onFocus', 'onBlur'];
378
- passedEventList.forEach(function (eventName) {
379
- if (restProps[eventName]) {
380
- passedProps[eventName] = function () {
381
- var _mergedChildrenProps$;
382
- for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
383
- args[_key4] = arguments[_key4];
364
+ // Pass to origin
365
+ for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
366
+ args[_key3 - 1] = arguments[_key3];
384
367
  }
385
- (_mergedChildrenProps$ = mergedChildrenProps[eventName]) === null || _mergedChildrenProps$ === void 0 ? void 0 : _mergedChildrenProps$.call.apply(_mergedChildrenProps$, [mergedChildrenProps].concat(args));
386
- restProps[eventName].apply(restProps, args);
368
+ (_originChildProps$onC2 = originChildProps.onContextMenu) === null || _originChildProps$onC2 === void 0 ? void 0 : _originChildProps$onC2.call.apply(_originChildProps$onC2, [originChildProps, event].concat(args));
387
369
  };
388
370
  }
389
- });
390
371
 
391
- // Child Node
392
- var triggerNode = /*#__PURE__*/React.cloneElement(child, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, mergedChildrenProps), passedProps));
372
+ // ========================= ClassName ==========================
373
+ if (className) {
374
+ cloneProps.className = (0, _classnames.default)(originChildProps.className, className);
375
+ }
393
376
 
394
- // Render
395
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_context.default.Provider, {
396
- value: context
397
- }, /*#__PURE__*/React.createElement(_Popup.default, {
398
- ref: setPopupRef,
399
- prefixCls: prefixCls,
400
- popup: popup,
401
- className: (0, _classnames.default)(popupClassName, alignedClassName),
402
- style: popupStyle,
403
- target: targetEle,
404
- onMouseEnter: onPopupMouseEnter,
405
- onMouseLeave: onPopupMouseLeave,
406
- zIndex: zIndex
407
- // Open
408
- ,
409
- open: mergedOpen,
410
- keepDom: inMotion
411
- // Click
412
- ,
413
- onClick: onPopupClick
414
- // Mask
415
- ,
416
- mask: mask
417
- // Motion
418
- ,
419
- motion: mergePopupMotion,
420
- maskMotion: mergeMaskMotion,
421
- onVisibleChanged: onVisibleChanged,
422
- onPrepare: onPrepare
423
- // Portal
424
- ,
425
- forceRender: forceRender,
426
- autoDestroy: mergedAutoDestroy,
427
- getPopupContainer: getPopupContainer
428
- // Arrow
429
- ,
430
- align: alignInfo,
431
- arrow: arrow
432
- // Align
433
- ,
434
- ready: ready,
435
- offsetX: offsetX,
436
- offsetY: offsetY,
437
- arrowX: arrowX,
438
- arrowY: arrowY,
439
- onAlign: triggerAlign
440
- // Stretch
441
- ,
442
- stretch: stretch,
443
- targetWidth: targetWidth / scaleX,
444
- targetHeight: targetHeight / scaleY
445
- })), /*#__PURE__*/React.createElement(_rcResizeObserver.default, {
446
- disabled: !mergedOpen,
447
- ref: setTargetRef,
448
- onResize: onTargetResize
449
- }, /*#__PURE__*/React.createElement(_TriggerWrapper.default, {
450
- getTriggerDOMNode: getTriggerDOMNode
451
- }, triggerNode)));
452
- });
453
- if (process.env.NODE_ENV !== 'production') {
454
- Trigger.displayName = 'Trigger';
377
+ // =========================== Render ===========================
378
+ var mergedChildrenProps = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, originChildProps), cloneProps);
379
+
380
+ // Pass props into cloneProps for nest usage
381
+ var passedProps = {};
382
+ var passedEventList = ['onContextMenu', 'onClick', 'onMouseDown', 'onTouchStart', 'onMouseEnter', 'onMouseLeave', 'onFocus', 'onBlur'];
383
+ passedEventList.forEach(function (eventName) {
384
+ if (restProps[eventName]) {
385
+ passedProps[eventName] = function () {
386
+ var _mergedChildrenProps$;
387
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
388
+ args[_key4] = arguments[_key4];
389
+ }
390
+ (_mergedChildrenProps$ = mergedChildrenProps[eventName]) === null || _mergedChildrenProps$ === void 0 ? void 0 : _mergedChildrenProps$.call.apply(_mergedChildrenProps$, [mergedChildrenProps].concat(args));
391
+ restProps[eventName].apply(restProps, args);
392
+ };
393
+ }
394
+ });
395
+
396
+ // Child Node
397
+ var triggerNode = /*#__PURE__*/React.cloneElement(child, (0, _objectSpread2.default)((0, _objectSpread2.default)({}, mergedChildrenProps), passedProps));
398
+
399
+ // Render
400
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_context.default.Provider, {
401
+ value: context
402
+ }, /*#__PURE__*/React.createElement(_Popup.default, {
403
+ portal: PortalComponent,
404
+ ref: setPopupRef,
405
+ prefixCls: prefixCls,
406
+ popup: popup,
407
+ className: (0, _classnames.default)(popupClassName, alignedClassName),
408
+ style: popupStyle,
409
+ target: targetEle,
410
+ onMouseEnter: onPopupMouseEnter,
411
+ onMouseLeave: onPopupMouseLeave,
412
+ zIndex: zIndex
413
+ // Open
414
+ ,
415
+ open: mergedOpen,
416
+ keepDom: inMotion
417
+ // Click
418
+ ,
419
+ onClick: onPopupClick
420
+ // Mask
421
+ ,
422
+ mask: mask
423
+ // Motion
424
+ ,
425
+ motion: mergePopupMotion,
426
+ maskMotion: mergeMaskMotion,
427
+ onVisibleChanged: onVisibleChanged,
428
+ onPrepare: onPrepare
429
+ // Portal
430
+ ,
431
+ forceRender: forceRender,
432
+ autoDestroy: mergedAutoDestroy,
433
+ getPopupContainer: getPopupContainer
434
+ // Arrow
435
+ ,
436
+ align: alignInfo,
437
+ arrow: arrow
438
+ // Align
439
+ ,
440
+ ready: ready,
441
+ offsetX: offsetX,
442
+ offsetY: offsetY,
443
+ arrowX: arrowX,
444
+ arrowY: arrowY,
445
+ onAlign: triggerAlign
446
+ // Stretch
447
+ ,
448
+ stretch: stretch,
449
+ targetWidth: targetWidth / scaleX,
450
+ targetHeight: targetHeight / scaleY
451
+ })), /*#__PURE__*/React.createElement(_rcResizeObserver.default, {
452
+ disabled: !mergedOpen,
453
+ ref: setTargetRef,
454
+ onResize: onTargetResize
455
+ }, /*#__PURE__*/React.createElement(_TriggerWrapper.default, {
456
+ getTriggerDOMNode: getTriggerDOMNode
457
+ }, triggerNode)));
458
+ });
459
+ if (process.env.NODE_ENV !== 'production') {
460
+ Trigger.displayName = 'Trigger';
461
+ }
462
+ return Trigger;
455
463
  }
456
- var _default = Trigger;
464
+ var _default = generateTrigger(_portal.default);
457
465
  exports.default = _default;