feat(FN-2637): align usage window hide/show controls

- Remove the per-row eye toggle for already hidden usage windows so hidden rows no longer show a show/hide button
- Keep hide controls visible for active rows and preserve existing hide interactions
- Update UsageIndicator tests to assert hidden rows omit hide buttons and visible rows still render hide controls
- Drop obsolete per-row unhide test now that restoring hidden windows is handled through the provider-level show hidden flow
This commit is contained in:
Fusion
2026-04-26 23:07:56 -07:00
committed by gsxdsm
parent ddf5b13c00
commit e79394846b
2 changed files with 14 additions and 25 deletions

View File

@@ -1,6 +1,6 @@
import { useState, useEffect, useCallback, useRef } from "react";
import type { CSSProperties } from "react";
import { X, RefreshCw, Activity, TrendingUp, CheckCircle, AlertTriangle, Eye, EyeOff } from "lucide-react";
import { X, RefreshCw, Activity, TrendingUp, CheckCircle, AlertTriangle, Eye } from "lucide-react";
import type { ProviderUsage, UsageWindow } from "../api";
import { useUsageData } from "../hooks/useUsageData";
import { ProviderIcon } from "./ProviderIcon";
@@ -187,14 +187,16 @@ function UsageWindowRow({ window, viewMode, isHidden, onToggleHidden }: UsageWin
<span className="usage-window-label">{window.label}</span>
<div className="usage-window-header-controls">
{!isHidden && <span className="usage-window-percentage">{headerText}</span>}
<button
className="btn-icon usage-window-hide-btn"
onClick={onToggleHidden}
aria-label={`${isHidden ? "Show" : "Hide"} ${window.label}`}
data-testid="usage-window-hide-btn"
>
{isHidden ? <EyeOff size={14} /> : <Eye size={14} />}
</button>
{!isHidden && (
<button
className="btn-icon usage-window-hide-btn"
onClick={onToggleHidden}
aria-label={`Hide ${window.label}`}
data-testid="usage-window-hide-btn"
>
<Eye size={14} />
</button>
)}
</div>
</div>
<div className="usage-progress-wrapper">

View File

@@ -673,6 +673,7 @@ describe("UsageIndicator", () => {
expect(hiddenRow).toHaveClass("usage-window--hidden");
expect(sessionLabel).not.toBeVisible();
expect(screen.queryByText("45% used")).not.toBeInTheDocument();
expect(screen.queryByRole("button", { name: "Hide Session (5h)" })).not.toBeInTheDocument();
});
it("persists hidden windows to localStorage", () => {
@@ -748,6 +749,8 @@ describe("UsageIndicator", () => {
expect(screen.queryByTestId("usage-show-hidden-btn")).not.toBeInTheDocument();
expect(screen.getByText("Session (5h)").closest(".usage-window")).not.toHaveClass("usage-window--hidden");
expect(screen.getByText("Weekly").closest(".usage-window")).not.toHaveClass("usage-window--hidden");
expect(screen.getByRole("button", { name: "Hide Session (5h)" })).toBeInTheDocument();
expect(screen.getByRole("button", { name: "Hide Weekly" })).toBeInTheDocument();
});
it("does not show provider-level show hidden button when no windows are hidden", () => {
@@ -764,22 +767,6 @@ describe("UsageIndicator", () => {
expect(screen.queryByTestId("usage-show-hidden-btn")).not.toBeInTheDocument();
});
it("allows un-hiding a specific hidden window", () => {
mockUseUsageData.mockReturnValue({
providers: mockProviders,
loading: false,
error: null,
lastUpdated: new Date(),
refresh: mockRefresh,
});
render(<UsageIndicator isOpen={true} onClose={mockOnClose} projectId={TEST_PROJECT_ID} />);
fireEvent.click(screen.getByRole("button", { name: "Hide Session (5h)" }));
fireEvent.click(screen.getByRole("button", { name: "Show Session (5h)" }));
expect(screen.getByText("Session (5h)").closest(".usage-window")).not.toHaveClass("usage-window--hidden");
});
// ProviderIcon integration tests
it("renders SVG provider icons instead of emoji", () => {