DescendantsPageListModal.tsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import React, { useState, useMemo } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import {
  4. Modal, ModalHeader, ModalBody,
  5. } from 'reactstrap';
  6. import { useIsSharedUser } from '~/stores/context';
  7. import { useDescendantsPageListModal } from '~/stores/modal';
  8. import { CustomNavTab } from './CustomNavigation/CustomNav';
  9. import CustomTabContent from './CustomNavigation/CustomTabContent';
  10. import { DescendantsPageList } from './DescendantsPageList';
  11. import ExpandOrContractButton from './ExpandOrContractButton';
  12. import PageListIcon from './Icons/PageListIcon';
  13. import TimeLineIcon from './Icons/TimeLineIcon';
  14. import { PageTimeline } from './PageTimeline';
  15. export const DescendantsPageListModal = (): JSX.Element => {
  16. const { t } = useTranslation();
  17. const [activeTab, setActiveTab] = useState('pagelist');
  18. const [isWindowExpanded, setIsWindowExpanded] = useState(false);
  19. const { data: isSharedUser } = useIsSharedUser();
  20. const { data: status, close } = useDescendantsPageListModal();
  21. const navTabMapping = useMemo(() => {
  22. return {
  23. pagelist: {
  24. Icon: PageListIcon,
  25. Content: () => {
  26. if (status == null || status.path == null || !status.isOpened) {
  27. return <></>;
  28. }
  29. return <DescendantsPageList path={status.path} />;
  30. },
  31. i18n: t('page_list'),
  32. index: 0,
  33. isLinkEnabled: () => !isSharedUser,
  34. },
  35. timeline: {
  36. Icon: TimeLineIcon,
  37. Content: () => <PageTimeline />,
  38. i18n: t('Timeline View'),
  39. index: 1,
  40. isLinkEnabled: () => !isSharedUser,
  41. },
  42. };
  43. }, [isSharedUser, status, t]);
  44. const buttons = useMemo(() => (
  45. <div className="d-flex flex-nowrap">
  46. <ExpandOrContractButton
  47. isWindowExpanded={isWindowExpanded}
  48. expandWindow={() => setIsWindowExpanded(true)}
  49. contractWindow={() => setIsWindowExpanded(false)}
  50. />
  51. <button type="button" className="close" onClick={close} aria-label="Close">
  52. <span aria-hidden="true">&times;</span>
  53. </button>
  54. </div>
  55. ), [close, isWindowExpanded]);
  56. if (status == null) {
  57. return <></>;
  58. }
  59. const { isOpened } = status;
  60. return (
  61. <Modal
  62. size="xl"
  63. isOpen={isOpened}
  64. toggle={close}
  65. data-testid="page-accessories-modal"
  66. className={`grw-page-accessories-modal ${isWindowExpanded ? 'grw-modal-expanded' : ''} `}
  67. >
  68. <ModalHeader className="p-0" toggle={close} close={buttons}>
  69. <CustomNavTab
  70. activeTab={activeTab}
  71. navTabMapping={navTabMapping}
  72. breakpointToHideInactiveTabsDown="md"
  73. onNavSelected={v => setActiveTab(v)}
  74. hideBorderBottom
  75. />
  76. </ModalHeader>
  77. <ModalBody>
  78. <CustomTabContent activeTab={activeTab} navTabMapping={navTabMapping} />
  79. </ModalBody>
  80. </Modal>
  81. );
  82. };