From 39a78c56b6a03b93d75d5ba6c7ead76a1950964a Mon Sep 17 00:00:00 2001 From: Angelo Stavrow Date: Sun, 12 Feb 2023 11:14:26 -0500 Subject: [PATCH] Fix sharing picker and prep for v1.0 release of Mac app (#242) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Present sharing menu in background, not popover * Write logs to new post (#236) * Set the post editor font in the updateUIView method (#237) * Wrap becomeFirstResponder in async dispatch This fixes issues when we’re updating the responder chain every time SwiftUI refreshes the view, which can have unpredictable side effects. * Set the font in the updateUIView method * Bump build number and update change log * Don't navigate to new/last draft on launch (#238) * Only navigate to new/last draft on launch on macOS This is causing the app to crash on launch when there are no existing posts, so we’re going to remove it for now while we investigate. * Bump build number and update change log * Revert "Don't navigate to new/last draft on launch (#238)" (#239) This reverts commit f4ba5f9a901e37b7f47d620f88fc43ca49a90abe. * Revert "Set the post editor font in the updateUIView method (#237)" (#240) This reverts commit d46eb639addb4aa9fb4bcbe267a633ef988d2862. * Squashed commit of the following: commit 804255b1da2820d9c5a8850d31ae80e556afccd5 Merge: a799fd6 d46eb63 Author: Angelo Stavrow Date: Sun Dec 18 15:28:10 2022 -0500 Merge branch 'main' into fix-crash-on-launch-tmp-no-nav commit a799fd62102f327d928b138c90a6fd5b7862d5b6 Author: Angelo Stavrow Date: Sun Dec 18 08:16:34 2022 -0500 Bump build number and update change log commit b81276d6293560f7a6d02e5f80197c04949106df Author: Angelo Stavrow Date: Sun Dec 18 08:16:16 2022 -0500 Only navigate to new/last draft on launch on macOS This is causing the app to crash on launch when there are no existing posts, so we’re going to remove it for now while we investigate. * Update change log * Set the post editor font in the updateUIView method commit f9f94b48d3465f9bcfc47ea5e478cc1d66da9a4d Author: Angelo Stavrow Date: Thu Dec 29 10:05:03 2022 -0500 Fix missed changes in change log commit 593cc8f1fa83feec923905a5004b885fa68e3003 Author: Angelo Stavrow Date: Thu Dec 29 09:46:36 2022 -0500 Bump patch version and build number commit e0f752e6a4828c3d09649da8f9fe5a1902a2f137 Author: Angelo Stavrow Date: Mon Dec 12 07:47:37 2022 -0500 Bump build number and update change log commit 2f7163dff4ca9d3279c553190b78d2d47277a03e Author: Angelo Stavrow Date: Thu Dec 29 09:43:00 2022 -0500 Update change log commit e42436676d2ce2e70e96a18364cb8127a5921cb5 Author: Angelo Stavrow Date: Thu Dec 29 09:40:27 2022 -0500 Squashed commit of the following: commit 804255b1da2820d9c5a8850d31ae80e556afccd5 Merge: a799fd6 d46eb63 Author: Angelo Stavrow Date: Sun Dec 18 15:28:10 2022 -0500 Merge branch 'main' into fix-crash-on-launch-tmp-no-nav commit a799fd62102f327d928b138c90a6fd5b7862d5b6 Author: Angelo Stavrow Date: Sun Dec 18 08:16:34 2022 -0500 Bump build number and update change log commit b81276d6293560f7a6d02e5f80197c04949106df Author: Angelo Stavrow Date: Sun Dec 18 08:16:16 2022 -0500 Only navigate to new/last draft on launch on macOS This is causing the app to crash on launch when there are no existing posts, so we’re going to remove it for now while we investigate. commit d7c03b9d2d1165a9b34d96a4e5350214211c1643 Author: Angelo Stavrow Date: Thu Dec 29 09:26:18 2022 -0500 Revert "Set the post editor font in the updateUIView method (#237)" (#240) This reverts commit d46eb639addb4aa9fb4bcbe267a633ef988d2862. commit 43b53c6e456d7b59e7363d1591363c58a246b4be Author: Angelo Stavrow Date: Thu Dec 29 09:25:36 2022 -0500 Revert "Don't navigate to new/last draft on launch (#238)" (#239) This reverts commit f4ba5f9a901e37b7f47d620f88fc43ca49a90abe. commit 34546f994efaa77d21ff51aad84201f2dbbffd3e Author: Angelo Stavrow Date: Thu Dec 29 09:06:31 2022 -0500 Don't navigate to new/last draft on launch (#238) * Only navigate to new/last draft on launch on macOS This is causing the app to crash on launch when there are no existing posts, so we’re going to remove it for now while we investigate. * Bump build number and update change log commit bc3bc23308ec3deeb78530715e2b6ef745ec93f2 Author: Angelo Stavrow Date: Mon Dec 12 07:47:37 2022 -0500 Bump build number and update change log commit 7703e925b77bd8eac38d1bdcbe45ff6f1a5e0f23 Author: Angelo Stavrow Date: Mon Dec 12 07:40:41 2022 -0500 Set the font in the updateUIView method commit 6e60e0ded5d9f1ffe48a3dd0201f41371ddff5ff Author: Angelo Stavrow Date: Mon Dec 12 07:40:11 2022 -0500 Wrap becomeFirstResponder in async dispatch This fixes issues when we’re updating the responder chain every time SwiftUI refreshes the view, which can have unpredictable side effects. * Squashed commit of the following: commit f9f94b48d3465f9bcfc47ea5e478cc1d66da9a4d Author: Angelo Stavrow Date: Thu Dec 29 10:05:03 2022 -0500 Fix missed changes in change log commit 593cc8f1fa83feec923905a5004b885fa68e3003 Author: Angelo Stavrow Date: Thu Dec 29 09:46:36 2022 -0500 Bump patch version and build number commit e0f752e6a4828c3d09649da8f9fe5a1902a2f137 Author: Angelo Stavrow Date: Mon Dec 12 07:47:37 2022 -0500 Bump build number and update change log commit 2f7163dff4ca9d3279c553190b78d2d47277a03e Author: Angelo Stavrow Date: Thu Dec 29 09:43:00 2022 -0500 Update change log commit e42436676d2ce2e70e96a18364cb8127a5921cb5 Author: Angelo Stavrow Date: Thu Dec 29 09:40:27 2022 -0500 Squashed commit of the following: commit 804255b1da2820d9c5a8850d31ae80e556afccd5 Merge: a799fd6 d46eb63 Author: Angelo Stavrow Date: Sun Dec 18 15:28:10 2022 -0500 Merge branch 'main' into fix-crash-on-launch-tmp-no-nav commit a799fd62102f327d928b138c90a6fd5b7862d5b6 Author: Angelo Stavrow Date: Sun Dec 18 08:16:34 2022 -0500 Bump build number and update change log commit b81276d6293560f7a6d02e5f80197c04949106df Author: Angelo Stavrow Date: Sun Dec 18 08:16:16 2022 -0500 Only navigate to new/last draft on launch on macOS This is causing the app to crash on launch when there are no existing posts, so we’re going to remove it for now while we investigate. commit d7c03b9d2d1165a9b34d96a4e5350214211c1643 Author: Angelo Stavrow Date: Thu Dec 29 09:26:18 2022 -0500 Revert "Set the post editor font in the updateUIView method (#237)" (#240) This reverts commit d46eb639addb4aa9fb4bcbe267a633ef988d2862. commit 43b53c6e456d7b59e7363d1591363c58a246b4be Author: Angelo Stavrow Date: Thu Dec 29 09:25:36 2022 -0500 Revert "Don't navigate to new/last draft on launch (#238)" (#239) This reverts commit f4ba5f9a901e37b7f47d620f88fc43ca49a90abe. commit 34546f994efaa77d21ff51aad84201f2dbbffd3e Author: Angelo Stavrow Date: Thu Dec 29 09:06:31 2022 -0500 Don't navigate to new/last draft on launch (#238) * Only navigate to new/last draft on launch on macOS This is causing the app to crash on launch when there are no existing posts, so we’re going to remove it for now while we investigate. * Bump build number and update change log commit bc3bc23308ec3deeb78530715e2b6ef745ec93f2 Author: Angelo Stavrow Date: Mon Dec 12 07:47:37 2022 -0500 Bump build number and update change log commit 7703e925b77bd8eac38d1bdcbe45ff6f1a5e0f23 Author: Angelo Stavrow Date: Mon Dec 12 07:40:41 2022 -0500 Set the font in the updateUIView method commit 6e60e0ded5d9f1ffe48a3dd0201f41371ddff5ff Author: Angelo Stavrow Date: Mon Dec 12 07:40:11 2022 -0500 Wrap becomeFirstResponder in async dispatch This fixes issues when we’re updating the responder chain every time SwiftUI refreshes the view, which can have unpredictable side effects. * Set the font in the updateUIView method Also, wrap becomeFirstResponder in async dispatch This fixes issues when we’re updating the responder chain every time SwiftUI refreshes the view, which can have unpredictable side effects. * Fix crash-on-launch when post list is empty (#241) * Apply a quarter-second delay to the dispatched call * Update change log * Fix nav-back bug when launching to last draft * Improve keyboard present/dismiss animations * Update change log and bump build number * Update change log and bump build number * Adjust initial frame size * Bump minimum version to macOS 12 * Bump version and build number * Bump build number * Bump build number (again?) * Undo initial sizing of settings window * Bump build number * Improve share button services Adds two useful services to which the user can share a post: copy-URL-to-pasteboard (custom), and add-to-reading-list (system-provided). * Improve initial layout of window --- Shared/Navigation/ContentView.swift | 10 ++++- .../project.pbxproj | 14 +++--- macOS/Navigation/ActivePostToolbarView.swift | 9 ++-- .../PostEditor/PostEditorSharingPicker.swift | 45 ++++++++++++++++--- 4 files changed, 58 insertions(+), 20 deletions(-) diff --git a/Shared/Navigation/ContentView.swift b/Shared/Navigation/ContentView.swift index bbbd598..3a088d3 100644 --- a/Shared/Navigation/ContentView.swift +++ b/Shared/Navigation/ContentView.swift @@ -36,7 +36,7 @@ struct ContentView: View { }, label: { Image(systemName: "square.and.pencil") }) .help("Create a new local draft.") } - .frame(idealWidth: 200) + .frame(width: 200) #else CollectionListView() .withErrorHandling() @@ -46,7 +46,7 @@ struct ContentView: View { ZStack { PostListView(selectedCollection: model.selectedCollection, showAllPosts: model.showAllPosts) .withErrorHandling() - .frame(idealWidth: 300) + .frame(width: 300) if model.isProcessingRequest { ZStack { Color(NSColor.controlBackgroundColor).opacity(0.75) @@ -59,8 +59,14 @@ struct ContentView: View { .withErrorHandling() #endif + #if os(macOS) Text("Select a post, or create a new local draft.") .foregroundColor(.secondary) + .frame(width: 500, height: 500) + #else + Text("Select a post, or create a new local draft.") + .foregroundColor(.secondary) + #endif } .environmentObject(model) .onChange(of: model.hasError) { value in diff --git a/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj b/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj index fed886e..7177fb9 100644 --- a/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj +++ b/WriteFreely-MultiPlatform.xcodeproj/project.pbxproj @@ -1278,7 +1278,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 690; + CURRENT_PROJECT_VERSION = 704; DEVELOPMENT_TEAM = TPPAB4YBA6; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; @@ -1287,8 +1287,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 11.0; - MARKETING_VERSION = 0.7.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = "com.abunchtell.WriteFreely-MultiPlatform"; PRODUCT_NAME = "WriteFreely for Mac"; SDKROOT = macosx; @@ -1305,7 +1305,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 690; + CURRENT_PROJECT_VERSION = 704; DEVELOPMENT_TEAM = TPPAB4YBA6; ENABLE_HARDENED_RUNTIME = YES; ENABLE_PREVIEWS = YES; @@ -1314,8 +1314,8 @@ "$(inherited)", "@executable_path/../Frameworks", ); - MACOSX_DEPLOYMENT_TARGET = 11.0; - MARKETING_VERSION = 0.7.0; + MACOSX_DEPLOYMENT_TARGET = 12.0; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = "com.abunchtell.WriteFreely-MultiPlatform"; PRODUCT_NAME = "WriteFreely for Mac"; SDKROOT = macosx; @@ -1374,6 +1374,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 702; DEVELOPMENT_TEAM = TPPAB4YBA6; INFOPLIST_FILE = "Tests macOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( @@ -1396,6 +1397,7 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 702; DEVELOPMENT_TEAM = TPPAB4YBA6; INFOPLIST_FILE = "Tests macOS/Info.plist"; LD_RUNPATH_SEARCH_PATHS = ( diff --git a/macOS/Navigation/ActivePostToolbarView.swift b/macOS/Navigation/ActivePostToolbarView.swift index 15955f2..530199b 100644 --- a/macOS/Navigation/ActivePostToolbarView.swift +++ b/macOS/Navigation/ActivePostToolbarView.swift @@ -76,13 +76,12 @@ struct ActivePostToolbarView: View { ) .disabled(activePost.status == PostStatus.local.rawValue) .help("Copy the post's URL to your Mac's pasteboard.") - .popover(isPresented: $isPresentingSharingServicePicker) { + .background( PostEditorSharingPicker( isPresented: $isPresentingSharingServicePicker, sharingItems: createPostUrl() ) - .frame(width: .zero, height: .zero) - } + ) Button(action: { publishPost(activePost) }, label: { Image(systemName: "paperplane") }) .disabled(activePost.body.isEmpty || activePost.status == PostStatus.published.rawValue) .help("Publish the post to the web.\(model.account.isLoggedIn ? "" : " You must be logged in to do this.")") // swiftlint:disable:this line_length @@ -104,7 +103,7 @@ struct ActivePostToolbarView: View { }) } - private func createPostUrl() -> [Any] { + private func createPostUrl() -> [NSURL] { guard let postId = model.selectedPost?.postId else { return [] } var urlString: String @@ -116,7 +115,7 @@ struct ActivePostToolbarView: View { let baseURL = urls.first?.url ?? "\(model.account.server)/\(postCollectionAlias)/" urlString = "\(baseURL)\(postSlug)" } else { - // This is a draft post, sho share the URL as server/postID + // This is a draft post, so share the URL as server/postID urlString = "\(model.account.server)/\(postId)" } diff --git a/macOS/PostEditor/PostEditorSharingPicker.swift b/macOS/PostEditor/PostEditorSharingPicker.swift index 02f7c96..b75a65a 100644 --- a/macOS/PostEditor/PostEditorSharingPicker.swift +++ b/macOS/PostEditor/PostEditorSharingPicker.swift @@ -2,20 +2,22 @@ import SwiftUI struct PostEditorSharingPicker: NSViewRepresentable { @Binding var isPresented: Bool - var sharingItems: [Any] = [] + var sharingItems: [NSURL] = [] func makeNSView(context: Context) -> some NSView { let view = NSView() - let picker = NSSharingServicePicker(items: sharingItems) - picker.delegate = context.coordinator - - DispatchQueue.main.async { - picker.show(relativeTo: .zero, of: view, preferredEdge: .minY) - } return view } func updateNSView(_ nsView: NSViewType, context: Context) { + if isPresented { + let picker = NSSharingServicePicker(items: sharingItems) + picker.delegate = context.coordinator + + DispatchQueue.main.async { + picker.show(relativeTo: .zero, of: nsView, preferredEdge: .minY) + } + } } func makeCoordinator() -> Coordinator { @@ -24,10 +26,38 @@ struct PostEditorSharingPicker: NSViewRepresentable { class Coordinator: NSObject, NSSharingServicePickerDelegate { let owner: PostEditorSharingPicker + init(owner: PostEditorSharingPicker) { self.owner = owner } + func sharingServicePicker( + _ sharingServicePicker: NSSharingServicePicker, + sharingServicesForItems items: [Any], + proposedSharingServices proposedServices: [NSSharingService] + ) -> [NSSharingService] { + guard let copyIcon = NSImage(systemSymbolName: "doc.on.doc", accessibilityDescription: "Copy URL") else { + return proposedServices + } + + var share = proposedServices + let copyService = NSSharingService( + title: "Copy URL", + image: copyIcon, + alternateImage: copyIcon, + handler: { + if let url = items.first as? NSURL, let urlString = url.absoluteString { + let clipboard = NSPasteboard.general + clipboard.clearContents() + clipboard.setString(urlString, forType: .string) + } + } + ) + share.insert(copyService, at: 0) + share.insert(NSSharingService(named: .addToSafariReadingList)!, at: 1) + return share + } + func sharingServicePicker( _ sharingServicePicker: NSSharingServicePicker, didChoose service: NSSharingService? @@ -35,5 +65,6 @@ struct PostEditorSharingPicker: NSViewRepresentable { sharingServicePicker.delegate = nil self.owner.isPresented = false } + } }