my-files-sample/Modules/Sources/Browse/UI/View Modifiers/CreateFolderViewModifier.swift

110 lines
3.1 KiB
Swift

//
// CreateFolderViewModifier.swift
// Browse
//
// Created by Javier Cicchelli on 16/12/2022.
// Copyright © 2022 Röck+Cöde. All rights reserved.
//
import DataModels
import KeychainStorage
import SwiftUI
struct CreateFolderViewModifier: ViewModifier {
// MARK: Storages
@KeychainStorage(key: .KeychainStorage.account) private var account: Account?
// MARK: States
@State private var folderName: String = ""
@State private var showErrorAlert: Bool = false
// MARK: Bindings
@Binding var isPresenting: Bool
let id: String
let submitted: ActionClosure
private let createFolder: CreateFolderUseCase = .init()
// MARK: Body
func body(content: Content) -> some View {
content
.background(InputAlertView(
isPresenting: $isPresenting,
title: .localise(key: "create_folder.input_alert.title"),
message: .localise(key: "create_folder.input_alert.message"),
textFieldPlaceholder: .localise(key: "create_folder.input_alert.text_field.placeholder"),
textFieldString: $folderName,
actions: [
.init(
title: .localise(key: "create_folder.input_alert.button.cancel"),
style: .cancel,
handler: { _ in
folderName = .empty
}
),
.init(
title: .localise(key: "create_folder.input_alert.button.submit"),
style: .default,
handler: { _ in
Task {
await addFolder()
}
}
)
]
))
.alert(isPresented: $showErrorAlert) {
Alert(
title: Text(
"create_folder.system_alert.title",
bundle: .module
),
message: Text(
"create_folder.system_alert.message",
bundle: .module
),
dismissButton: .cancel(Text(
"create_folder.system_alert.button.cancel",
bundle: .module
)) {
folderName = .empty
}
)
}
}
}
// MARK: - Helpers
private extension CreateFolderViewModifier {
func addFolder() async {
guard let account else {
showErrorAlert = true
return
}
do {
_ = try await createFolder(
id: id,
name: folderName,
username: account.username,
password: account.password
)
folderName = .empty
submitted()
} catch {
showErrorAlert = true
}
}
}