diff --git a/Modules/Sources/Browse/Resources/en.lproj/Localizable.strings b/Modules/Sources/Browse/Resources/en.lproj/Localizable.strings index 5336bc7..fd36893 100644 --- a/Modules/Sources/Browse/Resources/en.lproj/Localizable.strings +++ b/Modules/Sources/Browse/Resources/en.lproj/Localizable.strings @@ -25,15 +25,26 @@ "message.type_not_supported.text.second" = "Please be patient while the support for this type of document is being built by our development team."; "message.type_not_supported.button.text" = "Go back to folder"; +// CreateFolderViewModifier + +"create_folder.input_alert.title" = "Create a new folder"; +"create_folder.input_alert.message" = "You are about to create a new folder inside the folder you are currently in."; +"create_folder.input_alert.text_field.placeholder" = "Name of the folder to create"; +"create_folder.input_alert.button.cancel" = "Dismiss"; +"create_folder.input_alert.button.submit" = "Create folder"; +"create_folder.system_alert.title" = "An error occurred while creating a new folder"; +"create_folder.system_alert.message" = "An unexpected error occurred while trying to create a new folder into the current folder.\n\nPlease check your Internet connection and try this operation at a later time."; +"create_folder.system_alert.button.cancel" = "Understood"; + // DeleteItemViewModifier "delete_item.action_sheet.title" = "Delete an item"; "delete_item.action_sheet.message %@" = "You are about to delete an item named \"%@\" from this folder.\n\nAre you sure you wish to proceed?"; "delete_item.action_sheet.button.ok" = "Yes, please delete it."; "delete_item.action_sheet.button.cancel" = "No, I reconsidered."; -"delete_item.system_alert.title" = "..."; -"delete_item.system_alert.message" = "..."; -"delete_item.system_alert.button.dismiss" = "..."; +"delete_item.system_alert.title" = "An error occurred when deleting a folder"; +"delete_item.system_alert.message" = "An unexpected error occurred while trying to delete the indicated folder from the current folder.\n\nPlease check your Internet connection and try this operation at a later time."; +"delete_item.system_alert.button.cancel" = "Understood"; // BrowseView diff --git a/Modules/Sources/Browse/UI/Extensions/View+ViewModifiers.swift b/Modules/Sources/Browse/UI/Extensions/View+ViewModifiers.swift index ce602dc..9761acf 100644 --- a/Modules/Sources/Browse/UI/Extensions/View+ViewModifiers.swift +++ b/Modules/Sources/Browse/UI/Extensions/View+ViewModifiers.swift @@ -22,6 +22,18 @@ extension View { )) } + func createFolder( + isPresenting: Binding, + id: String, + submitted: @escaping ActionClosure + ) -> some View { + modifier(CreateFolderViewModifier( + isPresenting: isPresenting, + id: id, + submitted: submitted + )) + } + func delete( item: Binding<(any FileSystemItem)?>, deleted: @escaping ActionClosure diff --git a/Modules/Sources/Browse/UI/View Modifiers/CreateFolderViewModifier.swift b/Modules/Sources/Browse/UI/View Modifiers/CreateFolderViewModifier.swift new file mode 100644 index 0000000..aad7bb6 --- /dev/null +++ b/Modules/Sources/Browse/UI/View Modifiers/CreateFolderViewModifier.swift @@ -0,0 +1,109 @@ +// +// 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 + } + } +} diff --git a/Modules/Sources/Browse/UI/View Modifiers/DeleteItemViewModifier.swift b/Modules/Sources/Browse/UI/View Modifiers/DeleteItemViewModifier.swift index aa1e6ab..6bc34a7 100644 --- a/Modules/Sources/Browse/UI/View Modifiers/DeleteItemViewModifier.swift +++ b/Modules/Sources/Browse/UI/View Modifiers/DeleteItemViewModifier.swift @@ -115,6 +115,8 @@ private extension DeleteItemViewModifier { password: account.password ) + item = nil + deleted() } catch { showErrorAlert = true