From 065b7bcac16965b88e04abf009f3f9e575a5b08a Mon Sep 17 00:00:00 2001 From: Trey t Date: Fri, 18 Feb 2022 14:19:37 -0600 Subject: [PATCH] create home view that is the main tab view --- Feels.xcodeproj/project.pbxproj | 16 +- Shared/FeelsApp.swift | 2 +- Shared/views/EmptyView.swift | 6 +- .../{ContentView.swift => HomeView.swift} | 182 ++++++++---------- Shared/views/HomeViewTwo.swift | 20 ++ Shared/views/MainTabView.swift | 46 +++++ 6 files changed, 162 insertions(+), 110 deletions(-) rename Shared/views/{ContentView.swift => HomeView.swift} (84%) create mode 100644 Shared/views/HomeViewTwo.swift create mode 100644 Shared/views/MainTabView.swift diff --git a/Feels.xcodeproj/project.pbxproj b/Feels.xcodeproj/project.pbxproj index b8ab70d..81444b9 100644 --- a/Feels.xcodeproj/project.pbxproj +++ b/Feels.xcodeproj/project.pbxproj @@ -27,6 +27,8 @@ 1C358FBE27B4D1F2002C83A6 /* CurrentStreakTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C358FBD27B4D1F2002C83A6 /* CurrentStreakTemplate.swift */; }; 1C358FC027B4D20C002C83A6 /* MonthTotalTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C358FBF27B4D20C002C83A6 /* MonthTotalTemplate.swift */; }; 1C358FC227B4D227002C83A6 /* WeekTotalTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C358FC127B4D227002C83A6 /* WeekTotalTemplate.swift */; }; + 1C361F0A27C0356000E832FC /* HomeViewTwo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C361F0927C0356000E832FC /* HomeViewTwo.swift */; }; + 1C361F0C27C0356B00E832FC /* MainTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C361F0B27C0356B00E832FC /* MainTabView.swift */; }; 1C4FF3BB27BEDDF000BE8F34 /* ShowBasedOnVoteLogics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4FF3BA27BEDDF000BE8F34 /* ShowBasedOnVoteLogics.swift */; }; 1C4FF3BC27BEDF6600BE8F34 /* ShowBasedOnVoteLogics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4FF3BA27BEDDF000BE8F34 /* ShowBasedOnVoteLogics.swift */; }; 1C4FF3BE27BEDF9100BE8F34 /* PersistenceHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C4FF3BD27BEDF9100BE8F34 /* PersistenceHelper.swift */; }; @@ -58,7 +60,7 @@ 1CAD603827A5C1C800C520BD /* AddMoodHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD602F27A5C1C800C520BD /* AddMoodHeaderView.swift */; }; 1CAD603927A5C1C800C520BD /* HeaderPercView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD603027A5C1C800C520BD /* HeaderPercView.swift */; }; 1CAD603A27A5C1C800C520BD /* BGView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD603127A5C1C800C520BD /* BGView.swift */; }; - 1CAD603B27A5C1C800C520BD /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD603227A5C1C800C520BD /* ContentView.swift */; }; + 1CAD603B27A5C1C800C520BD /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD603227A5C1C800C520BD /* HomeView.swift */; }; 1CAD603C27A5C1C800C520BD /* HeaderStatsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD603327A5C1C800C520BD /* HeaderStatsView.swift */; }; 1CAD603E27A6ECCD00C520BD /* SwitchableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CAD603D27A6ECCD00C520BD /* SwitchableView.swift */; }; 1CB101C527B62A2D00D1C033 /* EmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CB101C427B62A2D00D1C033 /* EmptyView.swift */; }; @@ -159,6 +161,8 @@ 1C358FBD27B4D1F2002C83A6 /* CurrentStreakTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CurrentStreakTemplate.swift; sourceTree = ""; }; 1C358FBF27B4D20C002C83A6 /* MonthTotalTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MonthTotalTemplate.swift; sourceTree = ""; }; 1C358FC127B4D227002C83A6 /* WeekTotalTemplate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeekTotalTemplate.swift; sourceTree = ""; }; + 1C361F0927C0356000E832FC /* HomeViewTwo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewTwo.swift; sourceTree = ""; }; + 1C361F0B27C0356B00E832FC /* MainTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainTabView.swift; sourceTree = ""; }; 1C4FF3BA27BEDDF000BE8F34 /* ShowBasedOnVoteLogics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowBasedOnVoteLogics.swift; sourceTree = ""; }; 1C4FF3BD27BEDF9100BE8F34 /* PersistenceHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceHelper.swift; sourceTree = ""; }; 1C4FF3BF27BEE06900BE8F34 /* PersistenceGET.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersistenceGET.swift; sourceTree = ""; }; @@ -181,7 +185,7 @@ 1CAD602F27A5C1C800C520BD /* AddMoodHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddMoodHeaderView.swift; sourceTree = ""; }; 1CAD603027A5C1C800C520BD /* HeaderPercView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderPercView.swift; sourceTree = ""; }; 1CAD603127A5C1C800C520BD /* BGView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BGView.swift; sourceTree = ""; }; - 1CAD603227A5C1C800C520BD /* ContentView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 1CAD603227A5C1C800C520BD /* HomeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; 1CAD603327A5C1C800C520BD /* HeaderStatsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeaderStatsView.swift; sourceTree = ""; }; 1CAD603D27A6ECCD00C520BD /* SwitchableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwitchableView.swift; sourceTree = ""; }; 1CB101C427B62A2D00D1C033 /* EmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyView.swift; sourceTree = ""; }; @@ -329,14 +333,16 @@ 1C358FB927B35252002C83A6 /* ActivityViewController.swift */, 1CAD602F27A5C1C800C520BD /* AddMoodHeaderView.swift */, 1CAD603127A5C1C800C520BD /* BGView.swift */, - 1CAD603227A5C1C800C520BD /* ContentView.swift */, + 1CAD603227A5C1C800C520BD /* HomeView.swift */, 1C02589B27B9677A00EB91AC /* CreateIconView.swift */, 1CB101C427B62A2D00D1C033 /* EmptyView.swift */, 1CAD602E27A5C1C800C520BD /* FilterView.swift */, 1CAD602D27A5C1C800C520BD /* GraphView.swift */, 1CAD603027A5C1C800C520BD /* HeaderPercView.swift */, 1CAD603327A5C1C800C520BD /* HeaderStatsView.swift */, + 1C361F0927C0356000E832FC /* HomeViewTwo.swift */, 1CEC966E27B9C29300CC8688 /* IconView.swift */, + 1C361F0B27C0356B00E832FC /* MainTabView.swift */, 1CAD602C27A5C1C800C520BD /* SettingsView.swift */, 1C358FB027B0AD87002C83A6 /* SharingListView.swift */, 1C358FB427B0ADF3002C83A6 /* SharingTemplates */, @@ -677,7 +683,7 @@ 1CD90B16278C7DE0001C4FEA /* Feels.xcdatamodeld in Sources */, 1C4FF3BE27BEDF9100BE8F34 /* PersistenceHelper.swift in Sources */, 1CC469AA278F30A0003E0C6E /* BGTask.swift in Sources */, - 1CAD603B27A5C1C800C520BD /* ContentView.swift in Sources */, + 1CAD603B27A5C1C800C520BD /* HomeView.swift in Sources */, 1C5F4976279C84090092F1B4 /* OnboardingData.swift in Sources */, 1CAD603427A5C1C800C520BD /* SmallRollUpHeaderView.swift in Sources */, 1CAD603A27A5C1C800C520BD /* BGView.swift in Sources */, @@ -710,7 +716,9 @@ 1C358FC027B4D20C002C83A6 /* MonthTotalTemplate.swift in Sources */, 1CA03777279A295600D26164 /* OnboardingTitle.swift in Sources */, 1C4FF3C027BEE06900BE8F34 /* PersistenceGET.swift in Sources */, + 1C361F0C27C0356B00E832FC /* MainTabView.swift in Sources */, 1CEC967127B9C2BB00CC8688 /* CustomIcon.swift in Sources */, + 1C361F0A27C0356000E832FC /* HomeViewTwo.swift in Sources */, 1C358FAD27ADD0C3002C83A6 /* Theme.swift in Sources */, 1C02589C27B9677A00EB91AC /* CreateIconView.swift in Sources */, 1C358FC227B4D227002C83A6 /* WeekTotalTemplate.swift in Sources */, diff --git a/Shared/FeelsApp.swift b/Shared/FeelsApp.swift index ec240e2..7ca3df2 100644 --- a/Shared/FeelsApp.swift +++ b/Shared/FeelsApp.swift @@ -26,7 +26,7 @@ struct FeelsApp: App { var body: some Scene { WindowGroup { - ContentView() + MainTabView() .environment(\.managedObjectContext, persistenceController.viewContext) }.onChange(of: scenePhase) { phase in if phase == .background { diff --git a/Shared/views/EmptyView.swift b/Shared/views/EmptyView.swift index 7ddcbd3..2adf3d5 100644 --- a/Shared/views/EmptyView.swift +++ b/Shared/views/EmptyView.swift @@ -7,7 +7,7 @@ import SwiftUI -struct EmptyContentView: View { +struct EmptyHomeView: View { @AppStorage(UserDefaultsStore.Keys.theme.rawValue, store: GroupUserDefaults.groupDefaults) private var theme: Theme = .system let viewModel: ContentModeViewModel @@ -38,8 +38,8 @@ struct EmptyContentView: View { } } -struct EmptyContentView_Previews: PreviewProvider { +struct EmptyHomeView_Previews: PreviewProvider { static var previews: some View { - EmptyContentView(viewModel: ContentModeViewModel()) + EmptyHomeView(viewModel: ContentModeViewModel()) } } diff --git a/Shared/views/ContentView.swift b/Shared/views/HomeView.swift similarity index 84% rename from Shared/views/ContentView.swift rename to Shared/views/HomeView.swift index a205342..6389880 100644 --- a/Shared/views/ContentView.swift +++ b/Shared/views/HomeView.swift @@ -1,5 +1,5 @@ // -// ContentView.swift +// HomeView.swift // Shared // // Created by Trey Tartt on 1/5/22. @@ -9,12 +9,12 @@ import SwiftUI import CoreData import Charts -struct ContentViewConstants { +struct HomeViewConstants { static let maxHeaderHeight = 200.0 static let minHeaderHeight = 120.0 } -struct ContentView: View { +struct HomeView: View { @Environment(\.managedObjectContext) private var viewContext @AppStorage(UserDefaultsStore.Keys.needsOnboarding.rawValue, store: GroupUserDefaults.groupDefaults) private var needsOnboarding = true @@ -41,11 +41,11 @@ struct ContentView: View { @State private var showUpdateEntryAlert = false // MARK: header properties - @State private var headerHeight: CGFloat = ContentViewConstants.maxHeaderHeight + @State private var headerHeight: CGFloat = HomeViewConstants.maxHeaderHeight @State private var headerViewType: MainSwitchableViewType = .total @State private var headerOpacity: Double = 1.0 // - + @ObservedObject var viewModel = ContentModeViewModel() init(){ @@ -55,60 +55,38 @@ struct ContentView: View { } var body: some View { - TabView { - mainView - .tabItem { - Label(String(localized: "content_view_tab_main"), systemImage: "list.dash") + mainView + .alert(updateTitleHeader(forEntry: selectedEntry), + isPresented: $showUpdateEntryAlert) { + ForEach(Mood.allValues) { mood in + Button(mood.strValue, action: { + if let selectedEntry = selectedEntry { + viewModel.update(entry: selectedEntry, toMood: mood) + } + showUpdateEntryAlert = false + selectedEntry = nil + }) } - - FilterView() - .tabItem { - Label(String(localized: "content_view_tab_filter"), systemImage: "calendar.circle") + + if let selectedEntry = selectedEntry, + deleteEnabled, + selectedEntry.mood != .missing { + Button(String(localized: "content_view_delete_entry"), action: { + viewModel.update(entry: selectedEntry, toMood: Mood.missing) + showUpdateEntryAlert = false + }) } - - SharingListView() - .tabItem { - Label(String(localized: "content_view_tab_share"), systemImage: "square.and.arrow.up") - } - }.sheet(isPresented: $needsOnboarding, onDismiss: { - - }, content: { - OnboardingMain(onboardingData: viewModel.savedOnboardingData, - updateBoardingDataClosure: { onboardingData in - needsOnboarding = false - viewModel.updateOnboardingData(onboardingData: onboardingData) - }) - }).alert(updateTitleHeader(forEntry: selectedEntry), - isPresented: $showUpdateEntryAlert) { - ForEach(Mood.allValues) { mood in - Button(mood.strValue, action: { - if let selectedEntry = selectedEntry { - viewModel.update(entry: selectedEntry, toMood: mood) - } - showUpdateEntryAlert = false + + Button(String(localized: "content_view_fill_in_missing_entry_cancel"), role: .cancel, action: { selectedEntry = nil - }) - } - - if let selectedEntry = selectedEntry, - deleteEnabled, - selectedEntry.mood != .missing { - Button(String(localized: "content_view_delete_entry"), action: { - viewModel.update(entry: selectedEntry, toMood: Mood.missing) showUpdateEntryAlert = false }) } - - Button(String(localized: "content_view_fill_in_missing_entry_cancel"), role: .cancel, action: { - selectedEntry = nil - showUpdateEntryAlert = false - }) - } } // MARK: functions that do view type work func calcuateViewAlpha() { - let perc = (((Double(headerHeight) - ContentViewConstants.minHeaderHeight) * 100) / (ContentViewConstants.maxHeaderHeight - ContentViewConstants.minHeaderHeight)) / 100 + let perc = (((Double(headerHeight) - HomeViewConstants.minHeaderHeight) * 100) / (HomeViewConstants.maxHeaderHeight - HomeViewConstants.minHeaderHeight)) / 100 headerOpacity = perc } @@ -159,6 +137,54 @@ struct ContentView: View { } // MARK: Views + public var mainView: some View { + VStack { + settingsButtonView + if viewModel.hasNoData { + Spacer() + EmptyHomeView(viewModel: viewModel) + Spacer() + } else { + ZStack { + VStack { + headerView + Spacer() + } + .opacity(headerOpacity) + + VStack { + SmallRollUpHeaderView(fakeData: false, + backDays: $currentSelectedHeaderViewBackDays, + viewType: $currentSelectedHeaderViewViewType) + .background( + Color(theme.currentTheme.secondaryBGColor) + ) + .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) + .padding([.top, .bottom], 5) + + Spacer() + } + .opacity(1 - headerOpacity) + } + .frame(height: headerHeight + 20) + + + listView + .padding(.top, -25) + } + } + .padding() + .padding(.bottom, 5) + .background( + theme.currentTheme.bg + .edgesIgnoringSafeArea(.all) + ) + .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in + PersistenceController.shared.fillInMissingDates() + viewModel.updateData() + } + } + private var settingsButtonView: some View { HStack { Spacer() @@ -260,65 +286,17 @@ struct ContentView: View { .coordinateSpace(name: "scroll") .onPreferenceChange(ViewOffsetKey.self) { value in if viewModel.numberOfItems > 10 { - calculateHeight(minHeight: ContentViewConstants.minHeaderHeight, - maxHeight: ContentViewConstants.maxHeaderHeight, + calculateHeight(minHeight: HomeViewConstants.minHeaderHeight, + maxHeight: HomeViewConstants.maxHeaderHeight, yOffset: value) } } .cornerRadius(10, corners: [.topLeft, .topRight]) } - - private var mainView: some View { - VStack { - settingsButtonView - if viewModel.hasNoData { - Spacer() - EmptyContentView(viewModel: viewModel) - Spacer() - } else { - ZStack { - VStack { - headerView - Spacer() - } - .opacity(headerOpacity) - - VStack { - SmallRollUpHeaderView(fakeData: false, - backDays: $currentSelectedHeaderViewBackDays, - viewType: $currentSelectedHeaderViewViewType) - .background( - Color(theme.currentTheme.secondaryBGColor) - ) - .cornerRadius(10, corners: [.topLeft, .topRight, .bottomLeft, .bottomRight]) - .padding([.top, .bottom], 5) - - Spacer() - } - .opacity(1 - headerOpacity) - } - .frame(height: headerHeight + 20) - - - listView - .padding(.top, -25) - } - } - .padding() - .padding(.bottom, 5) - .background( - theme.currentTheme.bg - .edgesIgnoringSafeArea(.all) - ) - .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in - PersistenceController.shared.fillInMissingDates() - viewModel.updateData() - } - } } // view that make up the list body -extension ContentView { +extension HomeView { private func SectionHeaderView(month: Int, year: Int) -> some View { Text("\(Random.monthName(fromMonthInt: month)) \(String(year))") .font(.title) @@ -395,12 +373,12 @@ private let itemFormatter: DateFormatter = { struct ContentView_Previews: PreviewProvider { static var previews: some View { - ContentView().environment(\.managedObjectContext, PersistenceController.shared.viewContext) + HomeView().environment(\.managedObjectContext, PersistenceController.shared.viewContext) .onAppear(perform: { PersistenceController.shared.populateMemory() }) - ContentView() + HomeView() .preferredColorScheme(.dark) .environment(\.managedObjectContext, PersistenceController.shared.viewContext) } diff --git a/Shared/views/HomeViewTwo.swift b/Shared/views/HomeViewTwo.swift new file mode 100644 index 0000000..b2965d9 --- /dev/null +++ b/Shared/views/HomeViewTwo.swift @@ -0,0 +1,20 @@ +// +// HomeViewTwo.swift +// Feels (iOS) +// +// Created by Trey Tartt on 2/18/22. +// + +import SwiftUI + +struct HomeViewTwo: View { + var body: some View { + Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/) + } +} + +struct HomeViewTwo_Previews: PreviewProvider { + static var previews: some View { + HomeViewTwo() + } +} diff --git a/Shared/views/MainTabView.swift b/Shared/views/MainTabView.swift new file mode 100644 index 0000000..811763b --- /dev/null +++ b/Shared/views/MainTabView.swift @@ -0,0 +1,46 @@ +// +// MainTabView.swift +// Feels (iOS) +// +// Created by Trey Tartt on 2/18/22. +// + +import SwiftUI + +struct MainTabView: View { + @AppStorage(UserDefaultsStore.Keys.needsOnboarding.rawValue, store: GroupUserDefaults.groupDefaults) private var needsOnboarding = true + @ObservedObject var viewModel = ContentModeViewModel() + + var body: some View { + TabView { + HomeView() + .tabItem { + Label(String(localized: "content_view_tab_main"), systemImage: "list.dash") + } + + FilterView() + .tabItem { + Label(String(localized: "content_view_tab_filter"), systemImage: "calendar.circle") + } + + SharingListView() + .tabItem { + Label(String(localized: "content_view_tab_share"), systemImage: "square.and.arrow.up") + } + }.sheet(isPresented: $needsOnboarding, onDismiss: { + + }, content: { + OnboardingMain(onboardingData: viewModel.savedOnboardingData, + updateBoardingDataClosure: { onboardingData in + needsOnboarding = false + viewModel.updateOnboardingData(onboardingData: onboardingData) + }) + }) + } +} + +struct MainTabView_Previews: PreviewProvider { + static var previews: some View { + MainTabView() + } +}