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

110 lines
2.2 KiB
Swift

//
// 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()
}
}