CreateDatabaseDialog.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { Theme } from '@mui/material';
  2. import { FC, useMemo, useState, useContext } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import DialogTemplate from '@/components/customDialog/DialogTemplate';
  5. import CustomInput from '@/components/customInput/CustomInput';
  6. import { ITextfieldConfig } from '@/components/customInput/Types';
  7. import { useFormValidation } from '@/hooks';
  8. import { formatForm } from '@/utils';
  9. import { CreateDatabaseParams } from '@/http';
  10. import { dataContext, rootContext } from '@/context';
  11. import { makeStyles } from '@mui/styles';
  12. const useStyles = makeStyles((theme: Theme) => ({
  13. input: {
  14. margin: theme.spacing(3, 0, 0.5),
  15. },
  16. }));
  17. export interface CreateDatabaseProps {
  18. onCreate?: () => void;
  19. }
  20. const CreateDatabaseDialog: FC<CreateDatabaseProps> = ({ onCreate }) => {
  21. // context
  22. const { createDatabase } = useContext(dataContext);
  23. const { openSnackBar, handleCloseDialog } = useContext(rootContext);
  24. // i18n
  25. const { t: databaseTrans } = useTranslation('database');
  26. const { t: btnTrans } = useTranslation('btn');
  27. const { t: warningTrans } = useTranslation('warning');
  28. const { t: successTrans } = useTranslation('success');
  29. const { t: dbTrans } = useTranslation('database');
  30. // UI state
  31. const [form, setForm] = useState<CreateDatabaseParams>({
  32. db_name: '',
  33. });
  34. const [loading, setLoading] = useState(false);
  35. // validation
  36. const checkedForm = useMemo(() => {
  37. return formatForm(form);
  38. }, [form]);
  39. const { validation, checkIsValid, disabled } = useFormValidation(checkedForm);
  40. const classes = useStyles();
  41. const handleInputChange = (key: 'db_name', value: string) => {
  42. setForm(v => ({ ...v, [key]: value }));
  43. };
  44. const createConfigs: ITextfieldConfig[] = [
  45. {
  46. label: databaseTrans('database'),
  47. key: 'db_name',
  48. onChange: (value: string) => handleInputChange('db_name', value),
  49. variant: 'filled',
  50. className: classes.input,
  51. placeholder: databaseTrans('database'),
  52. fullWidth: true,
  53. validations: [
  54. {
  55. rule: 'require',
  56. errorText: warningTrans('required', {
  57. name: databaseTrans('databaseName'),
  58. }),
  59. },
  60. ],
  61. defaultValue: form.db_name,
  62. },
  63. ];
  64. const handleCreate = async () => {
  65. setLoading(true);
  66. const res = await createDatabase(form).finally(() => {
  67. setLoading(false);
  68. });
  69. openSnackBar(successTrans('create', { name: dbTrans('database') }));
  70. handleCloseDialog();
  71. if (onCreate) {
  72. onCreate();
  73. }
  74. setLoading(false);
  75. };
  76. const handleClose = () => {
  77. handleCloseDialog();
  78. };
  79. return (
  80. <DialogTemplate
  81. title={databaseTrans('createTitle')}
  82. handleClose={handleClose}
  83. confirmLabel={btnTrans('create')}
  84. handleConfirm={handleCreate}
  85. confirmDisabled={disabled || loading}
  86. >
  87. <>
  88. {createConfigs.map(v => (
  89. <CustomInput
  90. type="text"
  91. textConfig={v}
  92. checkValid={checkIsValid}
  93. validInfo={validation}
  94. key={v.label}
  95. />
  96. ))}
  97. </>
  98. </DialogTemplate>
  99. );
  100. };
  101. export default CreateDatabaseDialog;