refactor(events): propagate clicked activeStatus payload from UI components to modal integrations

This commit is contained in:
Aleix Soler 2026-03-19 12:51:49 +01:00
parent 1bf7f3d8fb
commit c1b1b76a90
5 changed files with 21 additions and 4 deletions

View file

@ -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<Props> = ({
templates,
iconFrameMode = "never",
iconColorMode = "status",
activeStatus,
onRemoveStatus,
onSelectStatus,
}) => {
@ -63,6 +65,7 @@ export const ChangeStatusModal: React.FC<Props> = ({
templates={templates}
iconFrameMode={iconFrameMode}
iconColorMode={iconColorMode}
activeStatus={activeStatus}
onSelectedState={handleSelectedState}
/>
))}

View file

@ -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}
/>,

View file

@ -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()}
/>,
);

View file

@ -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",
);

View file

@ -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;
};