| 49 | * A modal is an overlay element which blocks interaction with elements outside it. |
| 50 | */ |
| 51 | export function useModalOverlay( |
| 52 | props: AriaModalOverlayProps, |
| 53 | state: OverlayTriggerState, |
| 54 | ref: RefObject<HTMLElement | null> |
| 55 | ): ModalOverlayAria { |
| 56 | let {overlayProps, underlayProps} = useOverlay( |
| 57 | { |
| 58 | ...props, |
| 59 | isOpen: state.isOpen, |
| 60 | onClose: state.close |
| 61 | }, |
| 62 | ref |
| 63 | ); |
| 64 | |
| 65 | usePreventScroll({ |
| 66 | isDisabled: !state.isOpen |
| 67 | }); |
| 68 | |
| 69 | useOverlayFocusContain(); |
| 70 | |
| 71 | useEffect(() => { |
| 72 | if (state.isOpen && ref.current) { |
| 73 | return ariaHideOutside([ref.current], {shouldUseInert: true}); |
| 74 | } |
| 75 | }, [state.isOpen, ref]); |
| 76 | |
| 77 | return { |
| 78 | modalProps: mergeProps(overlayProps), |
| 79 | underlayProps |
| 80 | }; |
| 81 | } |