Files
Reflect/Shared/Views/HeaderPercView.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

125 lines
4.4 KiB
Swift

//
// HeaderPercView.swift
// Reflect (iOS)
//
// Created by Trey Tartt on 1/29/22.
//
import SwiftUI
enum PercViewType {
case text
case shape
}
struct HeaderPercView: View {
@AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default
@AppStorage(UserDefaultsStore.Keys.shape.rawValue, store: GroupUserDefaults.groupDefaults) private var shape: BGShape = .circle
@AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
private var textColor: Color { theme.currentTheme.labelColor }
@State private var entries = [MoodMetrics]()
let backDays: Int
let type: PercViewType
@MainActor
init(fakeData: Bool, backDays: Int, type: PercViewType) {
self.type = type
self.backDays = backDays
var moodEntries: [MoodEntryModel]?
if fakeData {
moodEntries = DataController.shared.randomEntries(count: 10)
} else {
if let daysAgoRaw = Calendar.current.date(byAdding: .day, value: -backDays, to: Date()),
let daysAgo = Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: daysAgoRaw) {
moodEntries = DataController.shared.getData(startDate: daysAgo, endDate: Date(), includedDays: [1,2,3,4,5,6,7])
}
}
if let moodEntries = moodEntries {
let moodMetrics = Random.createTotalPerc(fromEntries: moodEntries)
_entries = State(initialValue: moodMetrics.sorted(by: {
$0.mood.rawValue > $1.mood.rawValue
}))
}
}
private var textViews: some View {
VStack {
Spacer()
HStack {
ForEach(entries.prefix(3), id: \.id) { model in
Text("\(model.percent, specifier: "%.0f")%")
.font(.title)
.fontWeight(.bold)
.foregroundColor(moodTint.color(forMood: model.mood))
.frame(maxWidth: .infinity)
.accessibilityLabel("\(model.mood.strValue) \(Int(model.percent)) percent")
}
}
Spacer()
HStack {
ForEach(entries.suffix(2), id: \.id) { model in
Text("\(model.percent, specifier: "%.0f")%")
.font(.title)
.fontWeight(.bold)
.foregroundColor(moodTint.color(forMood: model.mood))
.frame(maxWidth: .infinity)
.accessibilityLabel("\(model.mood.strValue) \(Int(model.percent)) percent")
}
}
Spacer()
}
}
private var shapeViews: some View {
VStack {
Spacer()
HStack {
ForEach(entries.prefix(3), id: \.id) { model in
shape.view(withText: Text("\(model.percent, specifier: "%.0f")%"),
bgColor: moodTint.color(forMood: model.mood),
textColor: textColor)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.accessibilityLabel("\(model.mood.strValue) \(Int(model.percent)) percent")
}
}
Spacer()
HStack {
ForEach(entries.suffix(2), id: \.id) { model in
shape.view(withText: Text("\(model.percent, specifier: "%.0f")%"),
bgColor: moodTint.color(forMood: model.mood),
textColor: textColor)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.accessibilityLabel("\(model.mood.strValue) \(Int(model.percent)) percent")
}
}
Spacer()
}
.foregroundColor(textColor)
}
var body: some View {
ZStack {
switch self.type {
case .text:
textViews
case .shape:
shapeViews
.padding([.leading, .trailing])
}
}
}
}
struct HeaderPercView_Previews: PreviewProvider {
static var previews: some View {
HeaderPercView(fakeData: true, backDays: 30, type: .text)
HeaderPercView(fakeData: true, backDays: 30, type: .shape)
}
}