diff --git a/src/components/provider-card.test.tsx b/src/components/provider-card.test.tsx index ed2f965..8827d89 100644 --- a/src/components/provider-card.test.tsx +++ b/src/components/provider-card.test.tsx @@ -5,6 +5,7 @@ import { beforeEach, describe, expect, it, vi } from "vitest" import { openUrl } from "@tauri-apps/plugin-opener" import { ProviderCard } from "@/components/provider-card" import { groupLinesByType } from "@/lib/group-lines-by-type" +import { formatResetTooltipText } from "@/lib/reset-tooltip" import { REFRESH_COOLDOWN_MS } from "@/lib/settings" import { formatFixedPrecisionNumber } from "@/lib/utils" @@ -260,9 +261,32 @@ describe("ProviderCard", () => { /> ) expect(screen.getByText("Resets in 1h 5m")).toBeInTheDocument() + expect(screen.getByText(formatResetTooltipText("2026-02-02T01:05:00.000Z")!)).toBeInTheDocument() vi.useRealTimers() }) + it("does not render reset tooltip for invalid reset timestamps", () => { + render( + + ) + + expect(screen.getByText("100% cap")).toBeInTheDocument() + expect(screen.queryByText(/^Next reset:/)).not.toBeInTheDocument() + }) + it("shows 'Resets soon' when reset is under 5 minutes away", () => { vi.useFakeTimers() const now = new Date("2026-02-02T00:00:00.000Z") @@ -386,6 +410,7 @@ describe("ProviderCard", () => { ) const resetButton = screen.getByRole("button", { name: /^Resets today at / }) expect(resetButton).toBeInTheDocument() + expect(screen.getByText(formatResetTooltipText(resetsAt)!)).toBeInTheDocument() fireEvent.click(resetButton) expect(onToggle).toHaveBeenCalledTimes(1) vi.useRealTimers() diff --git a/src/components/provider-card.tsx b/src/components/provider-card.tsx index b26e8f5..b555086 100644 --- a/src/components/provider-card.tsx +++ b/src/components/provider-card.tsx @@ -15,6 +15,7 @@ import { groupLinesByType } from "@/lib/group-lines-by-type" import { clamp01, formatCountNumber, formatFixedPrecisionNumber } from "@/lib/utils" import { calculateDeficit, calculatePaceStatus, type PaceStatus } from "@/lib/pace-status" import { buildPaceDetailText, formatCompactDuration, formatDeficitText, formatRunsOutText, getPaceStatusText } from "@/lib/pace-tooltip" +import { formatResetTooltipText } from "@/lib/reset-tooltip" interface ProviderCardProps { name: string @@ -423,6 +424,7 @@ function MetricLineRenderer({ ? formatResetAt(now, line.resetsAt) : formatResetIn(now, line.resetsAt) : null + const resetTooltipText = line.resetsAt ? formatResetTooltipText(line.resetsAt) : null const secondaryText = resetLabel ?? @@ -494,7 +496,29 @@ function MetricLineRenderer({ {primaryText} {secondaryText && ( - resetLabel && onResetTimerDisplayModeToggle ? ( + resetTooltipText ? ( + + + resetLabel && onResetTimerDisplayModeToggle ? ( + + ) : ( + + {secondaryText} + + ) + } + /> + {resetTooltipText} + + ) : resetLabel && onResetTimerDisplayModeToggle ? (