Container.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import { makeStyles, Theme } from '@material-ui/core';
  2. import { useContext, useMemo, useState } from 'react';
  3. import { useTranslation } from 'react-i18next';
  4. import DialogTemplate from '../../components/customDialog/DialogTemplate';
  5. import icons from '../../components/icons/Icons';
  6. import { rootContext } from '../../context/Root';
  7. import InsertImport from './Import';
  8. import InsertPreview from './Preview';
  9. import InsertStatus from './Status';
  10. import { InsertStatusEnum, InsertStepperEnum } from './Types';
  11. const getStyles = makeStyles((theme: Theme) => ({
  12. icon: {
  13. fontSize: '16px',
  14. },
  15. }));
  16. /**
  17. * this component contains processes during insert
  18. * all interactions with server are done in it
  19. */
  20. const InsertContainer = () => {
  21. const classes = getStyles();
  22. const { t: insertTrans } = useTranslation('insert');
  23. const { t: btnTrans } = useTranslation('btn');
  24. const { handleCloseDialog } = useContext(rootContext);
  25. const [activeStep, setActiveStep] = useState<InsertStepperEnum>(
  26. InsertStepperEnum.import
  27. );
  28. const [insertStatus, setInsertStauts] = useState<InsertStatusEnum>(
  29. InsertStatusEnum.init
  30. );
  31. // const [nextDisabled, setNextDisabled] = useState<boolean>(false);
  32. const BackIcon = icons.back;
  33. const { confirm, cancel } = useMemo(() => {
  34. /**
  35. * activeStep type is InsertStepperEnum
  36. * so index 0 represents import,
  37. * index 1 represents preview,
  38. * index 2 represents status
  39. */
  40. const labelList = [
  41. {
  42. confirm: btnTrans('next'),
  43. cancel: btnTrans('cancel'),
  44. },
  45. {
  46. confirm: btnTrans('insert'),
  47. cancel: (
  48. <>
  49. <BackIcon classes={{ root: classes.icon }} />
  50. {btnTrans('previous')}
  51. </>
  52. ),
  53. },
  54. {
  55. confirm: btnTrans('done'),
  56. cancel: '',
  57. },
  58. ];
  59. return labelList[activeStep];
  60. }, [activeStep, btnTrans, BackIcon, classes.icon]);
  61. const { showActions, showCancel } = useMemo(() => {
  62. return {
  63. showActions: insertStatus !== InsertStatusEnum.loading,
  64. showCancel: insertStatus === InsertStatusEnum.init,
  65. };
  66. }, [insertStatus]);
  67. const handleInsertData = () => {
  68. // mock status change
  69. setInsertStauts(InsertStatusEnum.loading);
  70. setTimeout(() => {
  71. setInsertStauts(InsertStatusEnum.success);
  72. }, 500);
  73. };
  74. const handleNext = () => {
  75. switch (activeStep) {
  76. case InsertStepperEnum.import:
  77. setActiveStep(activeStep => activeStep + 1);
  78. break;
  79. case InsertStepperEnum.preview:
  80. setActiveStep(activeStep => activeStep + 1);
  81. // @TODO insert interactions
  82. handleInsertData();
  83. break;
  84. // default represent InsertStepperEnum.status
  85. default:
  86. handleCloseDialog();
  87. break;
  88. }
  89. };
  90. const handleBack = () => {
  91. switch (activeStep) {
  92. case InsertStepperEnum.import:
  93. handleCloseDialog();
  94. break;
  95. case InsertStepperEnum.preview:
  96. setActiveStep(activeStep => activeStep - 1);
  97. // @TODO reset uploaded file?
  98. break;
  99. // default represent InsertStepperEnum.status
  100. // status don't have cancel button
  101. default:
  102. break;
  103. }
  104. };
  105. const generateContent = (activeStep: InsertStepperEnum) => {
  106. switch (activeStep) {
  107. case InsertStepperEnum.import:
  108. return <InsertImport />;
  109. case InsertStepperEnum.preview:
  110. return <InsertPreview />;
  111. // default represents InsertStepperEnum.status
  112. default:
  113. return <InsertStatus />;
  114. }
  115. };
  116. return (
  117. <DialogTemplate
  118. title={insertTrans('import')}
  119. handleClose={handleCloseDialog}
  120. confirmLabel={confirm}
  121. cancelLabel={cancel}
  122. handleCancel={handleBack}
  123. handleConfirm={handleNext}
  124. confirmDisabled={false}
  125. showActions={showActions}
  126. showCancel={showCancel}
  127. >
  128. {generateContent(activeStep)}
  129. </DialogTemplate>
  130. );
  131. };
  132. export default InsertContainer;