my-files-sample/BeReal/UI/Views/ContentView.swift

122 lines
2.6 KiB
Swift

//
// 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 {
account = $0
user = $1
}
case .profile:
ProfileView(user: user) {
account = nil
user = nil
}
}
}
.task(id: account) {
await loadUserOrLogin()
}
}
}
// MARK: - Views
private extension ContentView {
struct Container: View {
// MARK: Properties
let 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()
}
}