DuplicateCollectionDailog.tsx 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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 DialogTemplate from '@/components/customDialog/DialogTemplate';
  6. import CustomInput from '@/components/customInput/CustomInput';
  7. import { formatForm } from '@/utils';
  8. import { useFormValidation } from '@/hooks';
  9. import { ITextfieldConfig } from '@/components/customInput/Types';
  10. import { Collection } from '@/http';
  11. import { DuplicateCollectionDialogProps } from './Types';
  12. const useStyles = makeStyles((theme: Theme) => ({
  13. wrapper: {
  14. width: theme.spacing(48),
  15. },
  16. desc: {
  17. margin: '8px 0 16px 0',
  18. },
  19. }));
  20. const DuplicateCollectionDialog: FC<DuplicateCollectionDialogProps> = props => {
  21. const { cb, collectionName, collections } = props;
  22. const [form, setForm] = useState({
  23. duplicate: `${collectionName}_duplicate`,
  24. });
  25. const classes = useStyles();
  26. const checkedForm = useMemo(() => {
  27. const { duplicate } = form;
  28. return formatForm({ duplicate });
  29. }, [form]);
  30. const { validation, checkIsValid, disabled } = useFormValidation(checkedForm);
  31. const { handleCloseDialog } = useContext(rootContext);
  32. const { t: dialogTrans } = useTranslation('dialog');
  33. const { t: warningTrans } = useTranslation('warning');
  34. const { t: collectionTrans } = useTranslation('collection');
  35. const { t: btnTrans } = useTranslation('btn');
  36. const handleInputChange = (value: string) => {
  37. setForm({ duplicate: value });
  38. };
  39. const handleConfirm = async () => {
  40. // duplicate
  41. await Collection.duplicate(collectionName, {
  42. new_collection_name: form.duplicate,
  43. });
  44. // close dialog
  45. handleCloseDialog();
  46. cb && cb();
  47. };
  48. const duplicateInputConfig: ITextfieldConfig = {
  49. label: collectionTrans('newColNamePlaceholder'),
  50. key: 'duplicate',
  51. onChange: handleInputChange,
  52. variant: 'filled',
  53. placeholder: collectionTrans('newColNamePlaceholder'),
  54. fullWidth: true,
  55. validations: [
  56. {
  57. rule: 'require',
  58. errorText: warningTrans('required', {
  59. name: collectionTrans('name'),
  60. }),
  61. },
  62. {
  63. rule: 'collectionName',
  64. errorText: collectionTrans('nameContentWarning'),
  65. },
  66. {
  67. rule: 'custom',
  68. extraParam: {
  69. compare: (value) => {
  70. return !collections.some(collection => collection.collectionName === value);
  71. },
  72. },
  73. errorText: collectionTrans('duplicateNameExist'),
  74. },
  75. ],
  76. defaultValue: form.duplicate,
  77. };
  78. return (
  79. <DialogTemplate
  80. dialogClass={classes.wrapper}
  81. title={dialogTrans('duplicateTitle', {
  82. type: collectionName,
  83. })}
  84. handleClose={handleCloseDialog}
  85. children={
  86. <>
  87. <Typography variant="body1" component="p" className={classes.desc}>
  88. {collectionTrans('duplicateCollectionInfo')}
  89. </Typography>
  90. <CustomInput
  91. type="text"
  92. textConfig={duplicateInputConfig}
  93. checkValid={checkIsValid}
  94. validInfo={validation}
  95. />
  96. </>
  97. }
  98. confirmLabel={btnTrans('duplicate')}
  99. handleConfirm={handleConfirm}
  100. confirmDisabled={disabled}
  101. />
  102. );
  103. };
  104. export default DuplicateCollectionDialog;