Make share options view capable of creating or updating view upon clicking "save...
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Wed, 6 Mar 2024 12:09:54 +0000 (20:09 +0800)
committerClaudio Cambra <claudio.cambra@nextcloud.com>
Wed, 17 Apr 2024 08:38:58 +0000 (16:38 +0800)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/Extensions/Logger+Extensions.swift
shell_integration/MacOSX/NextcloudIntegration/FileProviderUIExt/ShareOptionsView.swift

index c668e3a8dd5b88e2deb184e4e742a1e70fe78285..c05677bbf9bbeccacf570a6fbff4b189331946d4 100644 (file)
@@ -13,6 +13,7 @@ extension Logger {
     static let actionViewController = Logger(subsystem: subsystem, category: "actionViewController")
     static let shareController = Logger(subsystem: subsystem, category: "shareController")
     static let sharesDataSource = Logger(subsystem: subsystem, category: "sharesDataSource")
+    static let shareOptionsView = Logger(subsystem: subsystem, category: "shareOptionsView")
     static let shareViewController = Logger(subsystem: subsystem, category: "shareViewController")
 }
 
index 94018ee51b4d778ca311eed4020cab27caf6261f..27920509eb4d42b55ddaf3264c9e6793a13e4f7c 100644 (file)
@@ -8,6 +8,7 @@
 import AppKit
 import Combine
 import NextcloudKit
+import OSLog
 
 class ShareOptionsView: NSView {
     @IBOutlet private weak var labelTextField: NSTextField!
@@ -112,8 +113,6 @@ class ShareOptionsView: NSView {
 
     @IBAction func save(_ sender: Any) {
         Task { @MainActor in
-            guard let controller = controller else { return }
-            let share = controller.share
             let password = passwordProtectCheckbox.state == .on
                 ? passwordSecureField.stringValue
                 : ""
@@ -126,6 +125,75 @@ class ShareOptionsView: NSView {
             let label = labelTextField.stringValue
             let hideDownload = hideDownloadCheckbox.state == .on
             let uploadAndEdit = uploadEditPermissionCheckbox.state == .on
+
+            guard !createMode else {
+                Logger.shareOptionsView.info("Creating new share!")
+
+                guard let dataSource = dataSource,
+                      let kit = dataSource.kit,
+                      let itemServerRelativePath = dataSource.itemServerRelativePath
+                else {
+                    Logger.shareOptionsView.error("Cannot create new share due to missing data.")
+                    Logger.shareOptionsView.error("dataSource: \(self.dataSource)")
+                    Logger.shareOptionsView.error("kit: \(self.dataSource?.kit)")
+                    Logger.shareOptionsView.error(
+                        "path: \(self.dataSource?.itemServerRelativePath ?? "")"
+                    )
+                    return
+                }
+
+                let selectedShareTypeItem = shareTypePicker.selectedItem
+                var selectedShareType = NKShare.ShareType.publicLink
+                if selectedShareTypeItem == publicLinkShareMenuItem {
+                    selectedShareType = .publicLink
+                } else if selectedShareTypeItem == userShareMenuItem {
+                    selectedShareType = .user
+                } else if selectedShareTypeItem == groupShareMenuItem {
+                    selectedShareType = .group
+                } else if selectedShareTypeItem == emailShareMenuItem {
+                    selectedShareType = .email
+                } else if selectedShareTypeItem == federatedCloudShareMenuItem {
+                    selectedShareType = .federatedCloud
+                } else if selectedShareTypeItem == circleShare {
+                    selectedShareType = .circle
+                } else if selectedShareTypeItem == talkConversationShare {
+                    selectedShareType = .talkConversation
+                }
+
+                var permissions = NKShare.PermissionValues.all.rawValue
+                permissions = uploadAndEdit
+                    ? permissions | NKShare.PermissionValues.updateShare.rawValue
+                    : permissions & ~NKShare.PermissionValues.updateShare.rawValue
+
+                setAllFields(enabled: false)
+                deleteButton.isEnabled = false
+                saveButton.isEnabled = false
+                let error = await ShareController.create(
+                    kit: kit,
+                    shareType: selectedShareType,
+                    itemServerRelativePath: itemServerRelativePath,
+                    shareWith: "",
+                    password: password,
+                    expireDate: expireDate,
+                    permissions: permissions,
+                    note: note,
+                    label: label,
+                    hideDownload: hideDownload
+                )
+                if let error = error, error != .success {
+                    dataSource.uiDelegate?.showError("Error creating: \(error.errorDescription)")
+                }
+                await dataSource.reload()
+                return
+            }
+
+            Logger.shareOptionsView.info("Editing existing share!")
+
+            guard let controller = controller else {
+                Logger.shareOptionsView.error("No valid share controller, cannot edit share.")
+                return
+            }
+            let share = controller.share
             let permissions = uploadAndEdit
                 ? share.permissions | NKShare.PermissionValues.updateShare.rawValue
                 : share.permissions & ~NKShare.PermissionValues.updateShare.rawValue
@@ -143,8 +211,11 @@ class ShareOptionsView: NSView {
             )
             if let error = error, error != .success {
                 dataSource?.uiDelegate?.showError("Error updating share: \(error.errorDescription)")
+                setAllFields(enabled: true)
+            } else {
+                dataSource?.uiDelegate?.hideOptions()
+                await dataSource?.reload()
             }
-            await dataSource?.reload()
         }
     }