CreateAliasDialog.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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. desc: {
  14. margin: '8px 0 16px 0',
  15. },
  16. }));
  17. export interface CreateAliasProps {
  18. collection: CollectionObject;
  19. cb?: (collection: CollectionObject) => void;
  20. }
  21. const CreateAliasDialog: FC<CreateAliasProps> = props => {
  22. const { createAlias } = useContext(dataContext);
  23. const { handleCloseDialog } = useContext(rootContext);
  24. const { cb, collection } = props;
  25. const [form, setForm] = useState({
  26. alias: '',
  27. });
  28. const classes = useStyles();
  29. const checkedForm = useMemo(() => {
  30. const { alias } = form;
  31. return formatForm({ alias });
  32. }, [form]);
  33. const { validation, checkIsValid, disabled } = useFormValidation(checkedForm);
  34. const { t: dialogTrans } = useTranslation('dialog');
  35. const { t: warningTrans } = useTranslation('warning');
  36. const { t: collectionTrans } = useTranslation('collection');
  37. const { t: btnTrans } = useTranslation('btn');
  38. const handleInputChange = (value: string) => {
  39. setForm({ alias: value });
  40. };
  41. const handleConfirm = async () => {
  42. await createAlias(collection.collection_name, form.alias);
  43. handleCloseDialog();
  44. cb && (await cb(collection));
  45. };
  46. const aliasInputConfig: ITextfieldConfig = {
  47. label: collectionTrans('alias'),
  48. key: 'alias',
  49. onChange: handleInputChange,
  50. variant: 'filled',
  51. placeholder: collectionTrans('aliasCreatePlaceholder'),
  52. fullWidth: true,
  53. validations: [
  54. {
  55. rule: 'require',
  56. errorText: warningTrans('required', {
  57. name: collectionTrans('name'),
  58. }),
  59. },
  60. {
  61. rule: 'collectionName',
  62. errorText: collectionTrans('nameContentWarning'),
  63. },
  64. ],
  65. defaultValue: form.alias,
  66. };
  67. return (
  68. <DialogTemplate
  69. title={dialogTrans('createAlias', {
  70. type: collection.collection_name,
  71. })}
  72. handleClose={handleCloseDialog}
  73. children={
  74. <>
  75. <Typography variant="body1" component="p" className={classes.desc}>
  76. {collectionTrans('aliasInfo')}
  77. </Typography>
  78. <CustomInput
  79. type="text"
  80. textConfig={aliasInputConfig}
  81. checkValid={checkIsValid}
  82. validInfo={validation}
  83. />
  84. </>
  85. }
  86. confirmLabel={btnTrans('create')}
  87. handleConfirm={handleConfirm}
  88. confirmDisabled={disabled}
  89. />
  90. );
  91. };
  92. export default CreateAliasDialog;