RenameCollectionDialog.tsx 3.1 KB

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