@rc-component/trigger 1.14.4 → 1.15.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,6 +10,7 @@ export interface PopupProps {
10
10
  target: HTMLElement;
11
11
  onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;
12
12
  onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;
13
+ onPointerEnter?: React.MouseEventHandler<HTMLDivElement>;
13
14
  zIndex?: number;
14
15
  mask?: boolean;
15
16
  onVisibleChanged: (visible: boolean) => void;
package/es/Popup/index.js CHANGED
@@ -33,6 +33,7 @@ var Popup = /*#__PURE__*/React.forwardRef(function (props, ref) {
33
33
  zIndex = props.zIndex,
34
34
  onMouseEnter = props.onMouseEnter,
35
35
  onMouseLeave = props.onMouseLeave,
36
+ onPointerEnter = props.onPointerEnter,
36
37
  ready = props.ready,
37
38
  offsetX = props.offsetX,
38
39
  offsetY = props.offsetY,
@@ -164,6 +165,7 @@ var Popup = /*#__PURE__*/React.forwardRef(function (props, ref) {
164
165
  }, style),
165
166
  onMouseEnter: onMouseEnter,
166
167
  onMouseLeave: onMouseLeave,
168
+ onPointerEnter: onPointerEnter,
167
169
  onClick: onClick
168
170
  }, arrow && /*#__PURE__*/React.createElement(Arrow, {
169
171
  prefixCls: prefixCls,
package/es/index.js CHANGED
@@ -12,6 +12,7 @@ import useId from "rc-util/es/hooks/useId";
12
12
  import useLayoutEffect from "rc-util/es/hooks/useLayoutEffect";
13
13
  import isMobile from "rc-util/es/isMobile";
14
14
  import * as React from 'react';
15
+ import { flushSync } from 'react-dom';
15
16
  import TriggerContext from "./context";
16
17
  import useAction from "./hooks/useAction";
17
18
  import useAlign from "./hooks/useAlign";
@@ -159,10 +160,14 @@ export function generateTrigger() {
159
160
  var openRef = React.useRef(mergedOpen);
160
161
  openRef.current = mergedOpen;
161
162
  var internalTriggerOpen = useEvent(function (nextOpen) {
162
- if (mergedOpen !== nextOpen) {
163
- setMergedOpen(nextOpen);
164
- onPopupVisibleChange === null || onPopupVisibleChange === void 0 ? void 0 : onPopupVisibleChange(nextOpen);
165
- }
163
+ // Enter or Pointer will both trigger open state change
164
+ // We only need take one to avoid duplicated change event trigger
165
+ flushSync(function () {
166
+ if (mergedOpen !== nextOpen) {
167
+ setMergedOpen(nextOpen);
168
+ onPopupVisibleChange === null || onPopupVisibleChange === void 0 ? void 0 : onPopupVisibleChange(nextOpen);
169
+ }
170
+ });
166
171
  });
167
172
 
168
173
  // Trigger for delay
@@ -294,8 +299,10 @@ export function generateTrigger() {
294
299
  showActions = _useAction2[0],
295
300
  hideActions = _useAction2[1];
296
301
 
297
- // Util wrapper for trigger action
298
- var wrapperAction = function wrapperAction(eventName, nextOpen, delay, preEvent) {
302
+ /**
303
+ * Util wrapper for trigger action
304
+ */
305
+ function wrapperAction(eventName, nextOpen, delay, preEvent) {
299
306
  cloneProps[eventName] = function (event) {
300
307
  var _originChildProps$eve;
301
308
  preEvent === null || preEvent === void 0 ? void 0 : preEvent(event);
@@ -307,7 +314,7 @@ export function generateTrigger() {
307
314
  }
308
315
  (_originChildProps$eve = originChildProps[eventName]) === null || _originChildProps$eve === void 0 ? void 0 : _originChildProps$eve.call.apply(_originChildProps$eve, [originChildProps, event].concat(args));
309
316
  };
310
- };
317
+ }
311
318
 
312
319
  // ======================= Action: Click ========================
313
320
  var clickToShow = showActions.has('click');
@@ -339,9 +346,13 @@ export function generateTrigger() {
339
346
  var onPopupMouseEnter;
340
347
  var onPopupMouseLeave;
341
348
  if (hoverToShow) {
349
+ // Compatible with old browser which not support pointer event
342
350
  wrapperAction('onMouseEnter', true, mouseEnterDelay, function (event) {
343
351
  setMousePosByEvent(event);
344
352
  });
353
+ wrapperAction('onPointerEnter', true, mouseEnterDelay, function (event) {
354
+ setMousePosByEvent(event);
355
+ });
345
356
  onPopupMouseEnter = function onPopupMouseEnter() {
346
357
  // Only trigger re-open when popup is visible
347
358
  if (mergedOpen || inMotion) {
@@ -360,6 +371,7 @@ export function generateTrigger() {
360
371
  }
361
372
  if (hoverToHide) {
362
373
  wrapperAction('onMouseLeave', false, mouseLeaveDelay);
374
+ wrapperAction('onPointerLeave', false, mouseLeaveDelay);
363
375
  onPopupMouseLeave = function onPopupMouseLeave() {
364
376
  triggerOpen(false, mouseLeaveDelay);
365
377
  };
@@ -443,7 +455,10 @@ export function generateTrigger() {
443
455
  style: popupStyle,
444
456
  target: targetEle,
445
457
  onMouseEnter: onPopupMouseEnter,
446
- onMouseLeave: onPopupMouseLeave,
458
+ onMouseLeave: onPopupMouseLeave
459
+ // https://github.com/ant-design/ant-design/issues/43924
460
+ ,
461
+ onPointerEnter: onPopupMouseEnter,
447
462
  zIndex: zIndex
448
463
  // Open
449
464
  ,
@@ -10,6 +10,7 @@ export interface PopupProps {
10
10
  target: HTMLElement;
11
11
  onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;
12
12
  onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;
13
+ onPointerEnter?: React.MouseEventHandler<HTMLDivElement>;
13
14
  zIndex?: number;
14
15
  mask?: boolean;
15
16
  onVisibleChanged: (visible: boolean) => void;
@@ -41,6 +41,7 @@ var Popup = /*#__PURE__*/React.forwardRef(function (props, ref) {
41
41
  zIndex = props.zIndex,
42
42
  onMouseEnter = props.onMouseEnter,
43
43
  onMouseLeave = props.onMouseLeave,
44
+ onPointerEnter = props.onPointerEnter,
44
45
  ready = props.ready,
45
46
  offsetX = props.offsetX,
46
47
  offsetY = props.offsetY,
@@ -172,6 +173,7 @@ var Popup = /*#__PURE__*/React.forwardRef(function (props, ref) {
172
173
  }, style),
173
174
  onMouseEnter: onMouseEnter,
174
175
  onMouseLeave: onMouseLeave,
176
+ onPointerEnter: onPointerEnter,
175
177
  onClick: onClick
176
178
  }, arrow && /*#__PURE__*/React.createElement(_Arrow.default, {
177
179
  prefixCls: prefixCls,
package/lib/index.js CHANGED
@@ -20,6 +20,7 @@ var _useId = _interopRequireDefault(require("rc-util/lib/hooks/useId"));
20
20
  var _useLayoutEffect = _interopRequireDefault(require("rc-util/lib/hooks/useLayoutEffect"));
21
21
  var _isMobile = _interopRequireDefault(require("rc-util/lib/isMobile"));
22
22
  var React = _interopRequireWildcard(require("react"));
23
+ var _reactDom = require("react-dom");
23
24
  var _context = _interopRequireDefault(require("./context"));
24
25
  var _useAction3 = _interopRequireDefault(require("./hooks/useAction"));
25
26
  var _useAlign3 = _interopRequireDefault(require("./hooks/useAlign"));
@@ -169,10 +170,14 @@ function generateTrigger() {
169
170
  var openRef = React.useRef(mergedOpen);
170
171
  openRef.current = mergedOpen;
171
172
  var internalTriggerOpen = (0, _useEvent.default)(function (nextOpen) {
172
- if (mergedOpen !== nextOpen) {
173
- setMergedOpen(nextOpen);
174
- onPopupVisibleChange === null || onPopupVisibleChange === void 0 ? void 0 : onPopupVisibleChange(nextOpen);
175
- }
173
+ // Enter or Pointer will both trigger open state change
174
+ // We only need take one to avoid duplicated change event trigger
175
+ (0, _reactDom.flushSync)(function () {
176
+ if (mergedOpen !== nextOpen) {
177
+ setMergedOpen(nextOpen);
178
+ onPopupVisibleChange === null || onPopupVisibleChange === void 0 ? void 0 : onPopupVisibleChange(nextOpen);
179
+ }
180
+ });
176
181
  });
177
182
 
178
183
  // Trigger for delay
@@ -304,8 +309,10 @@ function generateTrigger() {
304
309
  showActions = _useAction2[0],
305
310
  hideActions = _useAction2[1];
306
311
 
307
- // Util wrapper for trigger action
308
- var wrapperAction = function wrapperAction(eventName, nextOpen, delay, preEvent) {
312
+ /**
313
+ * Util wrapper for trigger action
314
+ */
315
+ function wrapperAction(eventName, nextOpen, delay, preEvent) {
309
316
  cloneProps[eventName] = function (event) {
310
317
  var _originChildProps$eve;
311
318
  preEvent === null || preEvent === void 0 ? void 0 : preEvent(event);
@@ -317,7 +324,7 @@ function generateTrigger() {
317
324
  }
318
325
  (_originChildProps$eve = originChildProps[eventName]) === null || _originChildProps$eve === void 0 ? void 0 : _originChildProps$eve.call.apply(_originChildProps$eve, [originChildProps, event].concat(args));
319
326
  };
320
- };
327
+ }
321
328
 
322
329
  // ======================= Action: Click ========================
323
330
  var clickToShow = showActions.has('click');
@@ -349,9 +356,13 @@ function generateTrigger() {
349
356
  var onPopupMouseEnter;
350
357
  var onPopupMouseLeave;
351
358
  if (hoverToShow) {
359
+ // Compatible with old browser which not support pointer event
352
360
  wrapperAction('onMouseEnter', true, mouseEnterDelay, function (event) {
353
361
  setMousePosByEvent(event);
354
362
  });
363
+ wrapperAction('onPointerEnter', true, mouseEnterDelay, function (event) {
364
+ setMousePosByEvent(event);
365
+ });
355
366
  onPopupMouseEnter = function onPopupMouseEnter() {
356
367
  // Only trigger re-open when popup is visible
357
368
  if (mergedOpen || inMotion) {
@@ -370,6 +381,7 @@ function generateTrigger() {
370
381
  }
371
382
  if (hoverToHide) {
372
383
  wrapperAction('onMouseLeave', false, mouseLeaveDelay);
384
+ wrapperAction('onPointerLeave', false, mouseLeaveDelay);
373
385
  onPopupMouseLeave = function onPopupMouseLeave() {
374
386
  triggerOpen(false, mouseLeaveDelay);
375
387
  };
@@ -453,7 +465,10 @@ function generateTrigger() {
453
465
  style: popupStyle,
454
466
  target: targetEle,
455
467
  onMouseEnter: onPopupMouseEnter,
456
- onMouseLeave: onPopupMouseLeave,
468
+ onMouseLeave: onPopupMouseLeave
469
+ // https://github.com/ant-design/ant-design/issues/43924
470
+ ,
471
+ onPointerEnter: onPopupMouseEnter,
457
472
  zIndex: zIndex
458
473
  // Open
459
474
  ,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rc-component/trigger",
3
- "version": "1.14.4",
3
+ "version": "1.15.1",
4
4
  "description": "base abstract trigger component for react",
5
5
  "engines": {
6
6
  "node": ">=8.x"