diff --git a/packages/web/src/javascripts/Components/Modal/ModalOverlay.tsx b/packages/web/src/javascripts/Components/Modal/ModalOverlay.tsx index f34429a06..1cd72cb6d 100644 --- a/packages/web/src/javascripts/Components/Modal/ModalOverlay.tsx +++ b/packages/web/src/javascripts/Components/Modal/ModalOverlay.tsx @@ -1,6 +1,6 @@ import { mergeRefs } from '@/Hooks/mergeRefs' import { Dialog, DialogOptions, useDialogStore } from '@ariakit/react' -import { ForwardedRef, forwardRef, ReactNode } from 'react' +import { ForwardedRef, forwardRef, ReactNode, useCallback } from 'react' import { useModalAnimation } from '../Modal/useModalAnimation' type Props = { @@ -10,6 +10,8 @@ type Props = { close: () => void } +type DialogWithClose = HTMLDivElement & { close: () => void } + const ModalOverlay = forwardRef( ( { isOpen, children, animationVariant, close, ...props }: Props & Partial, @@ -25,6 +27,15 @@ const ModalOverlay = forwardRef( }, }) + const addCloseMethod = useCallback( + (element: HTMLDivElement | null) => { + if (element) { + ;(element as DialogWithClose).close = close + } + }, + [close], + ) + if (!isMounted) { return null } @@ -33,7 +44,7 @@ const ModalOverlay = forwardRef( { useDisableBodyScrollOnMobile() @@ -12,6 +13,8 @@ const DisableScroll = () => { return null } +type PopoverWithClose = HTMLDivElement & { close: () => void } + const MobilePopoverContent = ({ open, requestClose, @@ -29,6 +32,15 @@ const MobilePopoverContent = ({ }) => { const [isMounted, setPopoverElement] = useModalAnimation(open) + const addCloseMethod = useCallback( + (element: HTMLDivElement | null) => { + if (element) { + ;(element as PopoverWithClose).close = requestClose + } + }, + [requestClose], + ) + if (!isMounted) { return null } @@ -37,7 +49,7 @@ const MobilePopoverContent = ({
{ + document.querySelectorAll('[role="dialog"], [data-popover]').forEach((element) => { + if ('close' in element && typeof element.close === 'function') { + element.close() + } + }) +}