From c1b1b76a90152f5a4c9ef37dd7e81c85072cd4e0 Mon Sep 17 00:00:00 2001 From: Aleix Soler Date: Thu, 19 Mar 2026 12:51:49 +0100 Subject: [PATCH] refactor(events): propagate clicked activeStatus payload from UI components to modal integrations --- components/ChangeStatusModal/ChangeStatusModal.tsx | 3 +++ integrations/modals/statusModalIntegration.tsx | 5 +++++ integrations/status-bar/status-bar.tsx | 6 ++++-- main.tsx | 8 ++++++-- types/eventBus.ts | 3 +++ 5 files changed, 21 insertions(+), 4 deletions(-) diff --git a/components/ChangeStatusModal/ChangeStatusModal.tsx b/components/ChangeStatusModal/ChangeStatusModal.tsx index 66dc748..0aff7ed 100644 --- a/components/ChangeStatusModal/ChangeStatusModal.tsx +++ b/components/ChangeStatusModal/ChangeStatusModal.tsx @@ -13,6 +13,7 @@ export interface Props { templates: StatusTemplate[]; iconFrameMode?: "always" | "never"; iconColorMode?: "status" | "theme"; + activeStatus?: NoteStatus; onRemoveStatus: ( frontmatterTagName: string, status: NoteStatus, @@ -30,6 +31,7 @@ export const ChangeStatusModal: React.FC = ({ templates, iconFrameMode = "never", iconColorMode = "status", + activeStatus, onRemoveStatus, onSelectStatus, }) => { @@ -63,6 +65,7 @@ export const ChangeStatusModal: React.FC = ({ templates={templates} iconFrameMode={iconFrameMode} iconColorMode={iconColorMode} + activeStatus={activeStatus} onSelectedState={handleSelectedState} /> ))} diff --git a/integrations/modals/statusModalIntegration.tsx b/integrations/modals/statusModalIntegration.tsx index 725d818..afce12f 100644 --- a/integrations/modals/statusModalIntegration.tsx +++ b/integrations/modals/statusModalIntegration.tsx @@ -12,11 +12,13 @@ import { } from "@/core/noteStatusService"; import eventBus from "@/core/eventBus"; import settingsService from "@/core/settingsService"; +import { NoteStatus } from "@/types/noteStatus"; export class StatusModalIntegration extends Modal { private root: Root | null = null; private static instance: StatusModalIntegration | null = null; private selectorService: SelectorService; + private activeStatus?: NoteStatus; constructor(app: App) { super(app); @@ -25,6 +27,7 @@ export class StatusModalIntegration extends Modal { static open( app: App, noteStatusService: NoteStatusService | MultipleNoteStatusService, + activeStatus?: NoteStatus, ) { if (StatusModalIntegration.instance) { throw new Error("Status Modal is already open"); @@ -45,6 +48,7 @@ export class StatusModalIntegration extends Modal { "statusModalIntegrationSubscription1", ); + StatusModalIntegration.instance.activeStatus = activeStatus; StatusModalIntegration.instance.open(); } @@ -125,6 +129,7 @@ export class StatusModalIntegration extends Modal { settingsService.settings.fileExplorerIconColorMode || "status" } + activeStatus={this.activeStatus} onRemoveStatus={this.onRemoveStatus} onSelectStatus={this.onSelectStatus} />, diff --git a/integrations/status-bar/status-bar.tsx b/integrations/status-bar/status-bar.tsx index 9028f43..0c49f0d 100644 --- a/integrations/status-bar/status-bar.tsx +++ b/integrations/status-bar/status-bar.tsx @@ -4,6 +4,7 @@ import { Plugin } from "obsidian"; import settingsService from "@/core/settingsService"; import { StatusBar } from "@/components/StatusBar/StatusBar"; import { NoteStatusService } from "@/core/noteStatusService"; +import { NoteStatus } from "@/types/noteStatus"; export class StatusBarIntegration { private static instance: StatusBarIntegration | null = null; @@ -101,7 +102,7 @@ export class StatusBarIntegration { this.render(); } - private openStatusModal() { + private openStatusModal(activeStatus?: NoteStatus) { if (!this.noteStatusService) { throw new Error( "open status modal failed bcse there is no noteStatusService available", @@ -109,6 +110,7 @@ export class StatusBarIntegration { } eventBus.publish("triggered-open-modal", { statusService: this.noteStatusService, + activeStatus, }); } @@ -164,7 +166,7 @@ export class StatusBarIntegration { badgeContentMode={ settingsService.settings.statusBarBadgeContentMode } - onStatusClick={() => this.openStatusModal()} + onStatusClick={(status) => this.openStatusModal(status)} noStatusConfig={this.getNoStatusConfig()} />, ); diff --git a/main.tsx b/main.tsx index 93165fd..87ec9af 100644 --- a/main.tsx +++ b/main.tsx @@ -220,8 +220,12 @@ export default class NoteStatusPlugin extends Plugin { // Register listeners eventBus.subscribe( "triggered-open-modal", - ({ statusService }) => { - StatusModalIntegration.open(this.app, statusService); + ({ statusService, activeStatus }) => { + StatusModalIntegration.open( + this.app, + statusService, + activeStatus, + ); }, "main-triggered-open-modal-subscriptor", ); diff --git a/types/eventBus.ts b/types/eventBus.ts index cc6aee4..2997e88 100644 --- a/types/eventBus.ts +++ b/types/eventBus.ts @@ -4,6 +4,7 @@ import { } from "@/core/noteStatusService"; import { PluginSettings } from "@/types/pluginSettings"; import { TFile, WorkspaceLeaf } from "obsidian"; +import { NoteStatus } from "@/types/noteStatus"; export type EventBusEvents = { "active-file-change": ({ leaf }: { leaf: WorkspaceLeaf | null }) => void; @@ -19,8 +20,10 @@ export type EventBusEvents = { "status-changed": ({ file }: { file: TFile }) => void; "triggered-open-modal": ({ statusService, + activeStatus, }: { statusService: NoteStatusService | MultipleNoteStatusService; + activeStatus?: NoteStatus; }) => void; };