@@ -2,17 +2,24 @@ import React, { useCallback, useState } from 'react';
22import { createPortal } from 'react-dom' ;
33import disableScroll from 'disable-scroll' ;
44
5- export interface Props {
5+ export interface ModalProps {
66 children : React . ReactNode ;
77 isOpen : boolean ;
88 close : ( ) => void ;
99 elementId : 'root' | string ;
1010} ;
1111
12- export interface Options {
12+ export interface ModalOptions {
1313 preventScroll ?: boolean ;
1414} ;
1515
16+ export type UseModal = ( elementId : string , options : ModalOptions ) => [
17+ ModalWrapper : React . FC < { children : React . ReactNode } > ,
18+ open : ( ) => void ,
19+ close : ( ) => void ,
20+ isOpen : boolean
21+ ] ;
22+
1623const wrapperStyle : React . CSSProperties = {
1724 position : 'fixed' ,
1825 top : 0 ,
@@ -40,7 +47,7 @@ const containerStyle: React.CSSProperties = {
4047 zIndex : 100001
4148} ;
4249
43- const Modal : React . FC < Props > = ( { children, isOpen = false , close, elementId = 'root' } ) => {
50+ const Modal : React . FC < ModalProps > = ( { children, isOpen = false , close, elementId = 'root' } ) => {
4451 if ( isOpen === false ) {
4552 return null ;
4653 }
@@ -53,7 +60,7 @@ const Modal: React.FC<Props> = ({ children, isOpen = false, close, elementId = '
5360 ) ;
5461} ;
5562
56- export const useModal = ( elementId = 'root' , options : Options = { } ) : [ ModalWrapper : ( children : any ) => React . ReactElement , open : ( ) => void , close : ( ) => void , isOpen : boolean ] => {
63+ export const useModal : UseModal = ( elementId = 'root' , options = { } ) => {
5764 const { preventScroll = false } = options ;
5865 const [ isOpen , setOpen ] = useState < boolean > ( false ) ;
5966 const open = useCallback ( ( ) => {
@@ -69,13 +76,13 @@ export const useModal = (elementId = 'root', options: Options = {}): [ModalWrapp
6976 }
7077 } , [ setOpen , preventScroll ] ) ;
7178
72- const ModalWrapper = useCallback ( ( { children } ) => {
79+ const ModalWrapper = React . memo ( ( { children } ) => {
7380 return (
7481 < Modal isOpen = { isOpen } close = { close } elementId = { elementId } >
7582 { children }
7683 </ Modal >
7784 )
78- } , [ isOpen , close , elementId ] ) ;
85+ } ) ;
7986
8087 return [ ModalWrapper , open , close , isOpen ] ;
8188} ;
0 commit comments