Fix desktop badge workspace parity

This commit is contained in:
Mohamed Boudra
2026-04-10 19:14:31 +07:00
parent 01af138939
commit a315021c75
3 changed files with 69 additions and 17 deletions
@@ -0,0 +1,34 @@
import { describe, expect, it } from "vitest";
import {
deriveMacDockBadgeCountFromWorkspaceStatuses,
isWorkspaceActionableForDesktopBadge,
} from "./desktop-badge-state";
describe("desktop-badge-state", () => {
it("treats attention-requiring workspace statuses as actionable", () => {
expect(isWorkspaceActionableForDesktopBadge("attention")).toBe(true);
expect(isWorkspaceActionableForDesktopBadge("needs_input")).toBe(true);
expect(isWorkspaceActionableForDesktopBadge("failed")).toBe(true);
});
it("ignores running and done workspace statuses", () => {
expect(isWorkspaceActionableForDesktopBadge("running")).toBe(false);
expect(isWorkspaceActionableForDesktopBadge("done")).toBe(false);
});
it("returns undefined when no visible workspaces need attention", () => {
expect(deriveMacDockBadgeCountFromWorkspaceStatuses(["done", "running"])).toBeUndefined();
});
it("counts only actionable visible workspaces", () => {
expect(
deriveMacDockBadgeCountFromWorkspaceStatuses([
"done",
"attention",
"running",
"needs_input",
"failed",
]),
).toBe(3);
});
});
@@ -0,0 +1,16 @@
import type { WorkspaceDescriptor } from "@/stores/session-store";
export type DesktopBadgeWorkspaceStatus = WorkspaceDescriptor["status"];
export function isWorkspaceActionableForDesktopBadge(
status: DesktopBadgeWorkspaceStatus,
): boolean {
return status === "attention" || status === "needs_input" || status === "failed";
}
export function deriveMacDockBadgeCountFromWorkspaceStatuses(
statuses: readonly DesktopBadgeWorkspaceStatus[],
): number | undefined {
const actionableCount = statuses.filter(isWorkspaceActionableForDesktopBadge).length;
return actionableCount > 0 ? actionableCount : undefined;
}