92 lines
2.3 KiB
Swift
92 lines
2.3 KiB
Swift
//
|
|
// FooterView.swift
|
|
// oAI
|
|
//
|
|
// Footer bar with session summary
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
struct FooterView: View {
|
|
let stats: SessionStats
|
|
|
|
var body: some View {
|
|
HStack(spacing: 20) {
|
|
// Session summary
|
|
HStack(spacing: 16) {
|
|
FooterItem(
|
|
icon: "message",
|
|
label: "Messages",
|
|
value: "\(stats.messageCount)"
|
|
)
|
|
|
|
FooterItem(
|
|
icon: "chart.bar.xaxis",
|
|
label: "Tokens",
|
|
value: "\(stats.totalTokens) (\(stats.totalInputTokens) in, \(stats.totalOutputTokens) out)"
|
|
)
|
|
|
|
FooterItem(
|
|
icon: "dollarsign.circle",
|
|
label: "Cost",
|
|
value: stats.totalCostDisplay
|
|
)
|
|
}
|
|
|
|
Spacer()
|
|
|
|
// Shortcuts hint
|
|
#if os(macOS)
|
|
Text("⌘M Model • ⌘K Clear • ⌘S Stats")
|
|
.font(.caption2)
|
|
.foregroundColor(.oaiSecondary)
|
|
#endif
|
|
}
|
|
.padding(.horizontal, 16)
|
|
.padding(.vertical, 8)
|
|
.background(.ultraThinMaterial)
|
|
.overlay(
|
|
Rectangle()
|
|
.fill(Color.oaiBorder.opacity(0.5))
|
|
.frame(height: 1),
|
|
alignment: .top
|
|
)
|
|
}
|
|
}
|
|
|
|
struct FooterItem: View {
|
|
let icon: String
|
|
let label: String
|
|
let value: String
|
|
private let guiSize = SettingsService.shared.guiTextSize
|
|
|
|
var body: some View {
|
|
HStack(spacing: 6) {
|
|
Image(systemName: icon)
|
|
.font(.system(size: guiSize - 2))
|
|
.foregroundColor(.oaiSecondary)
|
|
|
|
Text(label + ":")
|
|
.font(.system(size: guiSize - 2))
|
|
.foregroundColor(.oaiSecondary)
|
|
|
|
Text(value)
|
|
.font(.system(size: guiSize - 2, weight: .medium))
|
|
.foregroundColor(.oaiPrimary)
|
|
}
|
|
}
|
|
}
|
|
|
|
#Preview {
|
|
VStack {
|
|
Spacer()
|
|
FooterView(stats: SessionStats(
|
|
totalInputTokens: 1250,
|
|
totalOutputTokens: 3420,
|
|
totalCost: 0.0152,
|
|
messageCount: 12
|
|
))
|
|
}
|
|
.background(Color.oaiBackground)
|
|
}
|