2023-08-20 17:54:31 +00:00
|
|
|
import { Manifest } from "../common/manifest.ts";
|
2023-10-03 12:16:33 +00:00
|
|
|
import { PageMeta } from "$sb/types.ts";
|
2022-10-10 12:50:21 +00:00
|
|
|
import { AppCommand } from "./hooks/command.ts";
|
2023-05-23 18:53:53 +00:00
|
|
|
|
|
|
|
// Used by FilterBox
|
|
|
|
export type FilterOption = {
|
|
|
|
name: string;
|
|
|
|
orderId?: number;
|
|
|
|
hint?: string;
|
|
|
|
} & Record<string, any>;
|
2022-03-20 08:56:28 +00:00
|
|
|
|
|
|
|
export type Notification = {
|
|
|
|
id: number;
|
|
|
|
message: string;
|
2022-07-14 11:32:28 +00:00
|
|
|
type: "info" | "error";
|
2022-03-20 08:56:28 +00:00
|
|
|
date: Date;
|
|
|
|
};
|
|
|
|
|
2022-09-30 14:59:57 +00:00
|
|
|
export type PanelMode = number;
|
|
|
|
|
2022-12-15 12:23:49 +00:00
|
|
|
export type BuiltinSettings = {
|
|
|
|
indexPage: string;
|
2023-08-28 13:52:39 +00:00
|
|
|
customStyles?: string | string[];
|
2023-08-20 17:54:31 +00:00
|
|
|
plugOverrides?: Record<string, Partial<Manifest>>;
|
2023-05-29 07:53:49 +00:00
|
|
|
// Format: compatible with docker ignore
|
|
|
|
spaceIgnore?: string;
|
2022-12-15 12:23:49 +00:00
|
|
|
};
|
|
|
|
|
2022-09-30 14:59:57 +00:00
|
|
|
export type PanelConfig = {
|
|
|
|
mode?: PanelMode;
|
|
|
|
html?: string;
|
|
|
|
script?: string;
|
|
|
|
};
|
|
|
|
|
2022-03-20 08:56:28 +00:00
|
|
|
export type AppViewState = {
|
|
|
|
currentPage?: string;
|
2023-01-16 10:28:59 +00:00
|
|
|
currentPageMeta?: PageMeta;
|
2022-09-06 14:21:33 +00:00
|
|
|
isLoading: boolean;
|
2022-03-20 08:56:28 +00:00
|
|
|
showPageNavigator: boolean;
|
|
|
|
showCommandPalette: boolean;
|
2023-01-04 15:37:09 +00:00
|
|
|
showCommandPaletteContext?: string;
|
2022-03-31 12:28:07 +00:00
|
|
|
unsavedChanges: boolean;
|
2023-08-16 09:40:31 +00:00
|
|
|
syncFailures: number; // Reset everytime a sync succeeds
|
2023-06-14 18:58:08 +00:00
|
|
|
progressPerc?: number;
|
2022-09-30 14:59:57 +00:00
|
|
|
panels: { [key: string]: PanelConfig };
|
2023-05-23 18:53:53 +00:00
|
|
|
allPages: PageMeta[];
|
2022-03-20 08:56:28 +00:00
|
|
|
commands: Map<string, AppCommand>;
|
|
|
|
notifications: Notification[];
|
2022-05-16 13:09:36 +00:00
|
|
|
recentCommands: Map<string, Date>;
|
2022-04-13 12:46:52 +00:00
|
|
|
|
2022-12-21 13:55:24 +00:00
|
|
|
uiOptions: {
|
|
|
|
vimMode: boolean;
|
|
|
|
darkMode: boolean;
|
|
|
|
forcedROMode: boolean;
|
|
|
|
};
|
|
|
|
|
2022-12-21 15:08:51 +00:00
|
|
|
// Filter box
|
2022-04-13 12:46:52 +00:00
|
|
|
showFilterBox: boolean;
|
2022-04-21 09:46:33 +00:00
|
|
|
filterBoxLabel: string;
|
2022-04-13 12:46:52 +00:00
|
|
|
filterBoxPlaceHolder: string;
|
|
|
|
filterBoxOptions: FilterOption[];
|
|
|
|
filterBoxHelpText: string;
|
|
|
|
filterBoxOnSelect: (option: FilterOption | undefined) => void;
|
2022-12-21 15:08:51 +00:00
|
|
|
|
|
|
|
// Prompt
|
|
|
|
showPrompt: boolean;
|
|
|
|
promptMessage?: string;
|
|
|
|
promptDefaultValue?: string;
|
|
|
|
promptCallback?: (value: string | undefined) => void;
|
|
|
|
|
|
|
|
// Confirm
|
|
|
|
showConfirm: boolean;
|
|
|
|
confirmMessage?: string;
|
|
|
|
confirmCallback?: (value: boolean) => void;
|
2022-03-20 08:56:28 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
export const initialViewState: AppViewState = {
|
2022-09-06 14:21:33 +00:00
|
|
|
isLoading: false,
|
2022-03-20 08:56:28 +00:00
|
|
|
showPageNavigator: false,
|
|
|
|
showCommandPalette: false,
|
2022-03-31 12:28:07 +00:00
|
|
|
unsavedChanges: false,
|
2023-08-16 09:40:31 +00:00
|
|
|
syncFailures: 0,
|
2022-12-21 13:55:24 +00:00
|
|
|
uiOptions: {
|
|
|
|
vimMode: false,
|
|
|
|
darkMode: false,
|
|
|
|
forcedROMode: false,
|
|
|
|
},
|
2022-09-30 14:59:57 +00:00
|
|
|
panels: {
|
|
|
|
lhs: {},
|
|
|
|
rhs: {},
|
|
|
|
bhs: {},
|
|
|
|
modal: {},
|
2023-11-27 15:29:19 +00:00
|
|
|
top: {},
|
|
|
|
bottom: {},
|
2022-09-30 14:59:57 +00:00
|
|
|
},
|
2023-05-23 18:53:53 +00:00
|
|
|
allPages: [],
|
2022-03-20 08:56:28 +00:00
|
|
|
commands: new Map(),
|
2022-05-16 13:09:36 +00:00
|
|
|
recentCommands: new Map(),
|
2022-03-20 08:56:28 +00:00
|
|
|
notifications: [],
|
2022-04-13 12:46:52 +00:00
|
|
|
showFilterBox: false,
|
|
|
|
filterBoxHelpText: "",
|
2022-04-21 09:46:33 +00:00
|
|
|
filterBoxLabel: "",
|
2022-04-13 12:46:52 +00:00
|
|
|
filterBoxOnSelect: () => {},
|
|
|
|
filterBoxOptions: [],
|
|
|
|
filterBoxPlaceHolder: "",
|
2022-12-21 15:08:51 +00:00
|
|
|
|
|
|
|
showPrompt: false,
|
|
|
|
showConfirm: false,
|
2022-03-20 08:56:28 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
export type Action =
|
2022-05-17 09:53:17 +00:00
|
|
|
| { type: "page-loaded"; meta: PageMeta }
|
2022-09-06 14:21:33 +00:00
|
|
|
| { type: "page-loading"; name: string }
|
2023-05-23 18:53:53 +00:00
|
|
|
| { type: "pages-listed"; pages: PageMeta[] }
|
2022-03-31 12:28:07 +00:00
|
|
|
| { type: "page-changed" }
|
|
|
|
| { type: "page-saved" }
|
2023-08-16 09:40:31 +00:00
|
|
|
| { type: "sync-change"; syncSuccess: boolean }
|
2022-03-20 08:56:28 +00:00
|
|
|
| { type: "start-navigate" }
|
|
|
|
| { type: "stop-navigate" }
|
2022-05-06 16:55:04 +00:00
|
|
|
| {
|
2022-10-10 12:50:21 +00:00
|
|
|
type: "update-commands";
|
|
|
|
commands: Map<string, AppCommand>;
|
|
|
|
}
|
2022-04-21 09:46:33 +00:00
|
|
|
| { type: "show-palette"; context?: string }
|
2022-03-20 08:56:28 +00:00
|
|
|
| { type: "hide-palette" }
|
|
|
|
| { type: "show-notification"; notification: Notification }
|
2022-03-28 13:25:05 +00:00
|
|
|
| { type: "dismiss-notification"; id: number }
|
2022-09-30 14:59:57 +00:00
|
|
|
| {
|
2022-10-10 12:50:21 +00:00
|
|
|
type: "show-panel";
|
|
|
|
id: "rhs" | "lhs" | "bhs" | "modal";
|
|
|
|
config: PanelConfig;
|
|
|
|
}
|
2022-09-30 14:59:57 +00:00
|
|
|
| { type: "hide-panel"; id: string }
|
2022-05-16 13:09:36 +00:00
|
|
|
| { type: "command-run"; command: string }
|
2022-04-13 12:46:52 +00:00
|
|
|
| {
|
2022-10-10 12:50:21 +00:00
|
|
|
type: "show-filterbox";
|
|
|
|
options: FilterOption[];
|
|
|
|
placeHolder: string;
|
|
|
|
helpText: string;
|
|
|
|
label: string;
|
|
|
|
onSelect: (option: FilterOption | undefined) => void;
|
|
|
|
}
|
2022-09-16 12:26:47 +00:00
|
|
|
| { type: "hide-filterbox" }
|
2022-12-21 15:08:51 +00:00
|
|
|
| {
|
|
|
|
type: "show-prompt";
|
|
|
|
message: string;
|
|
|
|
defaultValue: string;
|
|
|
|
callback: (value: string | undefined) => void;
|
|
|
|
}
|
|
|
|
| { type: "hide-prompt" }
|
|
|
|
| {
|
|
|
|
type: "show-confirm";
|
|
|
|
message: string;
|
|
|
|
callback: (value: boolean) => void;
|
|
|
|
}
|
|
|
|
| { type: "hide-confirm" }
|
2023-06-14 18:58:08 +00:00
|
|
|
| { type: "set-ui-option"; key: string; value: any }
|
|
|
|
| { type: "set-progress"; progressPerc?: number };
|