From 9dd7d7f84528b1a7dee1e0fa10dcd7058b0ecc4d Mon Sep 17 00:00:00 2001 From: nick-delirium Date: Mon, 26 Jun 2023 13:14:47 +0200 Subject: [PATCH] fix(ui): truncate session tabs when over 10 --- .../Player/LivePlayer/LivePlayerSubHeader.tsx | 10 +- .../Player/SharedComponents/SessionTabs.tsx | 92 +++++++++++++++++++ frontend/app/components/Session_/Subheader.js | 15 +-- 3 files changed, 98 insertions(+), 19 deletions(-) create mode 100644 frontend/app/components/Session/Player/SharedComponents/SessionTabs.tsx diff --git a/frontend/app/components/Session/Player/LivePlayer/LivePlayerSubHeader.tsx b/frontend/app/components/Session/Player/LivePlayer/LivePlayerSubHeader.tsx index fed51c4b7..175bd3e74 100644 --- a/frontend/app/components/Session/Player/LivePlayer/LivePlayerSubHeader.tsx +++ b/frontend/app/components/Session/Player/LivePlayer/LivePlayerSubHeader.tsx @@ -2,11 +2,11 @@ import React from 'react'; import { Icon, Tooltip } from 'UI'; import { PlayerContext } from 'App/components/Session/playerContext'; import { observer } from 'mobx-react-lite'; -import Tab from 'Components/Session/Player/SharedComponents/Tab'; +import SessionTabs from 'Components/Session/Player/SharedComponents/SessionTabs'; function SubHeader() { const { store } = React.useContext(PlayerContext); - const { currentTab, tabs = new Set('back-compat'), location: currentLocation = 'loading...' } = store.get(); + const { location: currentLocation = 'loading...' } = store.get(); const location = currentLocation.length > 70 ? `${currentLocation.slice(0, 70)}...` @@ -15,11 +15,7 @@ function SubHeader() { return ( <>
- {Array.from(tabs).map((tab, i) => ( - - - - ))} +
{location && (
diff --git a/frontend/app/components/Session/Player/SharedComponents/SessionTabs.tsx b/frontend/app/components/Session/Player/SharedComponents/SessionTabs.tsx new file mode 100644 index 000000000..7d99cf0a3 --- /dev/null +++ b/frontend/app/components/Session/Player/SharedComponents/SessionTabs.tsx @@ -0,0 +1,92 @@ +import React from 'react'; +import cn from 'classnames'; +import Tab from './Tab'; +import { PlayerContext } from 'Components/Session/playerContext'; +import { useModal } from 'Components/Modal'; + +interface Props { + tabs: { tab: string, idx: number}[]; + currentTab: string; + changeTab: (tab: string) => void; + hideModal: () => void; +} + +function Modal({ tabs, currentTab, changeTab, hideModal }: Props) { + return ( +
+
{tabs.length} Tabs
+ {tabs.map((tab, i) => ( +
{ + changeTab(tab.tab); + hideModal(); + }} + className={cn( + currentTab === tab.tab ? 'font-semibold ' : 'text-disabled-text', + 'cursor-pointer border-b p-4 hover:bg-active-blue' + )} + > + Tab {i + 1} +
+ ))} +
+ ); +} + +function SessionTabs() { + const { showModal, hideModal } = useModal(); + const { player, store } = React.useContext(PlayerContext); + const { tabs = new Set('back-compat'), currentTab } = store.get(); + const tabsArr = Array.from(tabs).map((tab, idx) => ({ tab, idx })); + const shouldTruncate = tabsArr.length > 10; + const actualTabs = shouldTruncate ? tabsArr.slice(0, 10) : tabsArr; + + const shownTabs = actualTabs.findIndex(el => el.tab === currentTab) !== -1 + ? actualTabs + : actualTabs.concat({ tab: currentTab, idx: tabsArr.findIndex(tEl => tEl.tab === currentTab) }); + const changeTab = (tab: string) => { + player.changeTab(tab); + }; + + const openModal = () => { + showModal( + , + { + right: true, + } + ); + }; + return ( + <> + {shownTabs.map((tab, i) => ( + + + + ))} + {shouldTruncate ? ( + <> + {tabsArr.length > 11 ? ( +
+ +{tabsArr.length - 11} More +
+ ) : null} + + ) : null} + + ); +} + +export default SessionTabs; diff --git a/frontend/app/components/Session_/Subheader.js b/frontend/app/components/Session_/Subheader.js index 7fa22a2f7..5f712f4f0 100644 --- a/frontend/app/components/Session_/Subheader.js +++ b/frontend/app/components/Session_/Subheader.js @@ -12,7 +12,7 @@ import { PlayerContext } from 'App/components/Session/playerContext'; import { observer } from 'mobx-react-lite'; import AutoplayToggle from 'Shared/AutoplayToggle'; import { connect } from 'react-redux'; -import Tab from 'Components/Session/Player/SharedComponents/Tab'; +import SessionTabs from 'Components/Session/Player/SharedComponents/SessionTabs' const localhostWarn = (project) => project + '_localhost_warn'; @@ -21,7 +21,7 @@ function SubHeader(props) { const defaultLocalhostWarn = localStorage.getItem(localhostWarnKey) !== '1'; const [showWarningModal, setWarning] = React.useState(defaultLocalhostWarn); const { player, store } = React.useContext(PlayerContext); - const { width, height, endTime, location: currentLocation = 'loading...', tabs = new Set('back-compat'), currentTab } = store.get(); + const { width, height, endTime, location: currentLocation = 'loading...', } = store.get(); const enabledIntegration = useMemo(() => { const { integrations } = props; @@ -101,16 +101,7 @@ function SubHeader(props) {
) : null} - {Array.from(tabs).map((tab, i) => ( - - player.changeTab(changeTo)} - /> - - ))} +