Skip to content

Commit

Permalink
working
Browse files Browse the repository at this point in the history
  • Loading branch information
cpcramer committed Jan 22, 2025
1 parent 7615323 commit 8272727
Showing 1 changed file with 29 additions and 14 deletions.
43 changes: 29 additions & 14 deletions src/internal/primitives/DismissableLayer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,26 +28,42 @@ export function DismissableLayer({
}: DismissableLayerProps) {
const layerRef = useRef<HTMLDivElement>(null);

const handleTriggerClick = (event: PointerEvent) => {
// If preventTriggerBubbling is enabled, stop the click from propagating
// This prevents unwanted side effects when the layer is used in nested contexts
if (preventTriggerBubbling) {
event.preventDefault();
event.stopPropagation();
}
};

const isClickInsideLayer = (target: Node) => {
// Check if click occurred inside the dismissable layer itself
// If so, do nothing and let the click event proceed normally
return layerRef.current?.contains(target);
};

useEffect(() => {
if (disableOutsideClick && disableEscapeKey) return;
if (disableOutsideClick && disableEscapeKey) {
return;
}

// Handle capture phase to prevent race conditions
const handlePointerDownCapture = (event: PointerEvent) => {
if (disableOutsideClick) return;

// Check trigger first in capture phase
if (triggerRef?.current?.contains(event.target as Node)) {
if (preventTriggerBubbling) {
event.preventDefault();
event.stopPropagation();
}
if (disableOutsideClick) {
return;
}

// Then check content
if (layerRef.current?.contains(event.target as Node)) return;
const target = event.target as Node;

// Check if click occurred on the trigger element (e.g., a button that opened this layer)
if (triggerRef?.current?.contains(target)) {
handleTriggerClick(event);
return;
}

onDismiss?.();
if (!isClickInsideLayer(target)) {
onDismiss?.();
}
};

const handleKeyDown = (event: KeyboardEvent) => {
Expand All @@ -56,7 +72,6 @@ export function DismissableLayer({
}
};

// Use capture phase
document.addEventListener('pointerdown', handlePointerDownCapture, true);
document.addEventListener('keydown', handleKeyDown);

Expand Down

0 comments on commit 8272727

Please sign in to comment.