react-tooltip 6.0.4 → 6.0.5

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.
@@ -551,38 +551,39 @@
551
551
  * This reduces document-level listeners from O(N × eventTypes) to O(eventTypes).
552
552
  */
553
553
  const handlersByType = new Map();
554
- function getOrCreateSet(eventType) {
555
- let set = handlersByType.get(eventType);
556
- if (!set) {
557
- set = new Set();
558
- handlersByType.set(eventType, set);
559
- document.addEventListener(eventType, dispatch);
560
- }
561
- return set;
554
+ function getListenerKey(eventType, capture) {
555
+ return `${eventType}:${capture ? 'capture' : 'bubble'}`;
562
556
  }
563
- function dispatch(event) {
564
- const handlers = handlersByType.get(event.type);
565
- if (handlers) {
566
- // Safe to iterate directly — mutations (add/remove) only happen in
567
- // setup/cleanup, not during dispatch. Set iteration is stable for
568
- // entries that existed when iteration began.
569
- handlers.forEach((handler) => {
570
- handler(event);
571
- });
557
+ function getOrCreateListener(eventType, capture) {
558
+ const key = getListenerKey(eventType, capture);
559
+ let listener = handlersByType.get(key);
560
+ if (!listener) {
561
+ const handlers = new Set();
562
+ const dispatch = (event) => {
563
+ handlers.forEach((handler) => {
564
+ handler(event);
565
+ });
566
+ };
567
+ listener = { handlers, dispatch, eventType, capture };
568
+ handlersByType.set(key, listener);
569
+ document.addEventListener(eventType, dispatch, { capture });
572
570
  }
571
+ return listener;
573
572
  }
574
573
  /**
575
574
  * Register a handler for a document-level event type.
576
575
  * Returns an unsubscribe function.
577
576
  */
578
- function addDelegatedEventListener(eventType, handler) {
579
- const set = getOrCreateSet(eventType);
580
- set.add(handler);
577
+ function addDelegatedEventListener(eventType, handler, options = {}) {
578
+ const capture = Boolean(options.capture);
579
+ const key = getListenerKey(eventType, capture);
580
+ const listener = getOrCreateListener(eventType, capture);
581
+ listener.handlers.add(handler);
581
582
  return () => {
582
- set.delete(handler);
583
- if (set.size === 0) {
584
- handlersByType.delete(eventType);
585
- document.removeEventListener(eventType, dispatch);
583
+ listener.handlers.delete(handler);
584
+ if (listener.handlers.size === 0) {
585
+ handlersByType.delete(key);
586
+ document.removeEventListener(eventType, listener.dispatch, { capture });
586
587
  }
587
588
  };
588
589
  }
@@ -788,8 +789,8 @@
788
789
  // time, so this effect is decoupled from show/hide state changes.
789
790
  React.useEffect(() => {
790
791
  const cleanupFns = [];
791
- const addDelegatedListener = (eventType, listener) => {
792
- cleanupFns.push(addDelegatedEventListener(eventType, listener));
792
+ const addDelegatedListener = (eventType, listener, options) => {
793
+ cleanupFns.push(addDelegatedEventListener(eventType, listener, options));
793
794
  };
794
795
  const activeAnchorContainsTarget = (event) => { var _a; return Boolean((event === null || event === void 0 ? void 0 : event.target) && ((_a = activeAnchorRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))); };
795
796
  const debouncedHandleShowTooltip = (anchor) => {
@@ -882,7 +883,9 @@
882
883
  return;
883
884
  }
884
885
  if (clickEvents.includes(event)) {
885
- addDelegatedListener(event, handleClickOpenTooltipAnchor);
886
+ addDelegatedListener(event, handleClickOpenTooltipAnchor, {
887
+ capture: true,
888
+ });
886
889
  }
887
890
  });
888
891
  Object.entries(actualCloseEvents).forEach(([event, enabled]) => {
@@ -890,7 +893,9 @@
890
893
  return;
891
894
  }
892
895
  if (clickEvents.includes(event)) {
893
- addDelegatedListener(event, handleClickCloseTooltipAnchor);
896
+ addDelegatedListener(event, handleClickCloseTooltipAnchor, {
897
+ capture: true,
898
+ });
894
899
  }
895
900
  });
896
901
  if (float) {