diff --git a/src/public/app/components/app_context.ts b/src/public/app/components/app_context.ts index ac48070d0..ae416cdd9 100644 --- a/src/public/app/components/app_context.ts +++ b/src/public/app/components/app_context.ts @@ -92,7 +92,7 @@ export type CommandMappings = { filePath: string; }; focusAndSelectTitle: CommandData & { - isNewNote: boolean; + isNewNote?: boolean; }; showPromptDialog: PromptDialogOptions; showInfoDialog: ConfirmWithMessageOptions; @@ -277,15 +277,16 @@ export type CommandListener = { }; export type CommandListenerData = CommandMappings[T]; -export type EventData = EventMappings[T]; type CommandAndEventMappings = CommandMappings & EventMappings; +type EventOnlyNames = keyof EventMappings; +export type EventNames = CommandNames | EventOnlyNames; +export type EventData = CommandAndEventMappings[T]; /** * This type is a discriminated union which contains all the possible commands that can be triggered via {@link AppContext.triggerCommand}. */ export type CommandNames = keyof CommandMappings; -export type EventNames = keyof EventMappings; type FilterByValueType = { [K in keyof T]: T[K] extends ValueType ? K : never }[keyof T]; @@ -378,12 +379,10 @@ class AppContext extends Component { this.child(rootWidget); - this.triggerEvent("initialRenderComplete"); + this.triggerEvent("initialRenderComplete", {}); } - // TODO: Remove ignore once all commands are mapped out. - //@ts-ignore - triggerEvent(name: K, data: CommandAndEventMappings[K] = {}) { + triggerEvent(name: K, data: EventData) { return this.handleEvent(name, data); } diff --git a/src/public/app/components/component.ts b/src/public/app/components/component.ts index 64a9597dc..2db9f96a4 100644 --- a/src/public/app/components/component.ts +++ b/src/public/app/components/component.ts @@ -46,7 +46,7 @@ export class TypedComponent> { return this; } - handleEvent(name: string, data: unknown): Promise | null { + handleEvent(name: T, data: EventData): Promise | null { try { const callMethodPromise = this.initialized ? this.initialized.then(() => this.callMethod((this as any)[`${name}Event`], data)) : this.callMethod((this as any)[`${name}Event`], data); diff --git a/src/public/app/services/frontend_script_api.ts b/src/public/app/services/frontend_script_api.ts index a8160bbff..178b0aa59 100644 --- a/src/public/app/services/frontend_script_api.ts +++ b/src/public/app/services/frontend_script_api.ts @@ -463,7 +463,7 @@ function FrontendScriptApi(this: Api, startNote: FNote, currentNote: FNote, orig await ws.waitForMaxKnownEntityChangeId(); await appContext.tabManager.getActiveContext().setNote(notePath); - await appContext.triggerEvent("focusAndSelectTitle"); + await appContext.triggerEvent("focusAndSelectTitle", {}); }; this.openTabWithNote = async (notePath, activate) => { @@ -472,7 +472,7 @@ function FrontendScriptApi(this: Api, startNote: FNote, currentNote: FNote, orig await appContext.tabManager.openTabWithNoteWithHoisting(notePath, { activate }); if (activate) { - await appContext.triggerEvent("focusAndSelectTitle"); + await appContext.triggerEvent("focusAndSelectTitle", {}); } }; @@ -485,7 +485,7 @@ function FrontendScriptApi(this: Api, startNote: FNote, currentNote: FNote, orig await appContext.triggerCommand("openNewNoteSplit", { ntxId, notePath }); if (activate) { - await appContext.triggerEvent("focusAndSelectTitle"); + await appContext.triggerEvent("focusAndSelectTitle", {}); } }; diff --git a/src/public/app/services/protected_session.ts b/src/public/app/services/protected_session.ts index 1bf995d93..fc34a805f 100644 --- a/src/public/app/services/protected_session.ts +++ b/src/public/app/services/protected_session.ts @@ -74,9 +74,9 @@ ws.subscribeToMessages(async (message) => { if (message.type === "protectedSessionLogin") { await reloadData(); - await appContext.triggerEvent("frocaReloaded"); + await appContext.triggerEvent("frocaReloaded", {}); - appContext.triggerEvent("protectedSessionStarted"); + appContext.triggerEvent("protectedSessionStarted", {}); appContext.triggerCommand("closeProtectedSessionPasswordDialog"); diff --git a/src/public/app/widgets/containers/launcher_container.ts b/src/public/app/widgets/containers/launcher_container.ts index 9c5a6eec7..7fa833182 100644 --- a/src/public/app/widgets/containers/launcher_container.ts +++ b/src/public/app/widgets/containers/launcher_container.ts @@ -51,7 +51,7 @@ export default class LauncherContainer extends FlexContainer { this.$widget.empty(); this.renderChildren(); - await this.handleEventInChildren("initialRenderComplete"); + await this.handleEventInChildren("initialRenderComplete", {}); const activeContext = appContext.tabManager.getActiveContext(); diff --git a/src/public/app/widgets/containers/right_pane_container.ts b/src/public/app/widgets/containers/right_pane_container.ts index c7632769b..764fad85d 100644 --- a/src/public/app/widgets/containers/right_pane_container.ts +++ b/src/public/app/widgets/containers/right_pane_container.ts @@ -1,6 +1,7 @@ import FlexContainer from "./flex_container.js"; import splitService from "../../services/resizer.js"; import type RightPanelWidget from "../right_panel_widget.js"; +import type { EventData, EventNames } from "../../components/app_context.js"; export default class RightPaneContainer extends FlexContainer { private rightPaneHidden: boolean; @@ -19,7 +20,7 @@ export default class RightPaneContainer extends FlexContainer return super.isEnabled() && !this.rightPaneHidden && this.children.length > 0 && !!this.children.find((ch) => ch.isEnabled() && ch.canBeShown()); } - handleEventInChildren(name: string, data: unknown) { + handleEventInChildren(name: T, data: EventData): Promise | null { const promise = super.handleEventInChildren(name, data); if (["activeContextChanged", "noteSwitchedAndActivated", "noteSwitched"].includes(name)) {