PageAccessoriesModal.tsx 4.4 KB

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