import { MorphFeature } from 'morphux'; import { Main } from './main'; export type Tabs = 'dashboard' | 'calibration' | 'cameralogs' | 'unitylogs'; export class TabController { private _Main: Main; container: HTMLDivElement = document.querySelector('.ntsh_tabs'); currentTabId: Tabs; constructor(main: Main) { this._Main = main; this.registerNavigationListener(); } private tabListeners: Map void> = new Map(); registerListener(tabId: Tabs, callback: (visible: boolean) => void) { if (this.tabListeners.has(tabId)) throw new Error( `Listener for tab id ${tabId} has already been registered!` ); this.tabListeners.set(tabId, callback); callback(this.currentTabId == tabId); } async showTab(tabId: Tabs) { if (this.currentTabId == tabId) return; if ( tabId !== 'dashboard' && !document.body.classList.contains('ntsh_service') ) { const confirmed = await MorphFeature.Confirm({ title: 'Service Mode Required', message: `You need to be in service mode to access tab ${tabId}, switch to Service Mode now?`, }); if (!confirmed) return this.showTab('dashboard'); const succeed = await this._Main.MenuBar.toggleServiceMode(true); if (!succeed) return this.showTab('dashboard'); } this._Main.MenuBar.menubar.setSelected(tabId); if (this.tabListeners.has(this.currentTabId)) this.tabListeners.get(this.currentTabId)(false); if (this.tabListeners.has(tabId)) this.tabListeners.get(tabId)(true); this.currentTabId = tabId; this.container .querySelectorAll('.ntsh_tab') .forEach((tab) => tab.classList.remove('ntsh_tab-visible')); this.container .querySelector(`.ntsh_tab[tabid="${tabId}"]`) .classList.add('ntsh_tab-visible'); window.history.pushState( { tab: tabId }, '', `/${tabId}${window.location.search}` ); var tabName = { dashboard: 'Dashboard', calibration: 'Calibration', cameralogs: 'Camera Logs', unitylogs: 'Unity Logs', }[tabId]; document.title = `NTSH Control - ${tabName}`; } private registerNavigationListener() { window.addEventListener('popstate', (event) => { const state = event.state; if (state && state.tab) this.showTab(state.tab); }); var startTab = window.location.pathname .replace('/', '') .split('/') .shift() as Tabs; this.showTab(startTab.length > 0 ? startTab : 'dashboard'); } }