Revert Tooltip.tsx to match V2 - remove unrelated changes

This commit is contained in:
Reece 2025-11-13 17:45:02 +00:00
parent 3e198309f5
commit 3855a3ccc4

View File

@ -65,6 +65,10 @@ export const Tooltip: React.FC<TooltipProps> = ({
const clickPendingRef = useRef(false); const clickPendingRef = useRef(false);
const tooltipIdRef = useRef(`tooltip-${Math.random().toString(36).slice(2)}`); const tooltipIdRef = useRef(`tooltip-${Math.random().toString(36).slice(2)}`);
// Runtime guard: some browsers may surface non-Node EventTargets for relatedTarget/target
const isDomNode = (value: unknown): value is Node =>
typeof Node !== 'undefined' && value instanceof Node;
const clearTimers = useCallback(() => { const clearTimers = useCallback(() => {
if (openTimeoutRef.current) { if (openTimeoutRef.current) {
clearTimeout(openTimeoutRef.current); clearTimeout(openTimeoutRef.current);
@ -103,9 +107,9 @@ export const Tooltip: React.FC<TooltipProps> = ({
(e: MouseEvent) => { (e: MouseEvent) => {
const tEl = tooltipRef.current; const tEl = tooltipRef.current;
const trg = triggerRef.current; const trg = triggerRef.current;
const target = e.target as Node | null; const target = e.target as unknown;
const insideTooltip = tEl && target && tEl.contains(target); const insideTooltip = Boolean(tEl && isDomNode(target) && tEl.contains(target));
const insideTrigger = trg && target && trg.contains(target); const insideTrigger = Boolean(trg && isDomNode(target) && trg.contains(target));
// If pinned: only close when clicking outside BOTH tooltip & trigger // If pinned: only close when clicking outside BOTH tooltip & trigger
if (isPinned) { if (isPinned) {
@ -172,7 +176,8 @@ export const Tooltip: React.FC<TooltipProps> = ({
const related = e.relatedTarget as Node | null; const related = e.relatedTarget as Node | null;
// Moving into the tooltip → keep open // Moving into the tooltip → keep open
if (related && tooltipRef.current && tooltipRef.current.contains(related)) { if (isDomNode(related) && tooltipRef.current && tooltipRef.current.contains(related)) {
(children.props as any)?.onPointerLeave?.(e); (children.props as any)?.onPointerLeave?.(e);
return; return;
} }
@ -236,7 +241,7 @@ export const Tooltip: React.FC<TooltipProps> = ({
const handleBlur = useCallback( const handleBlur = useCallback(
(e: React.FocusEvent) => { (e: React.FocusEvent) => {
const related = e.relatedTarget as Node | null; const related = e.relatedTarget as Node | null;
if (related && tooltipRef.current && tooltipRef.current.contains(related)) { if (isDomNode(related) && tooltipRef.current && tooltipRef.current.contains(related)) {
(children.props as any)?.onBlur?.(e); (children.props as any)?.onBlur?.(e);
return; return;
} }
@ -258,7 +263,7 @@ export const Tooltip: React.FC<TooltipProps> = ({
const handleTooltipPointerLeave = useCallback( const handleTooltipPointerLeave = useCallback(
(e: React.PointerEvent) => { (e: React.PointerEvent) => {
const related = e.relatedTarget as Node | null; const related = e.relatedTarget as Node | null;
if (related && triggerRef.current && triggerRef.current.contains(related)) return; if (isDomNode(related) && triggerRef.current && triggerRef.current.contains(related)) return;
if (!isPinned) setOpen(false); if (!isPinned) setOpen(false);
}, },
[isPinned, setOpen] [isPinned, setOpen]