// // HomeViewTwo.swift // Feels (iOS) // // Created by Trey Tartt on 2/18/22. // import SwiftUI struct MonthView: View { @AppStorage(UserDefaultsStore.Keys.needsOnboarding.rawValue, store: GroupUserDefaults.groupDefaults) private var needsOnboarding = true @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system @AppStorage(UserDefaultsStore.Keys.moodTint.rawValue, store: GroupUserDefaults.groupDefaults) private var moodTint: MoodTints = .Default // store a value that gets changed when user updates custom colors to update the view since the moodTint doesn't change @AppStorage(UserDefaultsStore.Keys.customMoodTintUpdateNumber.rawValue, store: GroupUserDefaults.groupDefaults) private var customMoodTintUpdateNumber: Int = 0 @ObservedObject var viewModel = HomeViewViewModel(addMonthStartWeekdayPadding: true) @StateObject private var selectedDetail = StupidAssDetailViewObservableObject() @State private var showingSheet = false @StateObject private var onboardingData = OnboardingDataDataManager.shared class StupidAssDetailViewObservableObject: ObservableObject { @Published var fuckingWrapped: MonthDetailView? = nil @Published var showFuckingSheet = false } let columns = [ GridItem(.flexible(minimum: 5, maximum: 400)), GridItem(.flexible(minimum: 5, maximum: 400)), GridItem(.flexible(minimum: 5, maximum: 400)), GridItem(.flexible(minimum: 5, maximum: 400)), GridItem(.flexible(minimum: 5, maximum: 400)), GridItem(.flexible(minimum: 5, maximum: 400)), GridItem(.flexible(minimum: 5, maximum: 400)) ] var body: some View { ZStack { if viewModel.hasNoData { VStack { Spacer() EmptyHomeView(viewModel: viewModel) .padding() Spacer() } } else { ScrollView { LazyVStack(spacing: 5, pinnedViews: [.sectionHeaders]) { ForEach(viewModel.grouped.sorted(by: { $0.key < $1.key }), id: \.key) { year, months in // for reach month ForEach(months.sorted(by: { $0.key < $1.key }), id: \.key) { month, entries in Section() { homeViewTwoMonthListView(month: month, year: year, entries: entries) } } .padding(.bottom) } .padding() .background( RoundedRectangle(cornerRadius: 10) .foregroundColor( theme.currentTheme.secondaryBGColor ) ) } .padding([.leading, .trailing]) }.sheet(isPresented: $selectedDetail.showFuckingSheet, onDismiss: didDismiss) { selectedDetail.fuckingWrapped } .edgesIgnoringSafeArea(.top) } } .padding(.top) .background( theme.currentTheme.bg .edgesIgnoringSafeArea(.all) ) } func didDismiss() { selectedDetail.showFuckingSheet = false selectedDetail.fuckingWrapped = nil } } extension MonthView { private var topView: some View { VStack { if ShowBasedOnVoteLogics.isMissingCurrentVote(onboardingData: onboardingData.savedOnboardingData) { Text("Vote") } Text("dis top") .foregroundColor(theme.currentTheme.secondaryBGColor) } } private var settingsButtonView: some View { HStack { Spacer() VStack { Button(action: { showingSheet.toggle() }, label: { Image(systemName: "gear") .foregroundColor(Color(UIColor.darkGray)) .font(.system(size: 20)) }).sheet(isPresented: $showingSheet) { SettingsView() } .padding(.top, 60) .padding(.trailing) Spacer() } } } } // view that make up the list body extension MonthView { private func homeViewTwoSectionHeaderView(month: Int, year: Int) -> some View { ZStack { Text("\(Random.monthName(fromMonthInt: month)) \(String(year))") .font(.body) .foregroundColor(theme.currentTheme.labelColor) .frame(maxWidth: .infinity, alignment: .leading) Text(String(customMoodTintUpdateNumber)) .hidden() } } private func homeViewTwoMonthListView(month: Int, year: Int, entries: [MoodEntry]) -> some View { VStack { homeViewTwoSectionHeaderView(month: month, year: year) Divider() LazyVGrid(columns: columns, spacing: 15) { ForEach(entries, id: \.self) { entry in Circle() .foregroundColor(entry.mood == .placeholder ? .clear : moodTint.color(forMood: entry.mood)) .frame(minHeight: 5, idealHeight: 20, maxHeight: 50, alignment: .center) } } } .contentShape(Rectangle()) .onTapGesture{ let deailView = MonthDetailView(monthInt: month, yearInt: year, entries: entries, parentViewModel: viewModel) selectedDetail.fuckingWrapped = deailView selectedDetail.showFuckingSheet = true } } } struct HomeViewTwo_Previews: PreviewProvider { static var previews: some View { MonthView() } }