PageAccessoriesModal.tsx 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import React, { useEffect, useMemo, useState } from 'react';
  2. import {
  3. Modal, ModalBody, ModalHeader,
  4. } from 'reactstrap';
  5. import { useTranslation } from 'react-i18next';
  6. import { useIsGuestUser, useIsSharedUser } from '~/stores/context';
  7. import { usePageAccessoriesModal, PageAccessoriesModalContents } from '~/stores/modal';
  8. import AppContainer from '~/client/services/AppContainer';
  9. import HistoryIcon from './Icons/HistoryIcon';
  10. import AttachmentIcon from './Icons/AttachmentIcon';
  11. import ShareLinkIcon from './Icons/ShareLinkIcon';
  12. import { withUnstatedContainers } from './UnstatedUtils';
  13. import PageAttachment from './PageAttachment';
  14. import PageHistory from './PageHistory';
  15. import ShareLink from './ShareLink/ShareLink';
  16. import { CustomNavTab } from './CustomNavigation/CustomNav';
  17. import ExpandOrContractButton from './ExpandOrContractButton';
  18. import CustomTabContent from './CustomNavigation/CustomTabContent';
  19. type Props = {
  20. appContainer: AppContainer,
  21. isLinkSharingDisabled: boolean,
  22. }
  23. const PageAccessoriesModal = (props: Props): JSX.Element => {
  24. const {
  25. appContainer,
  26. } = props;
  27. const isLinkSharingDisabled = appContainer.config.disableLinkSharing;
  28. const { t } = useTranslation();
  29. const [activeTab, setActiveTab] = useState<PageAccessoriesModalContents>(PageAccessoriesModalContents.PageHistory);
  30. const [isWindowExpanded, setIsWindowExpanded] = useState(false);
  31. const { data: isSharedUser } = useIsSharedUser();
  32. const { data: isGuestUser } = useIsGuestUser();
  33. const { data: status, mutate, close } = usePageAccessoriesModal();
  34. // add event handler when opened
  35. useEffect(() => {
  36. if (status == null || status.onOpened != null) {
  37. return;
  38. }
  39. mutate({
  40. ...status,
  41. onOpened: (activatedContents) => {
  42. setActiveTab(activatedContents);
  43. },
  44. }, false);
  45. }, [mutate, status]);
  46. const navTabMapping = useMemo(() => {
  47. return {
  48. [PageAccessoriesModalContents.PageHistory]: {
  49. Icon: HistoryIcon,
  50. Content: () => <PageHistory />,
  51. i18n: t('History'),
  52. index: 0,
  53. isLinkEnabled: () => !isGuestUser && !isSharedUser,
  54. },
  55. [PageAccessoriesModalContents.Attachment]: {
  56. Icon: AttachmentIcon,
  57. Content: () => <PageAttachment />,
  58. i18n: t('attachment_data'),
  59. index: 1,
  60. },
  61. [PageAccessoriesModalContents.ShareLink]: {
  62. Icon: ShareLinkIcon,
  63. Content: () => <ShareLink />,
  64. i18n: t('share_links.share_link_management'),
  65. index: 2,
  66. isLinkEnabled: () => !isGuestUser && !isSharedUser && !isLinkSharingDisabled,
  67. },
  68. };
  69. }, [t, isGuestUser, isSharedUser, isLinkSharingDisabled]);
  70. const buttons = useMemo(() => (
  71. <div className="d-flex flex-nowrap">
  72. <ExpandOrContractButton
  73. isWindowExpanded={isWindowExpanded}
  74. expandWindow={() => setIsWindowExpanded(true)}
  75. contractWindow={() => setIsWindowExpanded(false)}
  76. />
  77. <button type="button" className="close" onClick={close} aria-label="Close">
  78. <span aria-hidden="true">&times;</span>
  79. </button>
  80. </div>
  81. ), [close, isWindowExpanded]);
  82. if (status == null) {
  83. return <></>;
  84. }
  85. const { isOpened } = status;
  86. return (
  87. <Modal
  88. size="xl"
  89. isOpen={isOpened}
  90. toggle={close}
  91. className={`grw-page-accessories-modal ${isWindowExpanded ? 'grw-modal-expanded' : ''} `}
  92. >
  93. <ModalHeader className="p-0" toggle={close} close={buttons}>
  94. <CustomNavTab
  95. activeTab={activeTab}
  96. navTabMapping={navTabMapping}
  97. breakpointToHideInactiveTabsDown="md"
  98. onNavSelected={(v) => {
  99. setActiveTab(v);
  100. }}
  101. hideBorderBottom
  102. />
  103. </ModalHeader>
  104. <ModalBody className="overflow-auto grw-modal-body-style">
  105. <CustomTabContent activeTab={activeTab} navTabMapping={navTabMapping} />
  106. </ModalBody>
  107. </Modal>
  108. );
  109. };
  110. /**
  111. * Wrapper component for using unstated
  112. */
  113. const PageAccessoriesModalWrapper = withUnstatedContainers(PageAccessoriesModal, [AppContainer]);
  114. export default PageAccessoriesModalWrapper;