react-tooltip 5.27.0 → 5.28.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.
@@ -42,11 +42,7 @@ function injectStyle({ css, id = REACT_TOOLTIP_BASE_STYLES_ID, type = 'base', re
42
42
  }
43
43
  const { insertAt } = ref;
44
44
  if (document.getElementById(id)) {
45
- // this should never happen because of `injected[type]`
46
- {
47
- // eslint-disable-next-line no-console
48
- console.warn(`[react-tooltip] Element with id '${id}' already exists. Call \`removeStyle()\` first`);
49
- }
45
+ // this could happen in cases the tooltip is imported by multiple js modules
50
46
  return;
51
47
  }
52
48
  const head = document.head || document.getElementsByTagName('head')[0];
@@ -282,6 +278,14 @@ const getScrollParent = (node) => {
282
278
 
283
279
  const useIsomorphicLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect;
284
280
 
281
+ const clearTimeoutRef = (ref) => {
282
+ if (ref.current) {
283
+ clearTimeout(ref.current);
284
+ // eslint-disable-next-line no-param-reassign
285
+ ref.current = null;
286
+ }
287
+ };
288
+
285
289
  const DEFAULT_TOOLTIP_ID = 'DEFAULT_TOOLTIP_ID';
286
290
  const DEFAULT_CONTEXT_DATA = {
287
291
  anchorRefs: new Set(),
@@ -386,7 +390,7 @@ var styles = {"tooltip":"styles-module_tooltip__mnnfp","arrow":"styles-module_ar
386
390
 
387
391
  const Tooltip = ({
388
392
  // props
389
- forwardRef, id, className, classNameArrow, variant = 'dark', anchorId, anchorSelect, place = 'top', offset = 10, events = ['hover'], openOnClick = false, positionStrategy = 'absolute', middlewares, wrapper: WrapperElement, delayShow = 0, delayHide = 0, float = false, hidden = false, noArrow = false, clickable = false, closeOnEsc = false, closeOnScroll = false, closeOnResize = false, openEvents, closeEvents, globalCloseEvents, imperativeModeOnly, style: externalStyles, position, afterShow, afterHide,
393
+ forwardRef, id, className, classNameArrow, variant = 'dark', anchorId, anchorSelect, place = 'top', offset = 10, events = ['hover'], openOnClick = false, positionStrategy = 'absolute', middlewares, wrapper: WrapperElement, delayShow = 0, delayHide = 0, float = false, hidden = false, noArrow = false, clickable = false, closeOnEsc = false, closeOnScroll = false, closeOnResize = false, openEvents, closeEvents, globalCloseEvents, imperativeModeOnly, style: externalStyles, position, afterShow, afterHide, disableTooltip,
390
394
  // props handled by controller
391
395
  content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnchor, setActiveAnchor, border, opacity, arrowColor, role = 'tooltip', }) => {
392
396
  var _a;
@@ -536,9 +540,7 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
536
540
  if (show === wasShowing.current) {
537
541
  return;
538
542
  }
539
- if (missedTransitionTimerRef.current) {
540
- clearTimeout(missedTransitionTimerRef.current);
541
- }
543
+ clearTimeoutRef(missedTransitionTimerRef);
542
544
  wasShowing.current = show;
543
545
  if (show) {
544
546
  afterShow === null || afterShow === void 0 ? void 0 : afterShow();
@@ -567,9 +569,7 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
567
569
  : newComputedPosition);
568
570
  };
569
571
  const handleShowTooltipDelayed = (delay = delayShow) => {
570
- if (tooltipShowDelayTimerRef.current) {
571
- clearTimeout(tooltipShowDelayTimerRef.current);
572
- }
572
+ clearTimeoutRef(tooltipShowDelayTimerRef);
573
573
  if (rendered) {
574
574
  // if the tooltip is already rendered, ignore delay
575
575
  handleShow(true);
@@ -580,9 +580,7 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
580
580
  }, delay);
581
581
  };
582
582
  const handleHideTooltipDelayed = (delay = delayHide) => {
583
- if (tooltipHideDelayTimerRef.current) {
584
- clearTimeout(tooltipHideDelayTimerRef.current);
585
- }
583
+ clearTimeoutRef(tooltipHideDelayTimerRef);
586
584
  tooltipHideDelayTimerRef.current = setTimeout(() => {
587
585
  if (hoveringTooltip.current) {
588
586
  return;
@@ -613,9 +611,7 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
613
611
  }
614
612
  setActiveAnchor(target);
615
613
  setProviderActiveAnchor({ current: target });
616
- if (tooltipHideDelayTimerRef.current) {
617
- clearTimeout(tooltipHideDelayTimerRef.current);
618
- }
614
+ clearTimeoutRef(tooltipHideDelayTimerRef);
619
615
  };
620
616
  const handleHideTooltip = () => {
621
617
  if (clickable) {
@@ -628,9 +624,7 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
628
624
  else {
629
625
  handleShow(false);
630
626
  }
631
- if (tooltipShowDelayTimerRef.current) {
632
- clearTimeout(tooltipShowDelayTimerRef.current);
633
- }
627
+ clearTimeoutRef(tooltipShowDelayTimerRef);
634
628
  };
635
629
  const handleTooltipPosition = ({ x, y }) => {
636
630
  var _a;
@@ -691,9 +685,7 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
691
685
  return;
692
686
  }
693
687
  handleShow(false);
694
- if (tooltipShowDelayTimerRef.current) {
695
- clearTimeout(tooltipShowDelayTimerRef.current);
696
- }
688
+ clearTimeoutRef(tooltipShowDelayTimerRef);
697
689
  };
698
690
  // debounce handler to prevent call twice when
699
691
  // mouse enter and focus events being triggered toggether
@@ -770,10 +762,13 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
770
762
  var _a, _b;
771
763
  const elementRefs = new Set(anchorRefs);
772
764
  anchorsBySelect.forEach((anchor) => {
765
+ if (disableTooltip === null || disableTooltip === void 0 ? void 0 : disableTooltip(anchor)) {
766
+ return;
767
+ }
773
768
  elementRefs.add({ current: anchor });
774
769
  });
775
770
  const anchorById = document.querySelector(`[id='${anchorId}']`);
776
- if (anchorById) {
771
+ if (anchorById && !(disableTooltip === null || disableTooltip === void 0 ? void 0 : disableTooltip(anchorById))) {
777
772
  elementRefs.add({ current: anchorById });
778
773
  }
779
774
  const handleScrollResize = () => {
@@ -977,12 +972,8 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
977
972
  setRendered(false);
978
973
  handleShow(false);
979
974
  setActiveAnchor(null);
980
- if (tooltipShowDelayTimerRef.current) {
981
- clearTimeout(tooltipShowDelayTimerRef.current);
982
- }
983
- if (tooltipHideDelayTimerRef.current) {
984
- clearTimeout(tooltipHideDelayTimerRef.current);
985
- }
975
+ clearTimeoutRef(tooltipShowDelayTimerRef);
976
+ clearTimeoutRef(tooltipHideDelayTimerRef);
986
977
  return true;
987
978
  }
988
979
  return false;
@@ -1061,12 +1052,8 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
1061
1052
  handleShow(true);
1062
1053
  }
1063
1054
  return () => {
1064
- if (tooltipShowDelayTimerRef.current) {
1065
- clearTimeout(tooltipShowDelayTimerRef.current);
1066
- }
1067
- if (tooltipHideDelayTimerRef.current) {
1068
- clearTimeout(tooltipHideDelayTimerRef.current);
1069
- }
1055
+ clearTimeoutRef(tooltipShowDelayTimerRef);
1056
+ clearTimeoutRef(tooltipHideDelayTimerRef);
1070
1057
  };
1071
1058
  }, []);
1072
1059
  useEffect(() => {
@@ -1089,7 +1076,11 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
1089
1076
  }, [id, anchorSelect, imperativeOptions === null || imperativeOptions === void 0 ? void 0 : imperativeOptions.anchorSelect]);
1090
1077
  useEffect(() => {
1091
1078
  if (tooltipShowDelayTimerRef.current) {
1092
- clearTimeout(tooltipShowDelayTimerRef.current);
1079
+ /**
1080
+ * if the delay changes while the tooltip is waiting to show,
1081
+ * reset the timer with the new delay
1082
+ */
1083
+ clearTimeoutRef(tooltipShowDelayTimerRef);
1093
1084
  handleShowTooltipDelayed(delayShow);
1094
1085
  }
1095
1086
  }, [delayShow]);
@@ -1130,9 +1121,7 @@ content, contentWrapperRef, isOpen, defaultIsOpen = false, setIsOpen, activeAnch
1130
1121
  isOpen: Boolean(rendered && !hidden && actualContent && canShow),
1131
1122
  }));
1132
1123
  return rendered && !hidden && actualContent ? (React.createElement(WrapperElement, { id: id, role: role, className: classNames('react-tooltip', coreStyles['tooltip'], styles['tooltip'], styles[variant], className, `react-tooltip__place-${computedPosition.place}`, coreStyles[canShow ? 'show' : 'closing'], canShow ? 'react-tooltip__show' : 'react-tooltip__closing', positionStrategy === 'fixed' && coreStyles['fixed'], clickable && coreStyles['clickable']), onTransitionEnd: (event) => {
1133
- if (missedTransitionTimerRef.current) {
1134
- clearTimeout(missedTransitionTimerRef.current);
1135
- }
1124
+ clearTimeoutRef(missedTransitionTimerRef);
1136
1125
  if (show || event.propertyName !== 'opacity') {
1137
1126
  return;
1138
1127
  }
@@ -1158,7 +1147,7 @@ const TooltipContent = ({ content }) => {
1158
1147
  return React.createElement("span", { dangerouslySetInnerHTML: { __html: content } });
1159
1148
  };
1160
1149
 
1161
- const TooltipController = React.forwardRef(({ id, anchorId, anchorSelect, content, html, render, className, classNameArrow, variant = 'dark', place = 'top', offset = 10, wrapper = 'div', children = null, events = ['hover'], openOnClick = false, positionStrategy = 'absolute', middlewares, delayShow = 0, delayHide = 0, float = false, hidden = false, noArrow = false, clickable = false, closeOnEsc = false, closeOnScroll = false, closeOnResize = false, openEvents, closeEvents, globalCloseEvents, imperativeModeOnly = false, style, position, isOpen, defaultIsOpen = false, disableStyleInjection = false, border, opacity, arrowColor, setIsOpen, afterShow, afterHide, role = 'tooltip', }, ref) => {
1150
+ const TooltipController = React.forwardRef(({ id, anchorId, anchorSelect, content, html, render, className, classNameArrow, variant = 'dark', place = 'top', offset = 10, wrapper = 'div', children = null, events = ['hover'], openOnClick = false, positionStrategy = 'absolute', middlewares, delayShow = 0, delayHide = 0, float = false, hidden = false, noArrow = false, clickable = false, closeOnEsc = false, closeOnScroll = false, closeOnResize = false, openEvents, closeEvents, globalCloseEvents, imperativeModeOnly = false, style, position, isOpen, defaultIsOpen = false, disableStyleInjection = false, border, opacity, arrowColor, setIsOpen, afterShow, afterHide, disableTooltip, role = 'tooltip', }, ref) => {
1162
1151
  const [tooltipContent, setTooltipContent] = useState(content);
1163
1152
  const [tooltipHtml, setTooltipHtml] = useState(html);
1164
1153
  const [tooltipPlace, setTooltipPlace] = useState(place);
@@ -1431,6 +1420,7 @@ const TooltipController = React.forwardRef(({ id, anchorId, anchorSelect, conten
1431
1420
  setIsOpen,
1432
1421
  afterShow,
1433
1422
  afterHide,
1423
+ disableTooltip,
1434
1424
  activeAnchor,
1435
1425
  setActiveAnchor: (anchor) => setActiveAnchor(anchor),
1436
1426
  role,