110 lines
2.2 KiB
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()
|
|
}
|
|
}
|