Modal.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import css from './index.module.css';
  2. import {FC, FormEventHandler, ReactNode} from 'react';
  3. import ReactModal from 'react-modal';
  4. import {CloseCircleFilled} from '@ant-design/icons';
  5. import ModalBtnGroup from './BtnGroup';
  6. import {Space} from 'antd';
  7. import addIcon from '@assets/images/dialog/add.webp';
  8. import editIcon from '@assets/images/dialog/edit.webp';
  9. type ReactModalStyle = ReactModal.Styles;
  10. type Props = {
  11. visible: boolean,
  12. title: string,
  13. onClose?: () => void,
  14. isLoading?: boolean,
  15. onSubmit?: FormEventHandler<HTMLFormElement>
  16. children?: ReactNode,
  17. testId?: string,
  18. height?: string,
  19. width?: string,
  20. };
  21. const Modal: FC<Props> = function({
  22. visible,
  23. title,
  24. onClose,
  25. isLoading,
  26. onSubmit,
  27. children,
  28. testId,
  29. height,
  30. width,
  31. }) {
  32. const styles: ReactModalStyle = {
  33. content: {
  34. width: width ?? '680px',
  35. overflow: 'visible',
  36. borderRadius: '10px',
  37. height: height ?? '560px',
  38. },
  39. };
  40. return (
  41. <ReactModal
  42. isOpen={visible}
  43. style={styles}
  44. closeTimeoutMS={200}
  45. ariaHideApp={false}
  46. shouldCloseOnOverlayClick
  47. onRequestClose={onClose}
  48. >
  49. <section className={css.dialog} data-testid={testId}>
  50. <div className={css.dialogTitle}>
  51. <h3>{title}</h3>
  52. </div>
  53. <CloseCircleFilled className={css.dialogClose} onClick={onClose} />
  54. <div className={css.dialogDecorate}>
  55. <span className={css.dialogDecorateIcon1} />
  56. <div className={css.dialogDecorateCircle}>
  57. <img src={title.includes('新增') ? addIcon : editIcon} />
  58. </div>
  59. <span className={css.dialogDecorateIcon2} />
  60. </div>
  61. <form onSubmit={onSubmit} className={css.dialogForm}>
  62. <div className={css.dialogContent}>
  63. <Space direction='vertical' className='width-full'>
  64. {children}
  65. </Space>
  66. </div>
  67. <ModalBtnGroup isLoading={isLoading} onClose={onClose} />
  68. </form>
  69. </section>
  70. </ReactModal>
  71. );
  72. };
  73. export default Modal;