105 lines
2.1 KiB
Swift
105 lines
2.1 KiB
Swift
|
//
|
||
|
// DownloadView.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 DownloadView: View {
|
||
|
|
||
|
// MARK: Storages
|
||
|
|
||
|
@KeychainStorage(key: .KeychainStorage.account) private var account: Account?
|
||
|
|
||
|
// MARK: States
|
||
|
|
||
|
@State private var data: Data?
|
||
|
|
||
|
// MARK: Properties
|
||
|
|
||
|
private let id: String
|
||
|
private let name: String
|
||
|
private let downloaded: ActionClosure
|
||
|
|
||
|
private let getData: GetDataUseCase = .init()
|
||
|
|
||
|
// MARK: Initialisers
|
||
|
|
||
|
init(
|
||
|
id: String,
|
||
|
name: String,
|
||
|
data: Data? = nil,
|
||
|
downloaded: @escaping ActionClosure
|
||
|
) {
|
||
|
self.id = id
|
||
|
self.name = name
|
||
|
self.downloaded = downloaded
|
||
|
|
||
|
self._data = .init(initialValue: data)
|
||
|
}
|
||
|
|
||
|
// MARK: Body
|
||
|
|
||
|
var body: some View {
|
||
|
if let data {
|
||
|
SaveDocumentPicker(
|
||
|
fileName: name,
|
||
|
fileData: data
|
||
|
) { error in
|
||
|
guard error == nil else {
|
||
|
// TODO: Handle this error case.
|
||
|
return
|
||
|
}
|
||
|
|
||
|
downloaded()
|
||
|
}
|
||
|
} else {
|
||
|
LoadingView()
|
||
|
.task {
|
||
|
await loadData()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// MARK: - Helpers
|
||
|
|
||
|
private extension DownloadView {
|
||
|
func loadData() async {
|
||
|
guard let account else {
|
||
|
// TODO: Handle this error case.
|
||
|
return
|
||
|
}
|
||
|
|
||
|
do {
|
||
|
data = try await getData(
|
||
|
id: id,
|
||
|
username: account.username,
|
||
|
password: account.password
|
||
|
)
|
||
|
} catch {
|
||
|
// TODO: Handle this error case.
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MARK: - Previews
|
||
|
|
||
|
struct DownloadView_Previews: PreviewProvider {
|
||
|
static var previews: some View {
|
||
|
DownloadView(
|
||
|
id: "1234567890",
|
||
|
name: "some-name.txt"
|
||
|
) {
|
||
|
// Downloaded closure.
|
||
|
}
|
||
|
}
|
||
|
}
|