From feaa85f76466cf9a8402ba4c5350f440213aa9a0 Mon Sep 17 00:00:00 2001 From: pablodanswer Date: Tue, 27 Aug 2024 09:31:25 -0700 Subject: [PATCH] new util for modal edge cases --- web/src/components/Modal.tsx | 4 +++- web/src/components/admin/connectors/Field.tsx | 1 - web/src/components/modals/ModalWrapper.tsx | 4 +++- web/src/lib/contains.ts | 20 +++++++++++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/web/src/components/Modal.tsx b/web/src/components/Modal.tsx index 782bd29c7cc3..f3985276520c 100644 --- a/web/src/components/Modal.tsx +++ b/web/src/components/Modal.tsx @@ -3,6 +3,7 @@ import { Divider } from "@tremor/react"; import { FiX } from "react-icons/fi"; import { IconProps } from "./icons/icons"; import { useRef } from "react"; +import { isEventWithinRef } from "@/lib/contains"; interface ModalProps { icon?: ({ size, className }: IconProps) => JSX.Element; @@ -33,7 +34,8 @@ export function Modal({ if ( onOutsideClick && modalRef.current && - !modalRef.current.contains(e.target as Node) + !modalRef.current.contains(e.target as Node) && + !isEventWithinRef(e.nativeEvent, modalRef) ) { onOutsideClick(); } diff --git a/web/src/components/admin/connectors/Field.tsx b/web/src/components/admin/connectors/Field.tsx index a414101ef7ab..2dfcda222c1b 100644 --- a/web/src/components/admin/connectors/Field.tsx +++ b/web/src/components/admin/connectors/Field.tsx @@ -552,7 +552,6 @@ export function SelectorFormField({
{label && } {subtext && {subtext}} -
objectsAreEquivalent(item, obj)); } + +export function isEventWithinRef( + event: MouseEvent | TouchEvent, + ref: RefObject +): boolean { + if (!ref.current) return false; + + const rect = ref.current.getBoundingClientRect(); + const clientX = "touches" in event ? event.touches[0].clientX : event.clientX; + const clientY = "touches" in event ? event.touches[0].clientY : event.clientY; + + return ( + clientX >= rect.left && + clientX <= rect.right && + clientY >= rect.top && + clientY <= rect.bottom + ); +}