DuplicateCollectionDialog.tsx 3.8 KB

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