create home view that is the main tab view
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
20
Shared/views/HomeViewTwo.swift
Normal file
20
Shared/views/HomeViewTwo.swift
Normal 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()
|
||||
}
|
||||
}
|
||||
46
Shared/views/MainTabView.swift
Normal file
46
Shared/views/MainTabView.swift
Normal 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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user