create home view that is the main tab view

This commit is contained in:
Trey t
2022-02-18 14:19:37 -06:00
parent 43bbaa4546
commit 065b7bcac1
6 changed files with 162 additions and 110 deletions

View File

@@ -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 {

View File

@@ -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())
}
}

View File

@@ -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)
}

View File

@@ -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()
}
}

View File

@@ -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()
}
}