CreateDatabaseDialog.tsx 3.1 KB

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