48 lines
1.3 KiB
JavaScript
48 lines
1.3 KiB
JavaScript
// Hash Router - Makes tabs bookmarkable and shareable
|
|
// URL format: #dashboard, #demo, #sensing, etc.
|
|
|
|
export class Router {
|
|
constructor(app) {
|
|
this.app = app;
|
|
this.validTabs = ['dashboard', 'hardware', 'demo', 'architecture', 'performance', 'applications', 'sensing', 'training'];
|
|
}
|
|
|
|
init() {
|
|
// Navigate to hash on load
|
|
this.onHashChange();
|
|
|
|
// Listen for hash changes (back/forward navigation)
|
|
window.addEventListener('hashchange', () => this.onHashChange());
|
|
|
|
// Update hash when tab changes
|
|
const tabManager = this.app?.getComponent?.('tabManager');
|
|
if (tabManager) {
|
|
tabManager.onTabChange((tabId) => {
|
|
this.setHash(tabId);
|
|
});
|
|
}
|
|
}
|
|
|
|
onHashChange() {
|
|
const hash = window.location.hash.replace('#', '').toLowerCase();
|
|
if (hash && this.validTabs.includes(hash)) {
|
|
const tabManager = this.app?.getComponent?.('tabManager');
|
|
if (tabManager && tabManager.getActiveTab() !== hash) {
|
|
tabManager.switchToTab(hash);
|
|
}
|
|
}
|
|
}
|
|
|
|
setHash(tabId) {
|
|
// Only update if different to avoid infinite loop
|
|
const current = window.location.hash.replace('#', '');
|
|
if (current !== tabId) {
|
|
history.replaceState(null, '', `#${tabId}`);
|
|
}
|
|
}
|
|
|
|
dispose() {
|
|
// No explicit cleanup needed - event listeners are on window
|
|
}
|
|
}
|