Closer/iphone/Closer/Navigation/ContentView.swift

133 lines
4.1 KiB
Swift

import SwiftUI
struct ContentView: View {
@EnvironmentObject var appState: AppState
@State private var showPairingSuccess = false
@State private var hadCoupleId = false
var body: some View {
NavigationStack {
rootView
}
.environmentObject(appState)
.fullScreenCover(isPresented: $showPairingSuccess) {
PairingSuccessView()
.environmentObject(appState)
}
.onChange(of: appState.currentUser?.coupleId) { _, newValue in
if !hadCoupleId && newValue != nil {
showPairingSuccess = true
}
hadCoupleId = newValue != nil
}
}
@ViewBuilder
private var rootView: some View {
switch appState.authState {
case .loading:
LoadingView(message: "Getting ready...")
case .unauthenticated:
OnboardingFlow()
case .authenticated(_, let isAnonymous):
if isAnonymous {
CreateProfileView()
} else if appState.currentUser?.coupleId == nil {
PairPromptView()
} else {
MainTabView()
}
}
}
}
// MARK: - Main Tab View
struct MainTabView: View {
@EnvironmentObject var appState: AppState
@State private var selectedTab: Tab = .home
enum Tab: Hashable {
case home, dailyQuestion, play, questionPacks, settings
}
var body: some View {
TabView(selection: $selectedTab) {
HomeView()
.tabItem {
Label("Home", systemImage: selectedTab == .home ? "house.fill" : "house")
}
.tag(Tab.home)
DailyQuestionView()
.tabItem {
Label("Today", systemImage: selectedTab == .dailyQuestion ? "heart.fill" : "heart")
}
.tag(Tab.dailyQuestion)
PlayHubView()
.tabItem {
Label("Play", systemImage: selectedTab == .play ? "play.fill" : "play")
}
.tag(Tab.play)
QuestionPackLibraryView()
.tabItem {
Label("Packs", systemImage: selectedTab == .questionPacks ? "star.fill" : "star")
}
.tag(Tab.questionPacks)
SettingsView()
.tabItem {
Label("Settings", systemImage: selectedTab == .settings ? "gearshape.fill" : "gearshape")
}
.tag(Tab.settings)
}
.tint(.closerPrimary)
.onReceive(NotificationCenter.default.publisher(for: .navigateToDailyQuestion)) { _ in
selectedTab = .dailyQuestion
}
.onReceive(NotificationCenter.default.publisher(for: .navigateToReveal)) { _ in
selectedTab = .dailyQuestion
}
.onReceive(NotificationCenter.default.publisher(for: .navigateToHome)) { _ in
selectedTab = .home
}
.onReceive(NotificationCenter.default.publisher(for: .navigateToPlay)) { _ in
selectedTab = .play
}
.onReceive(NotificationCenter.default.publisher(for: .navigateToMemoryLane)) { _ in
selectedTab = .play
}
.onReceive(NotificationCenter.default.publisher(for: .navigateToConnectionChallenges)) { _ in
selectedTab = .play
}
.onReceive(NotificationCenter.default.publisher(for: .navigateToAnswerHistory)) { _ in
selectedTab = .dailyQuestion
}
.onReceive(NotificationCenter.default.publisher(for: .navigateToSettings)) { _ in
selectedTab = .settings
}
}
}
// MARK: - Onboarding Flow
struct OnboardingFlow: View {
@State private var showLogin = false
@State private var showSignUp = false
var body: some View {
OnboardingView(showLogin: $showLogin, showSignUp: $showSignUp)
.navigationDestination(isPresented: $showLogin) {
LoginView()
}
.navigationDestination(isPresented: $showSignUp) {
SignUpView()
}
}
}
// MARK: - Import for Secret
import Foundation