diff --git a/packages/react/src/components/DropdownSelector/__snapshots__/index.story.storyshot b/packages/react/src/components/DropdownSelector/__snapshots__/index.story.storyshot index 3b5149c07..7c1a7a831 100644 --- a/packages/react/src/components/DropdownSelector/__snapshots__/index.story.storyshot +++ b/packages/react/src/components/DropdownSelector/__snapshots__/index.story.storyshot @@ -703,6 +703,7 @@ exports[`Storybook Tests DropdownSelector InModal 1`] = `
@@ -2024,6 +2026,7 @@ exports[`Storybook Tests Modal FullBottomSheet 1`] = `
@@ -2870,6 +2874,7 @@ exports[`Storybook Tests Modal NotDismmissableStory 1`] = `
diff --git a/packages/react/src/components/Modal/index.tsx b/packages/react/src/components/Modal/index.tsx index 55d89a766..d0d3dda6e 100644 --- a/packages/react/src/components/Modal/index.tsx +++ b/packages/react/src/components/Modal/index.tsx @@ -1,10 +1,6 @@ import { useContext, forwardRef, memo } from 'react' import * as React from 'react' -import { - AriaModalOverlayProps, - Overlay, - useModalOverlay, -} from '@react-aria/overlays' +import { AriaModalOverlayProps, Overlay } from '@react-aria/overlays' import styled, { css, useTheme } from 'styled-components' import { AriaDialogProps } from '@react-types/dialog' import { maxWidth } from '@charcoal-ui/utils' @@ -15,6 +11,7 @@ import IconButton from '../IconButton' import { useObjectRef } from '@react-aria/utils' import { Dialog } from './Dialog' import { ModalBackgroundContext } from './ModalBackgroundContext' +import { useCharcoalModalOverlay } from './useCustomModalOverlay' export type BottomSheet = boolean | 'full' export type Size = 'S' | 'M' | 'L' @@ -81,27 +78,15 @@ const Modal = forwardRef(function ModalInner( const ref = useObjectRef(external) - const { modalProps, underlayProps } = useModalOverlay( + const { modalProps, underlayProps } = useCharcoalModalOverlay( { ...props, isKeyboardDismissDisabled: isDismissable === undefined || isDismissable === false, }, - { - close: onClose, - isOpen: isOpen, - // these props are not used actually. - // https://github.com/adobe/react-spectrum/blob/df14e3fb129b94b310f0397a701b83f006b51dfe/packages/%40react-aria/overlays/src/useModalOverlay.ts - open: () => { - // nope - }, - setOpen: () => { - // nope - }, - toggle: () => { - // nope - }, + onClose, + isOpen, }, ref ) @@ -136,6 +121,15 @@ const Modal = forwardRef(function ModalInner( const bgRef = React.useRef(null) + const handleClick = React.useCallback( + (e: MouseEvent) => { + if (e.currentTarget === e.target) { + onClose() + } + }, + [onClose] + ) + return transition( ({ backgroundColor, overflow, transform }, item) => item && ( @@ -146,6 +140,7 @@ const Modal = forwardRef(function ModalInner( {...underlayProps} style={transitionEnabled ? { backgroundColor, overflow } : {}} $bottomSheet={bottomSheet} + onClick={handleClick} > void }, + ref: React.RefObject +): ModalOverlayAria { + const { overlayProps, underlayProps } = useOverlay( + { + ...props, + isOpen: state.isOpen, + onClose: state.onClose, + shouldCloseOnInteractOutside: () => false, + }, + ref + ) + + useOverlayFocusContain() + + React.useEffect(() => { + if (state.isOpen && ref.current) { + return ariaHideOutside([ref.current]) + } + }, [state.isOpen, ref]) + + return { + modalProps: overlayProps, + underlayProps, + } +}