// // AllMoods.swift // Feels (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 @State var showSharingTemplate = false @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 entries = [MoodMetrics]() init(isPreview: Bool, startDate: Date, endDate: Date, fakeData: Bool) { self.isPreview = isPreview self.startDate = startDate self.endDate = endDate var moodEntries: [MoodEntry]? if fakeData { moodEntries = PersistenceController.shared.randomEntries(count: 10) } else { moodEntries = PersistenceController.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 { fatalError("no data") } } var image: UIImage { let image = shareView.snapshot() return image } var preview: some View { circularViews .frame(maxWidth: .infinity, alignment: .center) .frame(height: 100) } private var circularViews: some View { VStack { HStack { ForEach(Mood.allValues, id: \.self) { mood in mood.icon .resizable() .aspectRatio(contentMode: .fit) .foregroundColor(moodTint.color(forMood: mood)) } } 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(Color(UIColor.white)) .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(Color(UIColor.white)) .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(Color(UIColor.white)) .padding(2) } } } } } var shareView: some View { VStack { Text(String(format: String(localized: "share_view_all_moods_total_template_title"), totalEntryCount)) .font(.title) .foregroundColor(theme.currentTheme.labelColor) .frame(maxWidth: .infinity, alignment: .center) .padding() circularViews Spacer() }.padding() } var mainView: some View { VStack { shareView .background(Color(UIColor.secondarySystemBackground)) .cornerRadius(10) HStack(alignment: .center) { Button(action: { showSharingTemplate = true }, 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) }.sheet(isPresented: $showSharingTemplate) { ActivityViewController(activityItems: [self.image]) } } var body: some View { if isPreview { preview .padding([.leading, .trailing], -20) } else { mainView .padding([.leading, .trailing, .top]) } } } struct AllMoodsSharingTemplate_Previews: PreviewProvider { static var previews: some View { AllMoodsTotalTemplate(isPreview: true, startDate: Date(), endDate: Date(), fakeData: true) AllMoodsTotalTemplate(isPreview: false, startDate: Date(), endDate: Date(), fakeData: true) } }