PageAccessoriesModal.tsx 4.2 KB

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