| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import {getRequiredElement} from 'chrome://resources/js/util.js'; |
| |
| export class Page { |
| pageName: string; |
| visible: boolean; |
| constructor(pageName: string) { |
| this.pageName = pageName; |
| this.visible = false; |
| } |
| |
| showPage() { |
| this.visible = true; |
| getRequiredElement(this.pageName).hidden = false; |
| } |
| |
| hidePage() { |
| this.visible = false; |
| getRequiredElement(this.pageName).hidden = true; |
| } |
| } |
| |
| export class PageNavigator { |
| storedPages: Map<string, Page>; |
| activePage: Page|null; |
| constructor() { |
| this.storedPages = new Map(); |
| this.activePage = null; |
| } |
| |
| addPage(page: Page) { |
| this.storedPages.set(page.pageName, page); |
| } |
| |
| showPage(pageName: string) { |
| if (this.storedPages.has(pageName)) { |
| const page: Page = this.storedPages.get(pageName) as Page; |
| if (pageName !== this.activePage?.pageName) { |
| page.showPage(); |
| history.pushState({}, '', ('#' + page.pageName)); |
| this.activePage?.hidePage(); |
| this.activePage = page; |
| } |
| } |
| } |
| |
| static getInstance() { |
| if (instance === null) { |
| instance = new PageNavigator(); |
| } |
| return instance; |
| } |
| } |
| |
| let instance: PageNavigator|null = null; |