index.tsx
 1  import {PropsWithChildren} from 'react';
 2  import {useTranslation} from 'react-i18next';
 3  import Dialog from '@mui/material/Dialog';
 4  import DialogContent from '@mui/material/DialogContent';
 5  import DialogActions from '@mui/material/DialogActions';
 6  import DialogTitle from '@mui/material/DialogTitle';
 7  import Button from '@mui/material/Button';
 8  import Transition from './Transition';
 9  
10  interface Props {
11    open: boolean;
12    cancel: () => void;
13    onSubmit: () => Promise<void>;
14    disabled?: boolean;
15    title: string;
16    action?: string;
17  }
18  
19  const FormDialog = ({
20    open,
21    cancel,
22    onSubmit,
23    disabled,
24    title,
25    action,
26    children,
27  }: PropsWithChildren<Props>) => {
28    const {t} = useTranslation();
29  
30    return (
31      <Dialog
32        fullWidth
33        maxWidth="xs"
34        open={open}
35        onClose={cancel}
36        TransitionComponent={Transition}
37      >
38        <form
39          onSubmit={e => {
40            e.preventDefault();
41            onSubmit();
42          }}
43        >
44          <DialogTitle>{title}</DialogTitle>
45          <DialogContent>{children}</DialogContent>
46          <DialogActions>
47            <Button variant="text" onClick={cancel}>
48              {t('generic.cancel')}
49            </Button>
50            <Button type="submit" variant="contained" disabled={disabled}>
51              {action || t('generic.add')}
52            </Button>
53          </DialogActions>
54        </form>
55      </Dialog>
56    );
57  };
58  
59  export default FormDialog;