Spaces:
Configuration error
Configuration error
| import { XMarkIcon } from '@heroicons/react/24/outline' | |
| import React, { ReactNode } from 'react' | |
| import { useRecoilState } from 'recoil' | |
| import * as DialogPrimitive from '@radix-ui/react-dialog' | |
| import Button from './Button' | |
| import { appState } from '../../store/Atoms' | |
| export interface ModalProps { | |
| show: boolean | |
| children?: ReactNode | |
| onClose?: () => void | |
| title: string | ReactNode | |
| showCloseIcon?: boolean | |
| className?: string | |
| } | |
| const Modal = React.forwardRef< | |
| React.ElementRef<typeof DialogPrimitive.Root>, | |
| ModalProps | |
| >((props, forwardedRef) => { | |
| const { show, children, onClose, className, title, showCloseIcon } = props | |
| const [_, setAppState] = useRecoilState(appState) | |
| const onOpenChange = (open: boolean) => { | |
| if (!open) { | |
| onClose?.() | |
| setAppState(old => { | |
| return { ...old, disableShortCuts: false } | |
| }) | |
| } | |
| } | |
| return ( | |
| <DialogPrimitive.Root open={show} onOpenChange={onOpenChange}> | |
| <DialogPrimitive.Portal> | |
| <DialogPrimitive.Overlay className="modal-mask" /> | |
| <DialogPrimitive.Content | |
| ref={forwardedRef} | |
| className={`modal ${className}`} | |
| > | |
| <div className="modal-header"> | |
| <DialogPrimitive.Title>{title}</DialogPrimitive.Title> | |
| {showCloseIcon ? ( | |
| <Button icon={<XMarkIcon />} onClick={onClose} /> | |
| ) : ( | |
| <></> | |
| )} | |
| </div> | |
| {children} | |
| </DialogPrimitive.Content> | |
| </DialogPrimitive.Portal> | |
| </DialogPrimitive.Root> | |
| ) | |
| }) | |
| Modal.defaultProps = { | |
| showCloseIcon: true, | |
| } | |
| export default Modal | |