From 1871a602df95bc133e03425b2b1237f8d290c0aa Mon Sep 17 00:00:00 2001 From: dotta Date: Sat, 28 Mar 2026 17:02:13 -0500 Subject: [PATCH] Align inbox non-issue selection styling Co-Authored-By: Paperclip --- ui/src/pages/Inbox.test.tsx | 93 +++++++++++++++++++++++++++++++++++++ ui/src/pages/Inbox.tsx | 18 +++++-- 2 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 ui/src/pages/Inbox.test.tsx diff --git a/ui/src/pages/Inbox.test.tsx b/ui/src/pages/Inbox.test.tsx new file mode 100644 index 00000000..fc7f9fea --- /dev/null +++ b/ui/src/pages/Inbox.test.tsx @@ -0,0 +1,93 @@ +// @vitest-environment jsdom + +import { act } from "react"; +import type { ComponentProps } from "react"; +import { createRoot } from "react-dom/client"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { FailedRunInboxRow } from "./Inbox"; + +vi.mock("@/lib/router", () => ({ + Link: ({ children, className, ...props }: ComponentProps<"a">) => ( + {children} + ), + useLocation: () => ({ pathname: "/", search: "", hash: "" }), + useNavigate: () => () => {}, +})); + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(globalThis as any).IS_REACT_ACT_ENVIRONMENT = true; + +describe("FailedRunInboxRow", () => { + let container: HTMLDivElement; + + beforeEach(() => { + container = document.createElement("div"); + document.body.appendChild(container); + }); + + afterEach(() => { + container.remove(); + }); + + it("suppresses accent hover styling when selected", () => { + const root = createRoot(container); + const run = { + id: "run-1", + companyId: "company-1", + agentId: "agent-1", + invocationSource: "assignment", + triggerDetail: null, + status: "failed", + error: "boom", + wakeupRequestId: null, + exitCode: null, + signal: null, + usageJson: null, + resultJson: null, + sessionIdBefore: null, + sessionIdAfter: null, + logStore: null, + logRef: null, + logBytes: null, + logSha256: null, + logCompressed: false, + errorCode: null, + externalRunId: null, + processPid: null, + processStartedAt: null, + retryOfRunId: null, + processLossRetryCount: 0, + stdoutExcerpt: null, + stderrExcerpt: null, + contextSnapshot: null, + startedAt: new Date("2026-03-11T00:00:00.000Z"), + finishedAt: null, + createdAt: new Date("2026-03-11T00:00:00.000Z"), + updatedAt: new Date("2026-03-11T00:00:00.000Z"), + } as const; + + act(() => { + root.render( + {}} + onRetry={() => {}} + isRetrying={false} + selected + />, + ); + }); + + const link = container.querySelector("a"); + expect(link).not.toBeNull(); + expect(link?.className).toContain("hover:bg-transparent"); + expect(link?.className).not.toContain("hover:bg-accent/50"); + + act(() => { + root.unmount(); + }); + }); +}); diff --git a/ui/src/pages/Inbox.tsx b/ui/src/pages/Inbox.tsx index fc3ca0fa..d2fa614b 100644 --- a/ui/src/pages/Inbox.tsx +++ b/ui/src/pages/Inbox.tsx @@ -101,7 +101,7 @@ function readIssueIdFromRun(run: HeartbeatRun): string | null { type NonIssueUnreadState = "visible" | "fading" | "hidden" | null; -function FailedRunInboxRow({ +export function FailedRunInboxRow({ run, issueById, agentName: linkedAgentName, @@ -113,6 +113,7 @@ function FailedRunInboxRow({ onMarkRead, onArchive, archiveDisabled, + selected = false, className, }: { run: HeartbeatRun; @@ -126,6 +127,7 @@ function FailedRunInboxRow({ onMarkRead?: () => void; onArchive?: () => void; archiveDisabled?: boolean; + selected?: boolean; className?: string; }) { const issueId = readIssueIdFromRun(run); @@ -171,7 +173,10 @@ function FailedRunInboxRow({ ) : null} {!showUnreadSlot &&