Files
Reflect/Shared/Views/HeaderStatsView.swift
Trey t 0442eab1f8 Rebrand entire project from Feels to Reflect
Complete rename across all bundle IDs, App Groups, CloudKit containers,
StoreKit product IDs, data store filenames, URL schemes, logger subsystems,
Swift identifiers, user-facing strings (7 languages), file names, directory
names, Xcode project, schemes, assets, and documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 11:47:16 -06:00

85 lines
2.5 KiB
Swift

//
// HeaderStatsView.swift
// Reflect
//
// Created by Trey Tartt on 1/8/22.
//
import SwiftUI
import Charts
struct MoodBarData: Identifiable {
let id = UUID()
let mood: Mood
let count: Int
let color: Color
}
struct HeaderStatsView: View {
let barData: [MoodBarData]
let textColor: Color
init(fakeData: Bool, backDays: Int, moodTint: [Color], textColor: Color) {
self.textColor = textColor
var moodEntries: [MoodEntryModel]?
if fakeData {
moodEntries = DataController.shared.randomEntries(count: 10)
} else {
guard let daysAgoDate = Calendar.current.date(byAdding: .day, value: -backDays, to: Date()),
let daysAgo = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: daysAgoDate) else {
self.barData = []
return
}
moodEntries = DataController.shared.getData(startDate: daysAgo, endDate: Date(), includedDays: [1,2,3,4,5,6,7])
}
var data: [MoodBarData] = []
if let moodEntries = moodEntries {
for (index, mood) in Mood.allValues.enumerated() {
let count = moodEntries.filter { Int($0.moodValue) == mood.rawValue }.count
let color = index < moodTint.count ? moodTint[index] : .gray
data.append(MoodBarData(mood: mood, count: count, color: color))
}
}
self.barData = data
}
var body: some View {
Chart(barData) { item in
BarMark(
x: .value("Mood", item.mood.widgetDisplayName),
y: .value("Count", item.count)
)
.foregroundStyle(item.color)
.cornerRadius(10)
.annotation(position: .top) {
Text("\(item.count)")
.font(.title.bold())
.foregroundColor(textColor)
}
}
.chartXAxis(.hidden)
.chartYAxis(.hidden)
.chartLegend(.hidden)
.chartYScale(domain: 0...(maxCount + 1))
}
private var maxCount: Int {
max(barData.map(\.count).max() ?? 1, 1)
}
}
struct HeaderStatsView_Previews: PreviewProvider {
static var previews: some View {
HeaderStatsView(
fakeData: true,
backDays: 30,
moodTint: [Color.green, Color.blue, Color.yellow, Color.red, Color.orange],
textColor: .white
)
.frame(minHeight: 85, maxHeight: 90)
}
}