PageAccessoriesModal.tsx 3.9 KB

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