Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion ClaudeUsage/Models/UsageData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@ struct UsageLimit: Codable, Equatable {
}
}

struct ExtraUsage: Codable, Equatable {
let isEnabled: Bool
let utilization: Double?

enum CodingKeys: String, CodingKey {
case isEnabled = "is_enabled"
case utilization
}
}

struct UsageData: Codable, Equatable {
let fiveHour: UsageLimit
let sevenDay: UsageLimit
Expand All @@ -18,7 +28,7 @@ struct UsageData: Codable, Equatable {
let sevenDayOauthApps: UsageLimit?
let sevenDayCowork: UsageLimit?
let iguanaNecktie: UsageLimit?
let extraUsage: UsageLimit?
let extraUsage: ExtraUsage?

enum CodingKeys: String, CodingKey {
case fiveHour = "five_hour"
Expand Down
8 changes: 6 additions & 2 deletions ClaudeUsage/Models/UsageViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,9 @@ class UsageViewModel: ObservableObject {
if let oa = data.sevenDayOauthApps { limits.append(oa) }
if let c = data.sevenDayCowork { limits.append(c) }
if let i = data.iguanaNecktie { limits.append(i) }
if let e = data.extraUsage { limits.append(e) }
if let e = data.extraUsage, let util = e.utilization {
limits.append(UsageLimit(utilization: util, resetsAt: nil))
}
return limits.map(\.utilization).max() ?? 0
}

Expand Down Expand Up @@ -240,7 +242,9 @@ class UsageViewModel: ObservableObject {
if let oa = data.sevenDayOauthApps { results.append(("OAuth Apps", oa)) }
if let c = data.sevenDayCowork { results.append(("Cowork", c)) }
if let i = data.iguanaNecktie { results.append(("Other", i)) }
if let e = data.extraUsage { results.append(("Extra Usage", e)) }
if let e = data.extraUsage, let util = e.utilization {
results.append(("Extra Usage", UsageLimit(utilization: util, resetsAt: nil)))
}
return results
}

Expand Down
21 changes: 21 additions & 0 deletions ClaudeUsage/Views/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,27 @@ struct ContentView: View {
Divider()

toolbarButtons
} else if viewModel.errorState == .networkError {
VStack(spacing: 12) {
Image(systemName: "exclamationmark.triangle.fill")
.font(.system(size: 32))
.foregroundColor(.orange)
Text("Network Error")
.font(.headline)
Text("Could not load usage data. Check your credentials and network connection.")
.font(.system(size: 12))
.foregroundColor(.secondary)
.multilineTextAlignment(.center)
HStack(spacing: 8) {
Button("Retry") {
viewModel.fetchNow()
}
Button("Open Settings") {
openSettings()
}
}
}
.padding()
} else if viewModel.authStatus == .connected {
VStack(spacing: 12) {
ProgressView()
Expand Down