import React, { useRef, useEffect, useCallback, } from 'react'; import PropTypes from 'prop-types'; import { Modal, ModalBody, Nav, NavItem, NavLink, TabContent, TabPane, } from 'reactstrap'; import { withTranslation } from 'react-i18next'; import PageListIcon from './Icons/PageListIcon'; import TimeLineIcon from './Icons/TimeLineIcon'; import RecentChangesIcon from './Icons/RecentChangesIcon'; import AttachmentIcon from './Icons/AttachmentIcon'; import ShareLinkIcon from './Icons/ShareLinkIcon'; import { withUnstatedContainers } from './UnstatedUtils'; import PageAccessoriesContainer from '../services/PageAccessoriesContainer'; import PageAttachment from './PageAttachment'; import PageTimeline from './PageTimeline'; import PageList from './PageList'; import PageHistory from './PageHistory'; import ShareLink from './ShareLink/ShareLink'; const navTabMapping = [ { icon: , id: 'pagelist', i18n: 'page_list', index: 0, }, { icon: , id: 'timeline', i18n: 'Timeline View', index: 1, }, { icon: , id: 'page-history', i18n: 'History', index: 2, }, { icon: , id: 'attachment', i18n: 'attachment_data', index: 3, }, { icon: , id: 'share-link', i18n: 'share_links.share_link_management', index: 4, }, ]; const PageAccessoriesModal = (props) => { const { t, pageAccessoriesContainer } = props; const { switchActiveTab } = pageAccessoriesContainer; const { activeTab } = pageAccessoriesContainer.state; const sliderEl = useRef(null); const navTitle = document.getElementById('nav-title'); const navTabs = document.querySelectorAll('li.nav-link'); function changeFlexibility(width, tempMarginLeft) { sliderEl.current.width = `${width}%`; sliderEl.current.style.marginLeft = `${tempMarginLeft}%`; } function closeModalHandler() { if (props.onClose == null) { return; } props.onClose(); } // Might make this dynamic for px, %, pt, em function getPercentage(min, max) { return min / max * 100; } const fetchSize = useCallback(() => { return [].map.call(navTabs, el => getPercentage(el.offsetWidth, navTitle.offsetWidth)); }, [navTabs, navTitle]); useEffect(() => { const array = fetchSize(); if (activeTab === '') { return; } const result = navTabMapping.find(({ id }) => id === activeTab); const { index } = result; let marginLeft = 0; for (let i = 0; i < index; i++) { marginLeft += array[i]; } changeFlexibility(array[index], marginLeft); // eslint-disable-next-line react-hooks/exhaustive-deps }, [activeTab]); return (
{pageAccessoriesContainer.state.activeComponents.has('pagelist') && } {pageAccessoriesContainer.state.activeComponents.has('timeline') && }
{pageAccessoriesContainer.state.activeComponents.has('page-history') && }
{pageAccessoriesContainer.state.activeComponents.has('attachment') && } {pageAccessoriesContainer.state.activeComponents.has('share-link') && }
); }; /** * Wrapper component for using unstated */ const PageAccessoriesModalWrapper = withUnstatedContainers(PageAccessoriesModal, [PageAccessoriesContainer]); PageAccessoriesModal.propTypes = { t: PropTypes.func.isRequired, // i18next // pageContainer: PropTypes.instanceOf(PageContainer).isRequired, pageAccessoriesContainer: PropTypes.instanceOf(PageAccessoriesContainer).isRequired, isOpen: PropTypes.bool.isRequired, onClose: PropTypes.func, }; export default withTranslation()(PageAccessoriesModalWrapper);