PageAccessoriesModal.tsx 4.2 KB

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