From 6f18a73d946ef1829d317651f604b69b38135d92 Mon Sep 17 00:00:00 2001 From: Aman Harwara Date: Wed, 12 Jul 2023 21:03:06 +0530 Subject: [PATCH] chore: close currently open modals/popovers when sharing text into sn --- .../Components/Modal/ModalOverlay.tsx | 15 +++++++++++++-- .../Components/Popover/MobilePopoverContent.tsx | 16 ++++++++++++++-- .../Controllers/SelectedItemsController.ts | 5 +++++ .../Utils/CloseOpenModalsAndPopovers.ts | 7 +++++++ 4 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 packages/web/src/javascripts/Utils/CloseOpenModalsAndPopovers.ts 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() + } + }) +}