Skip to content

Commit 3fe3a8d

Browse files
Improved (#4139)
* wip Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * wip Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * Update NCViewerQuickLook.swift * wip Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> * wip Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com> --------- Signed-off-by: Marino Faggiana <marino.faggiana@nextcloud.com>
1 parent fb01b1e commit 3fe3a8d

2 files changed

Lines changed: 93 additions & 33 deletions

File tree

iOSClient/Utility/NCUtilityFileSystem.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,21 @@ final class NCUtilityFileSystem: NSObject, @unchecked Sendable {
119119
return path
120120
}
121121

122+
func cleanDirectoryProviderStorageOcId(_ ocId: String, userId: String, urlBase: String) -> String {
123+
let path = getDocumentStorage(userId: userId, urlBase: urlBase) + "/" + ocId
124+
125+
do {
126+
if FileManager.default.fileExists(atPath: path) {
127+
try fileManager.removeItem(atPath: path)
128+
try fileManager.createDirectory(atPath: path, withIntermediateDirectories: true)
129+
}
130+
} catch {
131+
print("Error: \(error)")
132+
}
133+
134+
return path
135+
}
136+
122137
func getDirectoryProviderStorageImageOcId(_ ocId: String, etag: String, ext: String, userId: String, urlBase: String) -> String {
123138
return getDirectoryProviderStorageOcId(ocId, userId: userId, urlBase: urlBase) + "/" + etag + ext
124139
}

iOSClient/Viewer/NCViewerQuickLook/NCViewerQuickLook.swift

Lines changed: 78 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import QuickLook
77
import NextcloudKit
88
import Mantis
99
import SwiftUI
10+
import LucidBanner
11+
import Alamofire
1012

1113
public protocol NCViewerQuickLookDelegate: AnyObject {
1214
func dismissQuickLook(fileNameSource: String, hasChangesQuickLook: Bool)
@@ -28,7 +30,7 @@ private var hasChangesQuickLook: Bool = false
2830
private var metadata: tableMetadata?
2931
private var timer: Timer?
3032
/// Used to display the save alert
31-
private var parentVC: UIViewController?
33+
private var viewController: UIViewController?
3234
private let utilityFileSystem = NCUtilityFileSystem()
3335
private let database = NCManageDatabase.shared
3436

@@ -61,11 +63,18 @@ private var hasChangesQuickLook: Bool = false
6163

6264
override func viewDidLoad() {
6365
super.viewDidLoad()
64-
guard isEditingEnabled else { return }
66+
guard isEditingEnabled else {
67+
return
68+
}
6569

6670
if metadata?.isLivePhoto == true {
6771
Task {
68-
// await showErrorBannerActiveScenes(text: "_message_disable_overwrite_livephoto_", errorCode: NCGlobal.shared.errorInternalError)
72+
let windowScene = viewController?.view.window?.windowScene
73+
await showWarningBanner(windowScene: windowScene,
74+
subtitle: "_message_disable_overwrite_livephoto_",
75+
systemImage: "livephoto.slash",
76+
imageAnimation: .bounce,
77+
errorCode: NSURLErrorNotConnectedToInternet)
6978
}
7079
}
7180

@@ -80,7 +89,7 @@ private var hasChangesQuickLook: Bool = false
8089
override func viewDidAppear(_ animated: Bool) {
8190
super.viewDidAppear(animated)
8291
// needs to be saved bc in didDisappear presentingVC is already nil
83-
parentVC = presentingViewController
92+
self.viewController = presentingViewController
8493
}
8594

8695
override func viewDidDisappear(_ animated: Bool) {
@@ -139,7 +148,7 @@ private var hasChangesQuickLook: Bool = false
139148
self.dismiss(animated: true)
140149
})
141150

142-
parentVC?.present(alertController, animated: true)
151+
self.viewController?.present(alertController, animated: true)
143152
}
144153

145154
@objc private func dismissView(_ sender: Any?) {
@@ -200,43 +209,79 @@ extension NCViewerQuickLook: QLPreviewControllerDataSource, QLPreviewControllerD
200209
}
201210

202211
fileprivate func saveModifiedFile(override: Bool) {
203-
guard let metadata = self.metadata else { return }
204-
let session = NCSession.shared.getSession(account: metadata.account)
212+
guard let metadata = self.metadata else {
213+
return
214+
}
205215
if !uploadMetadata {
206216
return self.dismiss(animated: true)
207217
}
208-
let ocId = NSUUID().uuidString
209-
let size = utilityFileSystem.getFileSize(filePath: url.path)
210-
211-
if !override {
212-
let fileName = utilityFileSystem.createFileName(metadata.fileNameView, serverUrl: metadata.serverUrl, account: metadata.account)
213-
metadata.fileName = fileName
214-
metadata.fileNameView = fileName
215-
}
216218

217219
Task { @MainActor in
218-
let fileNamePath = utilityFileSystem.getDirectoryProviderStorageOcId(ocId, fileName: metadata.fileNameView, userId: metadata.userId, urlBase: metadata.urlBase)
219-
guard utilityFileSystem.copyFile(atPath: url.path, toPath: fileNamePath) else { return }
220-
221-
let metadataForUpload = await NCManageDatabaseCreateMetadata().createMetadataAsync(
222-
fileName: metadata.fileName,
223-
ocId: ocId,
224-
serverUrl: metadata.serverUrl,
225-
url: url.path,
226-
session: session,
227-
sceneIdentifier: nil)
228-
229-
metadataForUpload.session = NCNetworking.shared.sessionUploadBackground
220+
var fileName: String
221+
var uploadRequest: UploadRequest?
222+
var banner: LucidBanner?
223+
var token: Int?
224+
let windowScene = viewController?.view.window?.windowScene
225+
var error = NKError()
226+
let serverUrl = metadata.serverUrl
227+
230228
if override {
231-
metadataForUpload.sessionSelector = NCGlobal.shared.selectorUploadFileNODelete
229+
fileName = metadata.fileName
232230
} else {
233-
metadataForUpload.sessionSelector = NCGlobal.shared.selectorUploadFile
231+
fileName = utilityFileSystem.createFileName(metadata.fileNameView, serverUrl: serverUrl, account: metadata.account)
232+
}
233+
let serverUrlFileName = utilityFileSystem.createServerUrl(serverUrl: metadata.serverUrl, fileName: fileName)
234+
235+
(banner, token) = showHudBanner(windowScene: windowScene,
236+
title: "_upload_in_progress_",
237+
stage: .button,
238+
onButtonTap: {
239+
if let request = uploadRequest {
240+
request.cancel()
241+
}
242+
})
243+
244+
let results = await NextcloudKit.shared.uploadAsync(
245+
serverUrlFileName: serverUrlFileName,
246+
fileNameLocalPath: url.path,
247+
autoMkcol: true,
248+
account: metadata.account) { request in
249+
uploadRequest = request
250+
} progressHandler: { progress in
251+
Task {@MainActor in
252+
banner?.update(
253+
payload: LucidBannerPayload.Update(progress: Double(progress.fractionCompleted)),
254+
for: token)
255+
}
256+
}
257+
error = results.error
258+
259+
if error == .success {
260+
let results = await NCNetworking.shared.readFileAsync(serverUrlFileName: serverUrlFileName, account: metadata.account)
261+
error = results.error
262+
263+
if results.error == .success, let metadata = results.metadata {
264+
// clean dir
265+
let directory = utilityFileSystem.cleanDirectoryProviderStorageOcId(metadata.ocId, userId: metadata.userId, urlBase: metadata.urlBase)
266+
// copy new file
267+
utilityFileSystem.copyFile(atPath: url.path, toPath: directory + "/" + metadata.fileName)
268+
// add new metadata
269+
await self.database.addMetadataAsync(metadata)
270+
// reload datasource
271+
await NCNetworking.shared.transferDispatcher.notifyAllDelegatesAsync { delegate in
272+
delegate.transferReloadDataSource(serverUrl: serverUrl, requestData: false, status: nil)
273+
}
274+
}
275+
}
276+
277+
if let banner {
278+
await banner.dismissAsync()
279+
}
280+
281+
if error != .success {
282+
await showErrorBanner(windowScene: windowScene, text: error.errorDescription, errorCode: error.errorCode)
234283
}
235-
metadataForUpload.size = size
236-
metadataForUpload.status = NCGlobal.shared.metadataStatusWaitUpload
237-
metadataForUpload.sessionDate = Date()
238284

239-
self.database.addMetadata(metadataForUpload)
240285
self.dismiss(animated: true)
241286
}
242287
}

0 commit comments

Comments
 (0)