nav: Add NavItem literal type.

Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
Anders Kaseorg
2021-04-01 18:32:09 -07:00
parent 8ec9a98c86
commit eeade47eb6
3 changed files with 26 additions and 21 deletions

View File

@@ -13,6 +13,7 @@ import FunctionalTab from "./components/functional-tab";
import ServerTab from "./components/server-tab";
import WebView from "./components/webview";
import {feedbackHolder} from "./feedback";
import type {NavItem} from "./pages/preference/nav";
import * as DomainUtil from "./utils/domain-util";
import * as LinkUtil from "./utils/link-util";
import ReconnectUtil from "./utils/reconnect-util";
@@ -612,7 +613,7 @@ class ServerManagerView {
this.activateTab(this.functionalTabs.get(tabProps.name));
}
async openSettings(nav = "General"): Promise<void> {
async openSettings(nav: NavItem = "General"): Promise<void> {
this.openFunctionalTab({
name: "Settings",
materialIcon: "settings",
@@ -971,12 +972,9 @@ class ServerManagerView {
this.openNetworkTroubleshooting(index);
});
ipcRenderer.on(
"open-settings",
async (event: Event, settingNav: string) => {
await this.openSettings(settingNav);
},
);
ipcRenderer.on("open-settings", async () => {
await this.openSettings();
});
ipcRenderer.on("open-about", this.openAbout.bind(this));

View File

@@ -3,14 +3,21 @@ import {html} from "../../../../common/html";
import * as t from "../../../../common/translation-util";
import BaseComponent from "../../components/base";
export type NavItem =
| "General"
| "Network"
| "AddServer"
| "Organizations"
| "Shortcuts";
interface PreferenceNavProps {
$root: Element;
onItemSelected: (navItem: string) => void;
onItemSelected: (navItem: NavItem) => void;
}
export default class PreferenceNav extends BaseComponent {
props: PreferenceNavProps;
navItems: string[];
navItems: NavItem[];
$el: Element;
constructor(props: PreferenceNavProps) {
super();
@@ -57,7 +64,7 @@ export default class PreferenceNav extends BaseComponent {
}
}
select(navItemToSelect: string): void {
select(navItemToSelect: NavItem): void {
for (const navItem of this.navItems) {
if (navItem === navItemToSelect) {
this.activate(navItem);
@@ -67,12 +74,12 @@ export default class PreferenceNav extends BaseComponent {
}
}
activate(navItem: string): void {
activate(navItem: NavItem): void {
const $item = document.querySelector(`#nav-${CSS.escape(navItem)}`);
$item.classList.add("active");
}
deactivate(navItem: string): void {
deactivate(navItem: NavItem): void {
const $item = document.querySelector(`#nav-${CSS.escape(navItem)}`);
$item.classList.remove("active");
}

View File

@@ -6,6 +6,7 @@ import BaseComponent from "../../components/base";
import ConnectedOrgSection from "./connected-org-section";
import GeneralSection from "./general-section";
import Nav from "./nav";
import type {NavItem} from "./nav";
import NetworkSection from "./network-section";
import ServersSection from "./servers-section";
import ShortcutsSection from "./shortcuts-section";
@@ -39,16 +40,15 @@ export default class PreferenceView extends BaseComponent {
}
setDefaultView(): void {
let nav = "General";
const hasTag = window.location.hash;
if (hasTag) {
nav = hasTag.slice(1);
}
const navItem =
this.nav.navItems.find(
(navItem) => window.location.hash === `#${navItem}`,
) ?? "General";
this.handleNavigation(nav);
this.handleNavigation(navItem);
}
handleNavigation(navItem: string): void {
handleNavigation(navItem: NavItem): void {
this.nav.select(navItem);
switch (navItem) {
case "AddServer": {
@@ -87,7 +87,7 @@ export default class PreferenceView extends BaseComponent {
}
default:
break;
((n: never) => n)(navItem);
}
this.section.init();
@@ -104,7 +104,7 @@ export default class PreferenceView extends BaseComponent {
}
registerIpcs(): void {
ipcRenderer.on("switch-settings-nav", (_event: Event, navItem: string) => {
ipcRenderer.on("switch-settings-nav", (_event: Event, navItem: NavItem) => {
this.handleNavigation(navItem);
});