diff --git a/app/common/dnd-util.ts b/app/common/dnd-util.ts index 58fd849b..f563f76b 100644 --- a/app/common/dnd-util.ts +++ b/app/common/dnd-util.ts @@ -13,10 +13,10 @@ export type DndSettings = { type SettingName = keyof DndSettings; -interface Toggle { +type Toggle = { dnd: boolean; newSettings: Partial; -} +}; export function toggle(): Toggle { const dnd = !ConfigUtil.getConfigItem("dnd", false); diff --git a/app/common/logger-util.ts b/app/common/logger-util.ts index 27f638f4..9b35d388 100644 --- a/app/common/logger-util.ts +++ b/app/common/logger-util.ts @@ -6,9 +6,9 @@ import process from "node:process"; import {initSetUp} from "./default-util"; import {app} from "./remote"; -interface LoggerOptions { +type LoggerOptions = { file?: string; -} +}; initSetUp(); diff --git a/app/common/messages.ts b/app/common/messages.ts index 1287ea7d..545b0991 100644 --- a/app/common/messages.ts +++ b/app/common/messages.ts @@ -1,7 +1,7 @@ -interface DialogBoxError { +type DialogBoxError = { title: string; content: string; -} +}; export function invalidZulipServerError(domain: string): string { return `${domain} does not appear to be a valid Zulip server. Make sure that diff --git a/app/common/typed-ipc.ts b/app/common/typed-ipc.ts index 329ec126..9e3fab1e 100644 --- a/app/common/typed-ipc.ts +++ b/app/common/typed-ipc.ts @@ -1,7 +1,7 @@ import type {DndSettings} from "./dnd-util"; import type {MenuProps, ServerConf} from "./types"; -export interface MainMessage { +export type MainMessage = { "clear-app-settings": () => void; "configure-spell-checker": () => void; "fetch-user-agent": () => string; @@ -22,15 +22,15 @@ export interface MainMessage { "update-badge": (messageCount: number) => void; "update-menu": (props: MenuProps) => void; "update-taskbar-icon": (data: string, text: string) => void; -} +}; -export interface MainCall { +export type MainCall = { "get-server-settings": (domain: string) => ServerConf; "is-online": (url: string) => boolean; "save-server-icon": (iconURL: string) => string; -} +}; -export interface RendererMessage { +export type RendererMessage = { back: () => void; "copy-zulip-url": () => void; destroytray: () => void; @@ -79,4 +79,4 @@ export interface RendererMessage { zoomActualSize: () => void; zoomIn: () => void; zoomOut: () => void; -} +}; diff --git a/app/common/types.ts b/app/common/types.ts index 8c0d5a49..35df103d 100644 --- a/app/common/types.ts +++ b/app/common/types.ts @@ -1,8 +1,8 @@ -export interface MenuProps { +export type MenuProps = { tabs: TabData[]; activeTabIndex?: number; enableMenu?: boolean; -} +}; export type NavItem = | "General" @@ -11,16 +11,16 @@ export type NavItem = | "Organizations" | "Shortcuts"; -export interface ServerConf { +export type ServerConf = { url: string; alias: string; icon: string; -} +}; export type TabRole = "server" | "function"; -export interface TabData { +export type TabData = { role: TabRole; name: string; index: number; -} +}; diff --git a/app/renderer/js/clipboard-decrypter.ts b/app/renderer/js/clipboard-decrypter.ts index 141e456d..f0166d58 100644 --- a/app/renderer/js/clipboard-decrypter.ts +++ b/app/renderer/js/clipboard-decrypter.ts @@ -16,11 +16,11 @@ import crypto from "node:crypto"; // don’t leak anything from the user’s clipboard other than the token // intended for us. -export interface ClipboardDecrypter { +export type ClipboardDecrypter = { version: number; key: Uint8Array; pasted: Promise; -} +}; export class ClipboardDecrypterImpl implements ClipboardDecrypter { version: number; diff --git a/app/renderer/js/components/functional-tab.ts b/app/renderer/js/components/functional-tab.ts index c67964c2..0c22468a 100644 --- a/app/renderer/js/components/functional-tab.ts +++ b/app/renderer/js/components/functional-tab.ts @@ -5,9 +5,9 @@ import {generateNodeFromHtml} from "./base"; import type {TabProps} from "./tab"; import Tab from "./tab"; -export interface FunctionalTabProps extends TabProps { +export type FunctionalTabProps = { $view: Element; -} +} & TabProps; export default class FunctionalTab extends Tab { $view: Element; diff --git a/app/renderer/js/components/server-tab.ts b/app/renderer/js/components/server-tab.ts index 8a3d170b..b5ffdcef 100644 --- a/app/renderer/js/components/server-tab.ts +++ b/app/renderer/js/components/server-tab.ts @@ -9,9 +9,9 @@ import type {TabProps} from "./tab"; import Tab from "./tab"; import type WebView from "./webview"; -export interface ServerTabProps extends TabProps { +export type ServerTabProps = { webview: Promise; -} +} & TabProps; export default class ServerTab extends Tab { webview: Promise; diff --git a/app/renderer/js/components/tab.ts b/app/renderer/js/components/tab.ts index dc0bcfab..72d4cc75 100644 --- a/app/renderer/js/components/tab.ts +++ b/app/renderer/js/components/tab.ts @@ -1,6 +1,6 @@ import type {TabRole} from "../../../common/types"; -export interface TabProps { +export type TabProps = { role: TabRole; icon?: string; name: string; @@ -12,7 +12,7 @@ export interface TabProps { onHoverOut?: () => void; materialIcon?: string; onDestroy?: () => void; -} +}; export default abstract class Tab { abstract $el: Element; diff --git a/app/renderer/js/components/webview.ts b/app/renderer/js/components/webview.ts index 8e574a93..5cc6dbd3 100644 --- a/app/renderer/js/components/webview.ts +++ b/app/renderer/js/components/webview.ts @@ -19,7 +19,7 @@ import {contextMenu} from "./context-menu"; const shouldSilentWebview = ConfigUtil.getConfigItem("silent", false); -interface WebViewProps { +type WebViewProps = { $root: Element; rootWebContents: WebContents; index: number; @@ -32,7 +32,7 @@ interface WebViewProps { preload?: string; onTitleChange: () => void; hasPermission?: (origin: string, permission: string) => boolean; -} +}; export default class WebView { static templateHtml(props: WebViewProps): Html { diff --git a/app/renderer/js/electron-bridge.ts b/app/renderer/js/electron-bridge.ts index 6635bec7..4dc70c4c 100644 --- a/app/renderer/js/electron-bridge.ts +++ b/app/renderer/js/electron-bridge.ts @@ -8,7 +8,7 @@ import {ipcRenderer} from "./typed-ipc-renderer"; type ListenerType = (...args: any[]) => void; -export interface ElectronBridge { +export type ElectronBridge = { send_event: (eventName: string | symbol, ...args: unknown[]) => boolean; on_event: (eventName: string, listener: ListenerType) => void; new_notification: ( @@ -21,7 +21,7 @@ export interface ElectronBridge { get_send_notification_reply_message_supported: () => boolean; set_send_notification_reply_message_supported: (value: boolean) => void; decrypt_clipboard: (version: number) => ClipboardDecrypter; -} +}; let notificationReplySupported = false; // Indicates if the user is idle or not diff --git a/app/renderer/js/injected.ts b/app/renderer/js/injected.ts index 0a9c95cf..a2a4c9fd 100644 --- a/app/renderer/js/injected.ts +++ b/app/renderer/js/injected.ts @@ -2,11 +2,11 @@ type ElectronBridge = import("./electron-bridge").ElectronBridge; -interface CompatElectronBridge extends ElectronBridge { +type CompatElectronBridge = { readonly idle_on_system: boolean; readonly last_active_on_system: number; send_notification_reply_message_supported: boolean; -} +} & ElectronBridge; (() => { const zulipWindow = window as typeof window & { diff --git a/app/renderer/js/notification/index.ts b/app/renderer/js/notification/index.ts index 77379490..0a92aa11 100644 --- a/app/renderer/js/notification/index.ts +++ b/app/renderer/js/notification/index.ts @@ -1,6 +1,6 @@ import {ipcRenderer} from "../typed-ipc-renderer"; -export interface NotificationData { +export type NotificationData = { close: () => void; title: string; dir: NotificationDirection; @@ -9,7 +9,7 @@ export interface NotificationData { tag: string; icon: string; data: unknown; -} +}; export function newNotification( title: string, diff --git a/app/renderer/js/pages/preference/base-section.ts b/app/renderer/js/pages/preference/base-section.ts index 84bfd2fe..4b286418 100644 --- a/app/renderer/js/pages/preference/base-section.ts +++ b/app/renderer/js/pages/preference/base-section.ts @@ -3,12 +3,12 @@ import {html} from "../../../../common/html"; import {generateNodeFromHtml} from "../../components/base"; import {ipcRenderer} from "../../typed-ipc-renderer"; -interface BaseSectionProps { +type BaseSectionProps = { $element: HTMLElement; disabled?: boolean; value: boolean; clickHandler: () => void; -} +}; export function generateSettingOption(props: BaseSectionProps): void { const {$element, disabled, value, clickHandler} = props; diff --git a/app/renderer/js/pages/preference/connected-org-section.ts b/app/renderer/js/pages/preference/connected-org-section.ts index 1fe5bb2a..aa6d7b5e 100644 --- a/app/renderer/js/pages/preference/connected-org-section.ts +++ b/app/renderer/js/pages/preference/connected-org-section.ts @@ -7,9 +7,9 @@ import {reloadApp} from "./base-section"; import {initFindAccounts} from "./find-accounts"; import {initServerInfoForm} from "./server-info-form"; -interface ConnectedOrgSectionProps { +type ConnectedOrgSectionProps = { $root: Element; -} +}; export function initConnectedOrgSection({ $root, diff --git a/app/renderer/js/pages/preference/find-accounts.ts b/app/renderer/js/pages/preference/find-accounts.ts index b09882f3..407a46e9 100644 --- a/app/renderer/js/pages/preference/find-accounts.ts +++ b/app/renderer/js/pages/preference/find-accounts.ts @@ -3,9 +3,9 @@ import * as LinkUtil from "../../../../common/link-util"; import * as t from "../../../../common/translation-util"; import {generateNodeFromHtml} from "../../components/base"; -interface FindAccountsProps { +type FindAccountsProps = { $root: Element; -} +}; async function findAccounts(url: string): Promise { if (!url) { diff --git a/app/renderer/js/pages/preference/general-section.ts b/app/renderer/js/pages/preference/general-section.ts index 72d4f10e..330c2add 100644 --- a/app/renderer/js/pages/preference/general-section.ts +++ b/app/renderer/js/pages/preference/general-section.ts @@ -20,9 +20,9 @@ import {generateSelectHtml, generateSettingOption} from "./base-section"; const currentBrowserWindow = remote.getCurrentWindow(); -interface GeneralSectionProps { +type GeneralSectionProps = { $root: Element; -} +}; export function initGeneralSection({$root}: GeneralSectionProps): void { $root.innerHTML = html` diff --git a/app/renderer/js/pages/preference/nav.ts b/app/renderer/js/pages/preference/nav.ts index 35e5378e..7ebcdc7d 100644 --- a/app/renderer/js/pages/preference/nav.ts +++ b/app/renderer/js/pages/preference/nav.ts @@ -4,10 +4,10 @@ import * as t from "../../../../common/translation-util"; import type {NavItem} from "../../../../common/types"; import {generateNodeFromHtml} from "../../components/base"; -interface PreferenceNavProps { +type PreferenceNavProps = { $root: Element; onItemSelected: (navItem: NavItem) => void; -} +}; export default class PreferenceNav { navItems: NavItem[]; diff --git a/app/renderer/js/pages/preference/network-section.ts b/app/renderer/js/pages/preference/network-section.ts index aef76b19..96816803 100644 --- a/app/renderer/js/pages/preference/network-section.ts +++ b/app/renderer/js/pages/preference/network-section.ts @@ -5,9 +5,9 @@ import {ipcRenderer} from "../../typed-ipc-renderer"; import {generateSettingOption} from "./base-section"; -interface NetworkSectionProps { +type NetworkSectionProps = { $root: Element; -} +}; export function initNetworkSection({$root}: NetworkSectionProps): void { $root.innerHTML = html` diff --git a/app/renderer/js/pages/preference/new-server-form.ts b/app/renderer/js/pages/preference/new-server-form.ts index 2d7fe4db..bf894513 100644 --- a/app/renderer/js/pages/preference/new-server-form.ts +++ b/app/renderer/js/pages/preference/new-server-form.ts @@ -7,10 +7,10 @@ import {generateNodeFromHtml} from "../../components/base"; import {ipcRenderer} from "../../typed-ipc-renderer"; import * as DomainUtil from "../../utils/domain-util"; -interface NewServerFormProps { +type NewServerFormProps = { $root: Element; onChange: () => void; -} +}; export function initNewServerForm({$root, onChange}: NewServerFormProps): void { const $newServerForm = generateNodeFromHtml(html` diff --git a/app/renderer/js/pages/preference/server-info-form.ts b/app/renderer/js/pages/preference/server-info-form.ts index 7f4e71b8..06d5de48 100644 --- a/app/renderer/js/pages/preference/server-info-form.ts +++ b/app/renderer/js/pages/preference/server-info-form.ts @@ -8,12 +8,12 @@ import {generateNodeFromHtml} from "../../components/base"; import {ipcRenderer} from "../../typed-ipc-renderer"; import * as DomainUtil from "../../utils/domain-util"; -interface ServerInfoFormProps { +type ServerInfoFormProps = { $root: Element; server: ServerConf; index: number; onChange: () => void; -} +}; export function initServerInfoForm(props: ServerInfoFormProps): void { const $serverInfoForm = generateNodeFromHtml(html` diff --git a/app/renderer/js/pages/preference/servers-section.ts b/app/renderer/js/pages/preference/servers-section.ts index 2b2823a2..bd4875b9 100644 --- a/app/renderer/js/pages/preference/servers-section.ts +++ b/app/renderer/js/pages/preference/servers-section.ts @@ -4,9 +4,9 @@ import * as t from "../../../../common/translation-util"; import {reloadApp} from "./base-section"; import {initNewServerForm} from "./new-server-form"; -interface ServersSectionProps { +type ServersSectionProps = { $root: Element; -} +}; export function initServersSection({$root}: ServersSectionProps): void { $root.innerHTML = html` diff --git a/app/renderer/js/pages/preference/shortcuts-section.ts b/app/renderer/js/pages/preference/shortcuts-section.ts index 8030e78e..f11c01d6 100644 --- a/app/renderer/js/pages/preference/shortcuts-section.ts +++ b/app/renderer/js/pages/preference/shortcuts-section.ts @@ -4,9 +4,9 @@ import {html} from "../../../../common/html"; import * as LinkUtil from "../../../../common/link-util"; import * as t from "../../../../common/translation-util"; -interface ShortcutsSectionProps { +type ShortcutsSectionProps = { $root: Element; -} +}; // eslint-disable-next-line complexity export function initShortcutsSection({$root}: ShortcutsSectionProps): void {