// // ContentView.swift // MyFiles // // Created by Javier Cicchelli on 29/11/2022. // Copyright © 2022 Röck+Cöde. All rights reserved. // import Browse import DataModels import Login import Profile import SwiftUI import UseCases struct ContentView: View { // MARK: States @State private var user: User? @State private var showSheet: SheetView? // MARK: Properties private let getUser: GetUserUseCase = .init() // MARK: Body var body: some View { Container(user: user) { showSheet = .profile } login: { showSheet = .login } .sheet(item: $showSheet) { sheet in switch sheet { case .login: LoginView { user = $0 } case .profile: ProfileView(user: user) { user = nil } } } .onChange(of: user) { showSheet = $0 == nil ? .login : nil } .task { await loadUserOrLogin() } } } // MARK: - Views private extension ContentView { struct Container: View { // MARK: Properties let user: User? let showProfile: ActionClosure let login: ActionClosure // MARK: Body var body: some View { if let user { NavigationView { BrowseView( folder: .init( id: user.rootFolder.id, name: user.rootFolder.name ), showProfile: showProfile, login: login ) } .tint(.red) } else { EmptyView() } } } } // MARK: - Helpers private extension ContentView { func loadUserOrLogin() async { do { user = try await getUser() } catch { showSheet = .login } } } // MARK: - Previews struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }