TopOfTableContents.jsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import React, { useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import PageContainer from '../services/PageContainer';
  5. import PageListIcon from './Icons/PageListIcon';
  6. import TimeLineIcon from './Icons/TimeLineIcon';
  7. import RecentChangesIcon from './Icons/RecentChangesIcon';
  8. import AttachmentIcon from './Icons/AttachmentIcon';
  9. import PageAccessoriesModal from './PageAccessoriesModal';
  10. import { withUnstatedContainers } from './UnstatedUtils';
  11. const TopOfTableContents = (props) => {
  12. const [isPageAccessoriesModalShown, setIsPageAccessoriesModalShown] = useState(false);
  13. const [activeTab, setActiveTab] = useState('');
  14. // Prevent unnecessary rendering
  15. const [activeComponents, setActiveComponents] = useState(new Set(['']));
  16. function openPageAccessoriesModal(activeTab) {
  17. setIsPageAccessoriesModalShown(true);
  18. setActiveTab(activeTab);
  19. activeComponents.add(activeTab);
  20. setActiveComponents(activeComponents);
  21. }
  22. function switchActiveTab(clickedTab) {
  23. activeComponents.add(clickedTab);
  24. setActiveComponents(activeComponents);
  25. setActiveTab(clickedTab);
  26. }
  27. function closePageAccessoriesModal() {
  28. setIsPageAccessoriesModalShown(false);
  29. }
  30. function renderModal() {
  31. return (
  32. <>
  33. <PageAccessoriesModal
  34. isOpen={isPageAccessoriesModalShown}
  35. onClose={closePageAccessoriesModal}
  36. activeTab={activeTab}
  37. onSwitch={switchActiveTab}
  38. activeComponents={activeComponents}
  39. />
  40. </>
  41. );
  42. }
  43. return (
  44. <>
  45. <div className="top-of-table-contents d-flex align-items-end pb-1">
  46. <button type="button" className="bg-transparent border-0" onClick={() => openPageAccessoriesModal('pageList')}>
  47. <PageListIcon />
  48. </button>
  49. <button type="button" className="bg-transparent border-0 active" onClick={() => openPageAccessoriesModal('timeLine')}>
  50. <TimeLineIcon />
  51. </button>
  52. <button type="button" className="bg-transparent border-0" onClick={() => openPageAccessoriesModal('recentChanges')}>
  53. <RecentChangesIcon />
  54. </button>
  55. <button type="button" className="bg-transparent border-0" onClick={() => openPageAccessoriesModal('attachment')}>
  56. <AttachmentIcon />
  57. </button>
  58. {/* [TODO: setting Footprints' icon by GW-3308] */}
  59. <div
  60. id="seen-user-list"
  61. data-user-ids-str="{{ page.seenUsers|slice(-15)|default([])|reverse|join(',') }}"
  62. data-sum-of-seen-users="{{ page.seenUsers.length|default(0) }}"
  63. >
  64. </div>
  65. </div>
  66. {renderModal()}
  67. </>
  68. );
  69. };
  70. /**
  71. * Wrapper component for using unstated
  72. */
  73. const TopOfTableContentsWrapper = withUnstatedContainers(TopOfTableContents, [PageContainer]);
  74. TopOfTableContents.propTypes = {
  75. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  76. };
  77. export default withTranslation()(TopOfTableContentsWrapper);