TopOfTableContents.jsx 2.8 KB

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