// 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 fullConfigAtom: jotai.PrimitiveAtom; // driven from WOS, settings -- updated via WebSocket settingsAtom: jotai.Atom; // derrived from fullConfig tabAtom: jotai.Atom; // driven from WOS activeTabId: jotai.Atom; // derrived from windowDataAtom isFullScreen: jotai.PrimitiveAtom; controlShiftDelayAtom: jotai.PrimitiveAtom; prefersReducedMotionAtom: jotai.Atom; updaterStatusAtom: jotai.PrimitiveAtom; typeAheadModalAtom: jotai.PrimitiveAtom; modalOpen: jotai.PrimitiveAtom; allConnStatus: jotai.Atom; flashErrors: jotai.PrimitiveAtom; }; type WritableWaveObjectAtom = jotai.WritableAtom; type ThrottledValueAtom = jotai.WritableAtom], void>; type AtomWithThrottle = { currentValueAtom: jotai.Atom; throttledValueAtom: ThrottledValueAtom; }; type DebouncedValueAtom = jotai.WritableAtom], void>; type AtomWithDebounce = { currentValueAtom: jotai.Atom; debouncedValueAtom: DebouncedValueAtom; }; type SplitAtom = Atom[]>; type WritableSplitAtom = WritableAtom[], [SplitAtomAction], void>; type TabLayoutData = { blockId: string; }; type ElectronApi = { getAuthKey(): string; getIsDev(): boolean; getCursorPoint: () => Electron.Point; getPlatform: () => NodeJS.Platform; getEnv: (varName: string) => string; getUserName: () => string; getHostName: () => string; getAboutModalDetails: () => AboutModalDetails; showContextMenu: (menu?: ElectronContextMenuItem[]) => 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; getUpdaterChannel: () => string; installAppUpdate: () => void; onMenuItemAbout: (callback: () => void) => void; updateWindowControlsOverlay: (rect: Dimensions) => void; onReinjectKey: (callback: (waveEvent: WaveKeyboardEvent) => void) => void; setWebviewFocus: (focusedId: number) => void; // focusedId si the getWebContentsId of the webview registerGlobalWebviewKeys: (keys: string[]) => void; onControlShiftStateUpdate: (callback: (state: boolean) => void) => 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: "keydown" | "keyup" | "keypress" | "unknown"; /** * 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 = IconButtonDecl | HeaderText | HeaderInput | HeaderDiv | HeaderTextButton | ConnectionButton; type IconButtonDecl = { elemtype: "iconbutton"; icon: string | React.ReactNode; iconColor?: string; className?: string; title?: string; click?: (e: React.MouseEvent) => void; longClick?: (e: React.MouseEvent) => void; disabled?: boolean; }; type HeaderTextButton = { elemtype: "textbutton"; text: string; className?: string; onClick?: (e: React.MouseEvent) => void; }; type HeaderText = { elemtype: "text"; text: string; ref?: React.MutableRefObject; className?: string; onClick?: () => void; }; 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; onClick?: (e: React.MouseEvent) => void; }; type ConnectionButton = { elemtype: "connectionbutton"; icon: string; text: string; iconColor: string; onClick?: (e: React.MouseEvent) => void; connected: boolean; }; interface ViewModel { viewType: string; viewIcon?: jotai.Atom; viewName?: jotai.Atom; viewText?: jotai.Atom; preIconButton?: jotai.Atom; endIconButtons?: jotai.Atom; blockBg?: jotai.Atom; manageConnection?: jotai.Atom; onBack?: () => void; onForward?: () => void; onSearchChange?: (text: string) => void; onSearch?: (text: string) => void; getSettingsMenuItems?: () => ContextMenuItem[]; giveFocus?: () => boolean; keyDownHandler?: (e: WaveKeyboardEvent) => 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 }; interface Dimensions { width: number; height: number; left: number; top: number; } type TypeAheadModalType = { [key: string]: boolean }; interface AboutModalDetails { version: string; buildTime: number; } type BlockComponentModel = { openSwitchConnection?: () => void; viewModel: ViewModel; }; type ConnStatusType = "connected" | "connecting" | "disconnected" | "error" | "init"; interface SuggestionBaseItem { label: string; value: string; icon?: string | React.ReactNode; } interface SuggestionConnectionItem extends SuggestionBaseItem { status: ConnStatusType; iconColor: string; onSelect?: (_: string) => void; } interface SuggestionConnectionScope { headerText?: string; items: SuggestionConnectionItem[]; } type SuggestionsType = SuggestionConnectionItem | SuggestionConnectionScope; type MarkdownResolveOpts = { connName: string; baseDir: string; }; type FlashErrorType = { id: string; icon: string; title: string; message: string; expiration: number; }; interface AbstractWshClient { recvRpcMessage(msg: RpcMessage): void; } type ClientRpcEntry = { reqId: string; startTs: number; command: string; msgFn: (msg: RpcMessage) => void; }; } export {};