CreateDatabaseDialog.tsx 3.3 KB

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