Chore: Introduce Modal Region (#25962)
parent
8547ffff6a
commit
3ead8ebd3e
@ -0,0 +1,23 @@ |
||||
import { useModal, useCurrentModal } from '@rocket.chat/ui-contexts'; |
||||
import React, { useCallback, ReactElement } from 'react'; |
||||
|
||||
import ModalBackdrop from '../../components/modal/ModalBackdrop'; |
||||
import ModalPortal from '../../components/modal/ModalPortal'; |
||||
|
||||
const ModalRegion = (): ReactElement | null => { |
||||
const currentModal = useCurrentModal(); |
||||
const { setModal } = useModal(); |
||||
const handleDismiss = useCallback(() => setModal(null), [setModal]); |
||||
|
||||
if (!currentModal) { |
||||
return null; |
||||
} |
||||
|
||||
return ( |
||||
<ModalPortal> |
||||
<ModalBackdrop onDismiss={handleDismiss}>{currentModal}</ModalBackdrop> |
||||
</ModalPortal> |
||||
); |
||||
}; |
||||
|
||||
export default ModalRegion; |
||||
@ -0,0 +1,16 @@ |
||||
import { useContext } from 'react'; |
||||
|
||||
import { ModalContext, ModalContextValue } from '../ModalContext'; |
||||
|
||||
/** |
||||
* Similar to useModal this hook return the current modal from the context value |
||||
*/ |
||||
export const useCurrentModal = (): ModalContextValue['currentModal'] => { |
||||
const context = useContext(ModalContext); |
||||
|
||||
if (!context) { |
||||
throw new Error('useCurrentModal must be used inside Modal Context'); |
||||
} |
||||
|
||||
return context.currentModal; |
||||
}; |
||||
@ -1,5 +1,5 @@ |
||||
import { ReactNode, useContext } from 'react'; |
||||
import type { ReactNode } from 'react'; |
||||
|
||||
import { ModalContext } from '../ModalContext'; |
||||
import { useModal } from './useModal'; |
||||
|
||||
export const useSetModal = (): ((modal?: ReactNode) => void) => useContext(ModalContext).setModal; |
||||
export const useSetModal = (): ((modal?: ReactNode) => void) => useModal().setModal; |
||||
|
||||
Loading…
Reference in new issue