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

230 lines
7.8 KiB
Swift

//
// AllMoods.swift
// Reflect (iOS)
//
// Created by Trey Tartt on 2/6/22.
//
import SwiftUI
struct AllMoodsTotalTemplate: View, SharingTemplate {
static var description: String {
"All Time Count"
}
var isPreview: Bool
var startDate: Date
var endDate: Date
var totalEntryCount: Int = 0
@Environment(\.presentationMode) var presentationMode
@AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default
@AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system
private var textColor: Color { theme.currentTheme.labelColor }
@StateObject private var shareImage = ShareImageStateViewModel()
private var entries = [MoodMetrics]()
@MainActor
init(isPreview: Bool, startDate: Date, endDate: Date, fakeData: Bool) {
self.isPreview = isPreview
self.startDate = startDate
self.endDate = endDate
var moodEntries: [MoodEntryModel]?
if fakeData {
moodEntries = DataController.shared.randomEntries(count: 10)
} else {
moodEntries = DataController.shared.getData(startDate:startDate,
endDate: endDate,
includedDays: [1,2,3,4,5,6,7])
}
totalEntryCount = moodEntries?.count ?? 0
if let moodEntries = moodEntries {
entries = Random.createTotalPerc(fromEntries: moodEntries)
entries = entries.sorted(by: {
$0.percent > $1.percent
})
} else {
entries = []
}
}
var image: UIImage {
let image = shareView.asImage(size: CGSize(width: 666, height: 1190))
return image
}
var preview: some View {
circularViews
.frame(maxWidth: .infinity, alignment: .center)
.frame(height: 100)
}
private var circularViews: some View {
VStack {
VStack {
HStack {
ForEach(entries.prefix(2), id: \.mood) { model in
ZStack {
Circle().fill(moodTint.color(forMood: model.mood))
Text("\(model.percent, specifier: "%.0f")%")
.font(.title)
.fontWeight(.bold)
.scaledToFill()
.minimumScaleFactor(0.5)
.lineLimit(1)
.foregroundColor(textColor)
.padding(2)
}
}
}
.frame(maxWidth: .infinity, alignment: .center)
HStack {
ForEach(entries.suffix(3), id: \.mood) { model in
ZStack {
Circle().fill(moodTint.color(forMood: model.mood))
Text("\(model.percent, specifier: "%.0f")%")
.font(.title)
.fontWeight(.bold)
.scaledToFill()
.minimumScaleFactor(0.5)
.lineLimit(1)
.foregroundColor(textColor)
.padding(2)
}
}
}
.frame(maxWidth: .infinity, alignment: .center)
}
.padding(.top, 30)
HStack {
ForEach(entries, id: \.mood) { model in
ZStack {
Circle().fill(moodTint.color(forMood: model.mood))
Text("\(model.total)")
.font(.title)
.fontWeight(.bold)
.scaledToFill()
.minimumScaleFactor(0.5)
.lineLimit(1)
.foregroundColor(textColor)
.padding(2)
}
}
}
}
}
var shareView: some View {
VStack {
Text(String(format: String(localized: "share_view_all_moods_total_template_title"), totalEntryCount))
.font(.title)
.foregroundColor(textColor)
.frame(maxWidth: .infinity, alignment: .center)
.padding()
HStack {
ForEach(Mood.allValues, id: \.self) { mood in
Circle()
.frame(minWidth: 10, idealWidth: 70, maxWidth: 100, minHeight: 10, idealHeight: 70, maxHeight: 100)
.aspectRatio(contentMode: .fit)
.foregroundColor(moodTint.color(forMood: mood))
.overlay(
mood.icon
.resizable()
.aspectRatio(contentMode: .fit)
.padding(9)
.foregroundColor(textColor)
)
}
}
.padding()
circularViews
.padding()
Spacer()
}
.background(Color(UIColor.secondarySystemBackground))
.cornerRadius(10)
.padding()
}
var mainView: some View {
VStack {
shareView
HStack(alignment: .center) {
Button(action: {
let _image = self.image
self.shareImage.showSheet = true
self.shareImage.selectedShareImage = _image
}, label: {
Text("Share")
.font(.title)
.fontWeight(.bold)
.foregroundColor(Color.white)
.padding(.top, 20)
})
.frame(maxWidth: .infinity, alignment: .center)
.background(
Color.green
)
.padding(.trailing, -5)
Button(action: {
presentationMode.wrappedValue.dismiss()
}, label: {
Text("Exit")
.font(.title)
.fontWeight(.bold)
.foregroundColor(Color.white)
.padding(.top, 20)
})
.frame(maxWidth: .infinity, alignment: .center)
.background(
Color.red
)
.padding(.leading, -5)
}
.padding([.leading, .trailing], -20)
}
}
var body: some View {
if isPreview {
shareView
.scaleEffect(2)
} else {
mainView
.sheet(isPresented: self.$shareImage.showSheet) {
if let uiImage = self.shareImage.selectedShareImage {
ShareSheet(photo: uiImage)
}
}
}
}
}
struct AllMoodsSharingTemplate_Previews: PreviewProvider {
static var previews: some View {
Group {
AllMoodsTotalTemplate(isPreview: true, startDate: Date(), endDate: Date(), fakeData: true)
AllMoodsTotalTemplate(isPreview: false, startDate: Date(), endDate: Date(), fakeData: true)
AllMoodsTotalTemplate(isPreview: false, startDate: Date(), endDate: Date(), fakeData: true).shareView
}
}
}