Fetch sharing capabilities in ShareTableViewDataSource
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Mon, 18 Mar 2024 10:06:26 +0000 (18:06 +0800)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Wed, 17 Apr 2024 08:39:00 +0000 (16:39 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/ShareCapabilities.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/ShareTableViewDataSource.swift

index 62252a66056f440ad72c599d9acb320efb49433f..497d803e5baa15bb670c395a846dd14337c336b2 100644 (file)
@@ -69,6 +69,11 @@ struct ShareCapabilities {
     private(set) var email = EmailCapabilities(dict: [:])
     private(set) var publicLink = PublicLinkCapabilities(dict: [:])
 
+
+    init() {
+        Logger.shareCapabilities.warning("Providing defaulted share capabilities!")
+    }
+
     init(json: Data) {
         guard let anyJson = try? JSONSerialization.jsonObject(with: json, options: []),
               let jsonDict = anyJson as? [String : Any],
@@ -86,5 +91,7 @@ struct ShareCapabilities {
         if let publicLinkCapabilities = sharingCapabilities["public"] as? [String : Any] {
             publicLink = PublicLinkCapabilities(dict: publicLinkCapabilities)
         }
+
+        Logger.shareCapabilities.debug("Parses share capabilities.")
     }
 }
index 192158be7d0848390eb6b769436f07b44e1f1bb3..22faba216c1b22b9af1f85d950cc2d42fa0e2529 100644 (file)
@@ -43,6 +43,7 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
             )
         }
     }
+    private var shareCapabilities = ShareCapabilities()
 
     func loadItem(url: URL) {
         itemServerRelativePath = nil
@@ -81,6 +82,7 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
             itemServerRelativePath = serverPath as String
             account = convertedAccount
             await sharesTableView?.deselectAll(self)
+            shareCapabilities = await fetchCapabilities()
             shares = await fetch(
                 itemIdentifier: itemIdentifier, itemRelativePath: serverPath as String
             )
@@ -139,6 +141,22 @@ class ShareTableViewDataSource: NSObject, NSTableViewDataSource, NSTableViewDele
         }
     }
 
+    private func fetchCapabilities() async -> ShareCapabilities {
+        return await withCheckedContinuation { continuation in
+            kit?.getCapabilities { account, capabilitiesJson, error in
+                guard error == .success, let capabilitiesJson = capabilitiesJson else {
+                    let errorString = "Error getting server capabilities: \(error.errorDescription)"
+                    Logger.sharesDataSource.error("\(errorString)")
+                    Task { @MainActor in self.uiDelegate?.showError(errorString) }
+                    continuation.resume(returning: ShareCapabilities())
+                    return
+                }
+                Logger.sharesDataSource.info("Successfully retrieved server share capabilities")
+                continuation.resume(returning: ShareCapabilities(json: capabilitiesJson))
+            }
+        }
+    }
+
     // MARK: - NSTableViewDataSource protocol methods
 
     @objc func numberOfRows(in tableView: NSTableView) -> Int {