From 1c04a671840965e2040ae3f0aa98da2203142b4f Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sat, 17 Dec 2022 21:06:30 +0100 Subject: [PATCH] Implemented the UploadView view for the Browse module. --- .../Sources/Browse/UI/Views/UploadView.swift | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 Modules/Sources/Browse/UI/Views/UploadView.swift diff --git a/Modules/Sources/Browse/UI/Views/UploadView.swift b/Modules/Sources/Browse/UI/Views/UploadView.swift new file mode 100644 index 0000000..495a43d --- /dev/null +++ b/Modules/Sources/Browse/UI/Views/UploadView.swift @@ -0,0 +1,78 @@ +// +// UploadView.swift +// Browse +// +// Created by Javier Cicchelli on 17/12/2022. +// Copyright © 2022 Röck+Cöde. All rights reserved. +// + +import DataModels +import Foundation +import KeychainStorage +import SwiftUI + + +struct UploadView: View { + + // MARK: Storages + + @KeychainStorage(key: .KeychainStorage.account) private var account: Account? + + // MARK: States + + @State private var urls: [URL] = [] + + // MARK: Properties + + let id: String + let uploaded: ActionClosure + + private let uploadFile: UploadFileUseCase = .init() + + // MARK: Body + + var body: some View { + DocumentPicker { urls in + Task { await addFile(from: urls) } + } + } + +} + +// MARK: - Helpers + +private extension UploadView { + func addFile(from urls: [URL]) async { + guard let url = urls.first else { + // TODO: Handle this error case. + return + } + guard let account else { + // TODO: Handle this error case. + return + } + + do { + try await uploadFile( + id: id, + url: url, + username: account.username, + password: account.password + ) + + uploaded() + } catch { + // TODO: Handle this error case. + } + } +} + +// MARK: - Previews + +struct UploadView_Previews: PreviewProvider { + static var previews: some View { + UploadView(id: "1234567890") { + // uploaded closure. + } + } +}