@@ -7,6 +7,8 @@ import QuickLook
77import NextcloudKit
88import Mantis
99import SwiftUI
10+ import LucidBanner
11+ import Alamofire
1012
1113public 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