DuplicateCollectionDialog.tsx 3.8 KB

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