// // ContentView.swift // BeReal // // Created by Javier Cicchelli on 29/11/2022. // Copyright © 2022 Röck+Cöde. All rights reserved. // import Browse import DataModels import Login import KeychainStorage import Profile import SwiftUI import UseCases struct ContentView: View { // MARK: Storages @KeychainStorage(key: .KeychainStorage.account) private var account: Account? // 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) { // TODO: create a new folder } uploadFile: { // TODO: upload a new file } showProfile: { showSheet = .profile } .sheet(item: $showSheet) { sheet in switch sheet { case .login: LoginView { user = $1 account = $0 } case .profile: ProfileView(user: user) { user = nil account = nil } } } .task(id: account) { await loadUserOrLogin() } } } // MARK: - Views private extension ContentView { struct Container: View { // MARK: Properties @Binding var user: User? let createFolder: ActionClosure let uploadFile: ActionClosure let showProfile: ActionClosure // MARK: Body var body: some View { if let user { NavigationView { BrowseView( folder: .init( id: user.rootFolder.id, name: user.rootFolder.name ), createFolder: createFolder, uploadFile: uploadFile, showProfile: showProfile ) } } else { EmptyView() } } } } // MARK: - Helpers private extension ContentView { func loadUserOrLogin() async { guard let account else { showSheet = .login return } showSheet = nil user = try? await getUser( username: account.username, password: account.password ) } } // MARK: - Previews struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }