index.jsx 852 B

123456789101112131415161718192021222324252627282930313233
  1. import { useEffect, useRef, useCallback } from 'react';
  2. import ReactDom from 'react-dom';
  3. import classes from './style.module.scss';
  4. export const CustomModal = ({ children, closeEvent }) => {
  5. const modal = useRef();
  6. const handleClickOutside = useCallback(
  7. (event) => {
  8. if (modal.current) {
  9. if (event.target && !modal.current.contains(event.target)) closeEvent();
  10. }
  11. },
  12. [closeEvent],
  13. );
  14. useEffect(() => {
  15. document.addEventListener('mousedown', handleClickOutside)
  16. return () => {
  17. document.removeEventListener('mousedown', handleClickOutside)
  18. }
  19. }, [handleClickOutside])
  20. return ReactDom.createPortal(<div className={classes.wrapper}>
  21. <div className={classes.modal} ref={modal}>
  22. {/* <div>header <button>x</button></div> */}
  23. {children}
  24. </div>
  25. </div>, document.body)
  26. }