CustomNavbar.jsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import React, { useEffect, useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import {
  4. Nav, NavItem, NavLink, TabContent, TabPane,
  5. } from 'reactstrap';
  6. import { withTranslation } from 'react-i18next';
  7. // import PageListIcon from './Icons/PageListIcon';
  8. // import TimeLineIcon from './Icons/TimeLineIcon';
  9. // import RecentChangesIcon from './Icons/RecentChangesIcon';
  10. // import AttachmentIcon from './Icons/AttachmentIcon';
  11. // import ShareLinkIcon from './Icons/ShareLinkIcon';
  12. import { withUnstatedContainers } from './UnstatedUtils';
  13. import PageAccessoriesContainer from '../services/PageAccessoriesContainer';
  14. import PageAttachment from './PageAttachment';
  15. import PageTimeline from './PageTimeline';
  16. import PageList from './PageList';
  17. import PageHistory from './PageHistory';
  18. import ShareLink from './ShareLink/ShareLink';
  19. const navTabMapping = {
  20. pagelist: {
  21. // icon: <PageListIcon />,
  22. i18n: 'page_list',
  23. index: 0,
  24. },
  25. timeline: {
  26. // icon: <TimeLineIcon />,
  27. i18n: 'Timeline View',
  28. index: 1,
  29. },
  30. pageHistory: {
  31. // icon: <RecentChangesIcon />,
  32. i18n: 'History',
  33. index: 2,
  34. },
  35. attachment: {
  36. // icon: <AttachmentIcon />,
  37. i18n: 'attachment_data',
  38. index: 3,
  39. },
  40. shareLink: {
  41. // icon: <ShareLinkIcon />,
  42. i18n: 'share_links.share_link_management',
  43. index: 4,
  44. },
  45. };
  46. const CustomNavbar = (props) => {
  47. const { t, pageAccessoriesContainer } = props;
  48. const { switchActiveTab } = pageAccessoriesContainer;
  49. const { activeTab } = pageAccessoriesContainer.state;
  50. const [sliderWidth, setSliderWidth] = useState(null);
  51. const [sliderMarginLeft, setSliderMarginLeft] = useState(null);
  52. // Might make this dynamic for px, %, pt, em
  53. function getPercentage(min, max) {
  54. return min / max * 100;
  55. }
  56. useEffect(() => {
  57. if (activeTab === '') {
  58. return;
  59. }
  60. const navTitle = document.getElementById('nav-title');
  61. const navTabs = document.querySelectorAll('li.nav-link');
  62. if (navTitle == null || navTabs == null) {
  63. return;
  64. }
  65. let tempML = 0;
  66. const styles = [].map.call(navTabs, (el) => {
  67. const width = getPercentage(el.offsetWidth, navTitle.offsetWidth);
  68. const marginLeft = tempML;
  69. tempML += width;
  70. return { width, marginLeft };
  71. });
  72. const { width, marginLeft } = styles[navTabMapping[activeTab].index];
  73. setSliderWidth(width);
  74. setSliderMarginLeft(marginLeft);
  75. }, [activeTab]);
  76. return (
  77. <React.Fragment>
  78. <Nav className="nav-title" id="nav-title">
  79. {Object.entries(navTabMapping).map(([key, value]) => {
  80. return (
  81. <NavItem key={key} type="button" className={`p-0 nav-link ${activeTab === key && 'active'}`}>
  82. <NavLink onClick={() => { switchActiveTab(key) }}>
  83. {/* {value.icon} */}
  84. {t(value.i18n)}
  85. </NavLink>
  86. </NavItem>
  87. );
  88. })}
  89. </Nav>
  90. <hr className="my-0 grw-nav-slide-hr border-none" style={{ width: `${sliderWidth}%`, marginLeft: `${sliderMarginLeft}%` }} />
  91. <TabContent activeTab={activeTab} className="p-5">
  92. <TabPane tabId="pagelist">
  93. {pageAccessoriesContainer.state.activeComponents.has('pagelist') && <PageList />}
  94. </TabPane>
  95. <TabPane tabId="timeline">
  96. {pageAccessoriesContainer.state.activeComponents.has('timeline') && <PageTimeline /> }
  97. </TabPane>
  98. <TabPane tabId="pageHistory">
  99. <div className="overflow-auto">
  100. {pageAccessoriesContainer.state.activeComponents.has('pageHistory') && <PageHistory /> }
  101. </div>
  102. </TabPane>
  103. <TabPane tabId="attachment">
  104. {pageAccessoriesContainer.state.activeComponents.has('attachment') && <PageAttachment />}
  105. </TabPane>
  106. <TabPane tabId="shareLink">
  107. {pageAccessoriesContainer.state.activeComponents.has('shareLink') && <ShareLink />}
  108. </TabPane>
  109. </TabContent>
  110. </React.Fragment>
  111. );
  112. };
  113. /**
  114. * Wrapper component for using unstated
  115. */
  116. const PageAccessoriesModalWrapper = withUnstatedContainers(CustomNavbar, [PageAccessoriesContainer]);
  117. CustomNavbar.propTypes = {
  118. t: PropTypes.func.isRequired, // i18next
  119. // pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  120. pageAccessoriesContainer: PropTypes.instanceOf(PageAccessoriesContainer).isRequired,
  121. i18n: PropTypes.array,
  122. index: PropTypes.array,
  123. icons: PropTypes.array,
  124. contents: PropTypes.array,
  125. };
  126. export default withTranslation()(PageAccessoriesModalWrapper);