Skip to content

Commit f104065

Browse files
committed
Add 8h dashboard time range
1 parent 3c1e87c commit f104065

6 files changed

Lines changed: 14 additions & 4 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ By default, it does not send prompts, code, messages, or token records to any se
1212

1313
- Main macOS dashboard app with Dock and Cmd+Tab support.
1414
- Dashboard sections: All, Codex, Claude Code.
15-
- Time ranges: 30 minutes, 1/3/6/12/24 hours, today, yesterday, 7 days, 30 days, 3/6/12 months, and all history.
15+
- Time ranges: 30 minutes, 1/3/6/8/12/24 hours, today, yesterday, 7 days, 30 days, 3/6/12 months, and all history.
1616
- Token views: 1/5/10/20/30 minutes, hourly, daily, weekly, and monthly.
1717
- Breakdowns by app, token kind, model, project, and session.
1818
- Local parsing for:

Sources/TokenMeter/ChartViews.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,7 +721,7 @@ struct TokenBarChart: View {
721721
return "HH:mm"
722722
case .day:
723723
switch range {
724-
case .today, .yesterday, .last30Minutes, .last1Hour, .last3Hours, .last6Hours, .last12Hours, .last24Hours:
724+
case .today, .yesterday, .last30Minutes, .last1Hour, .last3Hours, .last6Hours, .last8Hours, .last12Hours, .last24Hours:
725725
return "HH:mm"
726726
case .last7Days:
727727
return "EEE d"

Sources/TokenMeter/DashboardModel.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ enum DashboardBucketSelection: Hashable, Identifiable {
8686
.minute
8787
case .last3Hours:
8888
.fiveMinutes
89-
case .last6Hours:
89+
case .last6Hours, .last8Hours:
9090
.tenMinutes
9191
case .last12Hours:
9292
.twentyMinutes
@@ -717,7 +717,7 @@ final class DashboardModel: ObservableObject {
717717

718718
private func scanWindowStart(for range: TimeRangePreset) -> Date? {
719719
switch range {
720-
case .today, .yesterday, .last30Minutes, .last1Hour, .last3Hours, .last6Hours, .last12Hours, .last24Hours, .last7Days, .last30Days:
720+
case .today, .yesterday, .last30Minutes, .last1Hour, .last3Hours, .last6Hours, .last8Hours, .last12Hours, .last24Hours, .last7Days, .last30Days:
721721
return range.previousInterval().start
722722
case .last3Months, .last6Months, .last12Months:
723723
return range.previousInterval().start

Sources/TokenMeter/DashboardView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ struct DashboardView: View {
1616
.last1Hour,
1717
.last3Hours,
1818
.last6Hours,
19+
.last8Hours,
1920
.last12Hours,
2021
.last24Hours
2122
]

Sources/TokenMeterCore/Aggregation.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public enum TimeRangePreset: String, CaseIterable, Identifiable, Sendable {
77
case last1Hour = "1h"
88
case last3Hours = "3h"
99
case last6Hours = "6h"
10+
case last8Hours = "8h"
1011
case last12Hours = "12h"
1112
case last24Hours = "24h"
1213
case last7Days = "7d"
@@ -23,6 +24,7 @@ public enum TimeRangePreset: String, CaseIterable, Identifiable, Sendable {
2324
.last1Hour,
2425
.last3Hours,
2526
.last6Hours,
27+
.last8Hours,
2628
.last12Hours,
2729
.last24Hours,
2830
.today,
@@ -57,6 +59,8 @@ public enum TimeRangePreset: String, CaseIterable, Identifiable, Sendable {
5759
return DateInterval(start: now.addingTimeInterval(-3 * 60 * 60), end: now)
5860
case .last6Hours:
5961
return DateInterval(start: now.addingTimeInterval(-6 * 60 * 60), end: now)
62+
case .last8Hours:
63+
return DateInterval(start: now.addingTimeInterval(-8 * 60 * 60), end: now)
6064
case .last12Hours:
6165
return DateInterval(start: now.addingTimeInterval(-12 * 60 * 60), end: now)
6266
case .last24Hours:

Sources/TokenMeterSelfTestSupport/AggregationTests.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,10 @@ extension TokenMeterSelfTest {
182182
let sixHours = TimeRangePreset.last6Hours.interval(now: now, calendar: calendar)
183183
try expect(sixHours.start == date(year: 2026, month: 5, day: 11, hour: 11, minute: 37, calendar: calendar), "6h start")
184184
try expect(sixHours.end == now, "6h end")
185+
186+
let eightHours = TimeRangePreset.last8Hours.interval(now: now, calendar: calendar)
187+
try expect(eightHours.start == date(year: 2026, month: 5, day: 11, hour: 9, minute: 37, calendar: calendar), "8h start")
188+
try expect(eightHours.end == now, "8h end")
185189
}
186190

187191
static func previousRangesMatchCurrentDuration() throws {
@@ -290,6 +294,7 @@ extension TokenMeterSelfTest {
290294
.last1Hour,
291295
.last3Hours,
292296
.last6Hours,
297+
.last8Hours,
293298
.last12Hours,
294299
.last24Hours,
295300
.today,

0 commit comments

Comments
 (0)