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