// Copyright 2024, Command Line Inc. // SPDX-License-Identifier: Apache-2.0 import type * as jotai from "jotai"; import type * as rxjs from "rxjs"; declare global { type GlobalAtomsType = { windowId: jotai.Atom; // readonly clientId: jotai.Atom; // readonly client: jotai.Atom; // driven from WOS uiContext: jotai.Atom; // driven from windowId, activetabid, etc. waveWindow: jotai.Atom; // driven from WOS workspace: jotai.Atom; // driven from WOS settingsConfigAtom: jotai.PrimitiveAtom; // driven from WOS, settings -- updated via WebSocket tabAtom: jotai.Atom; // driven from WOS activeTabId: jotai.Atom; // derrived from windowDataAtom isFullScreen: jotai.PrimitiveAtom; cmdShiftDelayAtom: jotai.PrimitiveAtom; updaterStatusAtom: jotai.PrimitiveAtom; }; type TabLayoutData = { blockId: string; }; type Bounds = { x: number; y: number; width: number; height: number; }; type ElectronApi = { getIsDev(): boolean; getCursorPoint: () => Electron.Point; getPlatform: () => NodeJS.Platform; getEnv: (varName: string) => string; showContextMenu: (menu: ElectronContextMenuItem[], position: { x: number; y: number }) => void; onContextMenuClick: (callback: (id: string) => void) => void; onNavigate: (callback: (url: string) => void) => void; onIframeNavigate: (callback: (url: string) => void) => void; downloadFile: (path: string) => void; openExternal: (url: string) => void; onFullScreenChange: (callback: (isFullScreen: boolean) => void) => void; onUpdaterStatusChange: (callback: (status: UpdaterStatus) => void) => void; getUpdaterStatus: () => UpdaterStatus; installAppUpdate: () => void; }; type ElectronContextMenuItem = { id: string; // unique id, used for communication label: string; role?: string; // electron role (optional) type?: "separator" | "normal" | "submenu"; submenu?: ElectronContextMenuItem[]; }; type ContextMenuItem = { label?: string; type?: "separator" | "normal" | "submenu"; role?: string; // electron role (optional) click?: () => void; // not required if role is set submenu?: ContextMenuItem[]; }; type KeyPressDecl = { mods: { Cmd?: boolean; Option?: boolean; Shift?: boolean; Ctrl?: boolean; Alt?: boolean; Meta?: boolean; }; key: string; keyType: string; }; interface WaveKeyboardEvent { type: string; /** * Equivalent to KeyboardEvent.key. */ key: string; /** * Equivalent to KeyboardEvent.code. */ code: string; /** * Equivalent to KeyboardEvent.shiftKey. */ shift: boolean; /** * Equivalent to KeyboardEvent.controlKey. */ control: boolean; /** * Equivalent to KeyboardEvent.altKey. */ alt: boolean; /** * Equivalent to KeyboardEvent.metaKey. */ meta: boolean; /** * cmd is special, on mac it is meta, on windows it is alt */ cmd: boolean; /** * option is special, on mac it is alt, on windows it is meta */ option: boolean; repeat: boolean; /** * Equivalent to KeyboardEvent.location. */ location: number; } type SubjectWithRef = rxjs.Subject & { refCount: number; release: () => void }; type HeaderElem = HeaderIconButton | HeaderText | HeaderInput | HeaderDiv | HeaderTextButton; type HeaderIconButton = { elemtype: "iconbutton"; icon: string | React.ReactNode; className?: string; title?: string; click?: (e: React.MouseEvent) => void; longClick?: (e: React.MouseEvent) => void; }; type HeaderTextButton = { elemtype: "textbutton"; text: string; className?: string; onClick?: (e: React.MouseEvent) => void; }; type HeaderText = { elemtype: "text"; text: string; }; type HeaderInput = { elemtype: "input"; value: string; className?: string; isDisabled?: boolean; ref?: React.MutableRefObject; onChange?: (e: React.ChangeEvent) => void; onKeyDown?: (e: React.KeyboardEvent) => void; onFocus?: (e: React.FocusEvent) => void; onBlur?: (e: React.FocusEvent) => void; }; type HeaderDiv = { elemtype: "div"; className?: string; children: HeaderElem[]; onMouseOver?: (e: React.MouseEvent) => void; onMouseOut?: (e: React.MouseEvent) => void; }; interface ViewModel { viewIcon?: jotai.Atom; viewName?: jotai.Atom; viewText?: jotai.Atom; preIconButton?: jotai.Atom; endIconButtons?: jotai.Atom; blockBg?: jotai.Atom; onBack?: () => void; onForward?: () => void; onSearchChange?: (text: string) => void; onSearch?: (text: string) => void; getSettingsMenuItems?: () => ContextMenuItem[]; giveFocus?: () => boolean; } type UpdaterStatus = "up-to-date" | "checking" | "downloading" | "ready" | "error" | "installing"; // jotai doesn't export this type :/ type Loadable = { state: "loading" } | { state: "hasData"; data: T } | { state: "hasError"; error: unknown }; } export {};