RenameCollectionDialog.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { FC, useContext, useMemo, useState } from 'react';
  2. import { Typography, makeStyles, Theme } from '@material-ui/core';
  3. import { useTranslation } from 'react-i18next';
  4. import { rootContext } from '@/context';
  5. import { formatForm } from '@/utils';
  6. import { useFormValidation } from '@/hooks';
  7. import { CollectionHttp } from '@/http';
  8. import DialogTemplate from '@/components/customDialog/DialogTemplate';
  9. import CustomInput from '@/components/customInput/CustomInput';
  10. import { ITextfieldConfig } from '@/components/customInput/Types';
  11. import { RenameCollectionProps } from './Types';
  12. const useStyles = makeStyles((theme: Theme) => ({
  13. desc: {
  14. margin: '8px 0 16px 0',
  15. },
  16. }));
  17. const RenameCollectionDialog: FC<RenameCollectionProps> = props => {
  18. const { collectionName, cb } = props;
  19. const [form, setForm] = useState({
  20. new_collection_name: '',
  21. });
  22. const classes = useStyles();
  23. const checkedForm = useMemo(() => {
  24. const { new_collection_name } = form;
  25. return formatForm({ new_collection_name });
  26. }, [form]);
  27. const { validation, checkIsValid, disabled } = useFormValidation(checkedForm);
  28. const { handleCloseDialog } = useContext(rootContext);
  29. const { t: dialogTrans } = useTranslation('dialog');
  30. const { t: warningTrans } = useTranslation('warning');
  31. const { t: collectionTrans } = useTranslation('collection');
  32. const { t: btnTrans } = useTranslation('btn');
  33. const handleInputChange = (value: string) => {
  34. setForm({ new_collection_name: value });
  35. };
  36. const handleConfirm = async () => {
  37. await CollectionHttp.renameCollection(collectionName, form);
  38. handleCloseDialog();
  39. cb && cb();
  40. };
  41. const renameInputCfg: ITextfieldConfig = {
  42. label: collectionTrans('newColName'),
  43. key: 'new_collection_name',
  44. onChange: handleInputChange,
  45. variant: 'filled',
  46. placeholder: collectionTrans('newColNamePlaceholder'),
  47. fullWidth: true,
  48. validations: [
  49. {
  50. rule: 'require',
  51. errorText: warningTrans('required', {
  52. name: collectionTrans('name'),
  53. }),
  54. },
  55. {
  56. rule: 'collectionName',
  57. errorText: collectionTrans('nameContentWarning'),
  58. },
  59. ],
  60. defaultValue: form.new_collection_name,
  61. };
  62. return (
  63. <DialogTemplate
  64. title={dialogTrans('renameTitle', {
  65. type: collectionName,
  66. })}
  67. handleClose={handleCloseDialog}
  68. children={
  69. <>
  70. <Typography variant="body1" component="p" className={classes.desc}>
  71. {collectionTrans('newNameInfo')}
  72. </Typography>
  73. <CustomInput
  74. type="text"
  75. textConfig={renameInputCfg}
  76. checkValid={checkIsValid}
  77. validInfo={validation}
  78. />
  79. </>
  80. }
  81. confirmLabel={btnTrans('rename')}
  82. handleConfirm={handleConfirm}
  83. confirmDisabled={disabled}
  84. />
  85. );
  86. };
  87. export default RenameCollectionDialog;