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 (
<>
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) => (
-