2024-05-14 08:45:41 +02:00
|
|
|
// Copyright 2024, Command Line Inc.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
2024-07-09 00:04:48 +02:00
|
|
|
import type * as jotai from "jotai";
|
2024-07-03 23:31:02 +02:00
|
|
|
import type * as rxjs from "rxjs";
|
|
|
|
|
2024-05-27 08:05:11 +02:00
|
|
|
declare global {
|
2024-06-04 22:05:44 +02:00
|
|
|
type TabLayoutData = {
|
|
|
|
blockId: string;
|
|
|
|
};
|
2024-06-14 01:49:25 +02:00
|
|
|
|
2024-06-21 21:32:38 +02:00
|
|
|
type Bounds = {
|
|
|
|
x: number;
|
|
|
|
y: number;
|
|
|
|
width: number;
|
|
|
|
height: number;
|
|
|
|
};
|
|
|
|
|
2024-06-14 01:49:25 +02:00
|
|
|
type ElectronApi = {
|
2024-06-19 20:15:14 +02:00
|
|
|
getCursorPoint: () => Electron.Point;
|
2024-06-20 00:42:19 +02:00
|
|
|
|
2024-06-21 21:32:38 +02:00
|
|
|
getPlatform: () => NodeJS.Platform;
|
2024-07-18 03:42:49 +02:00
|
|
|
getEnv: (varName: string) => string;
|
2024-06-21 21:32:38 +02:00
|
|
|
|
2024-06-20 00:42:19 +02:00
|
|
|
showContextMenu: (menu: ElectronContextMenuItem[], position: { x: number; y: number }) => void;
|
|
|
|
onContextMenuClick: (callback: (id: string) => void) => void;
|
2024-06-26 18:39:41 +02:00
|
|
|
onNavigate: (callback: (url: string) => void) => void;
|
|
|
|
onIframeNavigate: (callback: (url: string) => void) => void;
|
2024-06-26 21:14:59 +02:00
|
|
|
downloadFile: (path: string) => void;
|
2024-06-28 03:09:30 +02:00
|
|
|
openExternal: (url: string) => void;
|
2024-06-20 00:42:19 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
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[];
|
2024-06-14 01:49:25 +02:00
|
|
|
};
|
2024-06-18 07:38:48 +02:00
|
|
|
|
2024-06-21 21:32:38 +02:00
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2024-06-18 07:38:48 +02:00
|
|
|
type SubjectWithRef<T> = rxjs.Subject<T> & { refCount: number; release: () => void };
|
2024-07-09 00:04:48 +02:00
|
|
|
|
2024-07-15 18:40:28 +02:00
|
|
|
type HeaderElem = HeaderIconButton | HeaderText | HeaderInput | HeaderDiv;
|
2024-07-09 08:13:12 +02:00
|
|
|
|
|
|
|
type HeaderIconButton = {
|
|
|
|
elemtype: "iconbutton";
|
2024-07-09 01:36:30 +02:00
|
|
|
icon: string;
|
2024-07-15 18:40:28 +02:00
|
|
|
className?: string;
|
2024-07-09 01:36:30 +02:00
|
|
|
title?: string;
|
2024-07-09 08:13:12 +02:00
|
|
|
click?: (e: React.MouseEvent<any>) => void;
|
|
|
|
longClick?: (e: React.MouseEvent<any>) => void;
|
2024-07-09 01:36:30 +02:00
|
|
|
};
|
|
|
|
|
2024-07-09 08:13:12 +02:00
|
|
|
type HeaderText = {
|
|
|
|
elemtype: "text";
|
|
|
|
text: string;
|
|
|
|
};
|
2024-07-09 01:36:30 +02:00
|
|
|
|
2024-07-15 18:40:28 +02:00
|
|
|
type HeaderInput = {
|
|
|
|
elemtype: "input";
|
|
|
|
value: string;
|
|
|
|
className?: string;
|
|
|
|
ref?: React.MutableRefObject<HTMLInputElement>;
|
|
|
|
onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
|
|
onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
|
|
onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
|
|
onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
|
|
};
|
|
|
|
|
|
|
|
type HeaderDiv = {
|
|
|
|
elemtype: "div";
|
|
|
|
className?: string;
|
|
|
|
children: HeaderElem[];
|
|
|
|
onMouseOver?: (e: React.MouseEvent<any>) => void;
|
|
|
|
onMouseOut?: (e: React.MouseEvent<any>) => void;
|
|
|
|
};
|
|
|
|
|
2024-07-09 08:13:12 +02:00
|
|
|
interface ViewModel {
|
|
|
|
viewIcon?: jotai.Atom<string | HeaderIconButton>;
|
|
|
|
viewName?: jotai.Atom<string>;
|
|
|
|
viewText?: jotai.Atom<string | HeaderElem[]>;
|
|
|
|
preIconButton?: jotai.Atom<HeaderIconButton>;
|
|
|
|
endIconButtons?: jotai.Atom<HeaderIconButton[]>;
|
2024-07-09 00:04:48 +02:00
|
|
|
|
|
|
|
onBack?: () => void;
|
|
|
|
onForward?: () => void;
|
|
|
|
onSearchChange?: (text: string) => void;
|
|
|
|
onSearch?: (text: string) => void;
|
|
|
|
getSettingsMenuItems?: () => ContextMenuItem[];
|
|
|
|
}
|
|
|
|
|
|
|
|
// jotai doesn't export this type :/
|
|
|
|
type Loadable<T> = { state: "loading" } | { state: "hasData"; data: T } | { state: "hasError"; error: unknown };
|
2024-05-27 08:05:11 +02:00
|
|
|
}
|
2024-05-14 08:45:41 +02:00
|
|
|
|
|
|
|
export {};
|