Skip to content

Commit 3d42a90

Browse files
willytop8claude
andcommitted
feat: make OpenRouter color bar preview use standard resolver path
Previously the color-bar preview for OpenRouter read usedPercent directly instead of going through IconRemainingResolver, which meant key-quota state had no effect on the preview color. This change routes the preview through the same resolvedPercents(_:style:showUsed:) call that the live icon uses. - When no key limit is configured (noLimitConfigured) or key data is unavailable, resolvedPercents returns nil for primary, matching the live icon behavior and leaving the color bar unrendered - When a key limit is set, the key-usage percent drives the preview as expected - Adds tests covering the unavailable, no-limit, and key-quota cases, each verifying both the resolved percent and the menu-bar display text Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 63e473f commit 3d42a90

3 files changed

Lines changed: 49 additions & 61 deletions

File tree

Sources/CodexBar/StatusItemController+Animation.swift

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -336,30 +336,6 @@ extension StatusItemController {
336336
return false
337337
}
338338

339-
if Self.shouldUseOpenRouterBrandFallback(provider: primaryProvider, snapshot: snapshot),
340-
let brand = ProviderBrandIcon.image(for: primaryProvider)
341-
{
342-
let signature = [
343-
"mode=openRouterFallback",
344-
"provider=\(primaryProvider.rawValue)",
345-
"style=\(String(describing: style))",
346-
"primary=\(debugDouble(primary))",
347-
"weekly=\(debugDouble(weekly))",
348-
"credits=\(debugDouble(credits))",
349-
"stale=\(stale ? "1" : "0")",
350-
"status=\(statusIndicator.rawValue)",
351-
"anim=\(needsAnimation ? "1" : "0")",
352-
].joined(separator: "|")
353-
if self.shouldSkipMergedIconRender(signature) {
354-
return true
355-
}
356-
self.setButtonTitle(nil, for: button)
357-
self.setButtonImage(
358-
Self.brandImageWithStatusOverlay(brand: brand, statusIndicator: statusIndicator),
359-
for: button)
360-
return false
361-
}
362-
363339
self.setButtonTitle(nil, for: button)
364340
if let morphProgress {
365341
let signature = [
@@ -440,17 +416,6 @@ extension StatusItemController {
440416
return
441417
}
442418

443-
if Self.shouldUseOpenRouterBrandFallback(provider: provider, snapshot: snapshot),
444-
let brand = ProviderBrandIcon.image(for: provider)
445-
{
446-
self.setButtonTitle(nil, for: button)
447-
self.setButtonImage(
448-
Self.brandImageWithStatusOverlay(
449-
brand: brand,
450-
statusIndicator: self.store.statusIndicator(for: provider)),
451-
for: button)
452-
return
453-
}
454419
let resolved = snapshot.map {
455420
IconRemainingResolver.resolvedPercents(
456421
snapshot: $0,
@@ -775,18 +740,6 @@ extension StatusItemController {
775740
}
776741
}
777742

778-
nonisolated static func shouldUseOpenRouterBrandFallback(
779-
provider: UsageProvider,
780-
snapshot: UsageSnapshot?) -> Bool
781-
{
782-
guard provider == .openrouter,
783-
let openRouterUsage = snapshot?.openRouterUsage
784-
else {
785-
return false
786-
}
787-
return openRouterUsage.keyQuotaStatus == .noLimitConfigured
788-
}
789-
790743
nonisolated static func brandImageWithStatusOverlay(
791744
brand: NSImage,
792745
statusIndicator: ProviderStatusIndicator) -> NSImage

Tests/CodexBarTests/ProvidersPaneCoverageTests.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,30 @@ struct ProvidersPaneCoverageTests {
171171
#expect(row?.value == "$4.61")
172172
}
173173

174+
@Test
175+
func `open router provider pane shows balance and no quota metric when key limit is not configured`() {
176+
let settings = Self.makeSettingsStore(suite: "ProvidersPaneCoverageTests-openrouter-no-key-limit")
177+
let store = Self.makeUsageStore(settings: settings)
178+
let snapshot = OpenRouterUsageSnapshot(
179+
totalCredits: 50,
180+
totalUsage: 45,
181+
balance: 5, // balance = totalCredits - totalUsage
182+
usedPercent: 90,
183+
keyDataFetched: true,
184+
keyLimit: nil,
185+
keyUsage: nil,
186+
rateLimit: nil,
187+
updatedAt: Date()).toUsageSnapshot()
188+
store._setSnapshotForTesting(snapshot, provider: .openrouter)
189+
190+
let pane = ProvidersPane(settings: settings, store: store)
191+
let model = pane._test_menuCardModel(for: .openrouter)
192+
193+
#expect(model.planText == "Balance: $5.00")
194+
#expect(model.metrics.isEmpty)
195+
#expect(model.usageNotes == ["No limit set for the API key"])
196+
}
197+
174198
@Test
175199
func `provider detail plan row keeps plan label for non open router`() {
176200
let row = ProviderDetailView<EmptyView>.planRow(provider: .codex, planText: "Pro")

Tests/CodexBarTests/StatusItemControllerMenuTests.swift

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,44 +97,52 @@ struct StatusItemControllerMenuTests {
9797
}
9898

9999
@Test
100-
func `open router brand fallback enabled when no key limit configured`() {
100+
func `open router key data unavailable uses color bar path with nil primary percent`() {
101101
let snapshot = OpenRouterUsageSnapshot(
102102
totalCredits: 50,
103103
totalUsage: 45,
104104
balance: 5,
105105
usedPercent: 90,
106-
keyDataFetched: true,
106+
keyDataFetched: false,
107107
keyLimit: nil,
108108
keyUsage: nil,
109109
rateLimit: nil,
110110
updatedAt: Date()).toUsageSnapshot()
111111

112-
#expect(StatusItemController.shouldUseOpenRouterBrandFallback(
113-
provider: .openrouter,
114-
snapshot: snapshot))
112+
#expect(snapshot.openRouterUsage?.keyQuotaStatus == .unavailable)
113+
let resolved = IconRemainingResolver.resolvedPercents(
114+
snapshot: snapshot,
115+
style: .openrouter,
116+
showUsed: false)
117+
#expect(resolved.primary == nil)
118+
#expect(resolved.secondary == nil)
115119
#expect(MenuBarDisplayText.percentText(window: snapshot.primary, showUsed: false) == nil)
116120
}
117121

118122
@Test
119-
func `open router brand fallback disabled when key quota fetch unavailable`() {
123+
func `open router no key limit uses color bar path with nil primary percent`() {
120124
let snapshot = OpenRouterUsageSnapshot(
121125
totalCredits: 50,
122126
totalUsage: 45,
123127
balance: 5,
124128
usedPercent: 90,
125-
keyDataFetched: false,
129+
keyDataFetched: true,
126130
keyLimit: nil,
127131
keyUsage: nil,
128132
rateLimit: nil,
129133
updatedAt: Date()).toUsageSnapshot()
130134

131-
#expect(!StatusItemController.shouldUseOpenRouterBrandFallback(
132-
provider: .openrouter,
133-
snapshot: snapshot))
135+
let resolved = IconRemainingResolver.resolvedPercents(
136+
snapshot: snapshot,
137+
style: .openrouter,
138+
showUsed: false)
139+
#expect(resolved.primary == nil)
140+
#expect(resolved.secondary == nil)
141+
#expect(MenuBarDisplayText.percentText(window: snapshot.primary, showUsed: false) == nil)
134142
}
135143

136144
@Test
137-
func `open router brand fallback disabled when key quota available`() {
145+
func `open router key quota uses color bar path with primary percent`() {
138146
let snapshot = OpenRouterUsageSnapshot(
139147
totalCredits: 50,
140148
totalUsage: 45,
@@ -145,10 +153,13 @@ struct StatusItemControllerMenuTests {
145153
rateLimit: nil,
146154
updatedAt: Date()).toUsageSnapshot()
147155

148-
#expect(!StatusItemController.shouldUseOpenRouterBrandFallback(
149-
provider: .openrouter,
150-
snapshot: snapshot))
151156
#expect(snapshot.primary?.usedPercent == 10)
157+
let resolved = IconRemainingResolver.resolvedPercents(
158+
snapshot: snapshot,
159+
style: .openrouter,
160+
showUsed: false)
161+
#expect(resolved.primary == 90)
162+
#expect(resolved.secondary == nil)
152163
}
153164

154165
@Test

0 commit comments

Comments
 (0)