Fix sharing picker and prep for v1.0 release of Mac app (#242)

* 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 f4ba5f9a90.

* Revert "Set the post editor font in the updateUIView method (#237)" (#240)

This reverts commit d46eb639ad.

* Squashed commit of the following:

commit 804255b1da
Merge: a799fd6 d46eb63
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Sun Dec 18 15:28:10 2022 -0500

    Merge branch 'main' into fix-crash-on-launch-tmp-no-nav

commit a799fd6210
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Sun Dec 18 08:16:34 2022 -0500

    Bump build number and update change log

commit b81276d629
Author: Angelo Stavrow <angelo@droppedbits.com>
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 <angelo@droppedbits.com>
Date:   Thu Dec 29 10:05:03 2022 -0500

    Fix missed changes in change log

commit 593cc8f1fa83feec923905a5004b885fa68e3003
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Thu Dec 29 09:46:36 2022 -0500

    Bump patch version and build number

commit e0f752e6a4828c3d09649da8f9fe5a1902a2f137
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Mon Dec 12 07:47:37 2022 -0500

    Bump build number and update change log

commit 2f7163dff4ca9d3279c553190b78d2d47277a03e
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Thu Dec 29 09:43:00 2022 -0500

    Update change log

commit e42436676d2ce2e70e96a18364cb8127a5921cb5
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Thu Dec 29 09:40:27 2022 -0500

    Squashed commit of the following:

    commit 804255b1da
    Merge: a799fd6 d46eb63
    Author: Angelo Stavrow <angelo@droppedbits.com>
    Date:   Sun Dec 18 15:28:10 2022 -0500

        Merge branch 'main' into fix-crash-on-launch-tmp-no-nav

    commit a799fd6210
    Author: Angelo Stavrow <angelo@droppedbits.com>
    Date:   Sun Dec 18 08:16:34 2022 -0500

        Bump build number and update change log

    commit b81276d629
    Author: Angelo Stavrow <angelo@droppedbits.com>
    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 <angelo@droppedbits.com>
Date:   Thu Dec 29 09:26:18 2022 -0500

    Revert "Set the post editor font in the updateUIView method (#237)" (#240)

    This reverts commit d46eb639ad.

commit 43b53c6e456d7b59e7363d1591363c58a246b4be
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Thu Dec 29 09:25:36 2022 -0500

    Revert "Don't navigate to new/last draft on launch (#238)" (#239)

    This reverts commit f4ba5f9a90.

commit 34546f994efaa77d21ff51aad84201f2dbbffd3e
Author: Angelo Stavrow <angelo@droppedbits.com>
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 bc3bc23308
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Mon Dec 12 07:47:37 2022 -0500

    Bump build number and update change log

commit 7703e925b7
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Mon Dec 12 07:40:41 2022 -0500

    Set the font in the updateUIView method

commit 6e60e0ded5
Author: Angelo Stavrow <angelo@droppedbits.com>
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 <angelo@droppedbits.com>
Date:   Thu Dec 29 10:05:03 2022 -0500

    Fix missed changes in change log

commit 593cc8f1fa83feec923905a5004b885fa68e3003
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Thu Dec 29 09:46:36 2022 -0500

    Bump patch version and build number

commit e0f752e6a4828c3d09649da8f9fe5a1902a2f137
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Mon Dec 12 07:47:37 2022 -0500

    Bump build number and update change log

commit 2f7163dff4ca9d3279c553190b78d2d47277a03e
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Thu Dec 29 09:43:00 2022 -0500

    Update change log

commit e42436676d2ce2e70e96a18364cb8127a5921cb5
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Thu Dec 29 09:40:27 2022 -0500

    Squashed commit of the following:

    commit 804255b1da
    Merge: a799fd6 d46eb63
    Author: Angelo Stavrow <angelo@droppedbits.com>
    Date:   Sun Dec 18 15:28:10 2022 -0500

        Merge branch 'main' into fix-crash-on-launch-tmp-no-nav

    commit a799fd6210
    Author: Angelo Stavrow <angelo@droppedbits.com>
    Date:   Sun Dec 18 08:16:34 2022 -0500

        Bump build number and update change log

    commit b81276d629
    Author: Angelo Stavrow <angelo@droppedbits.com>
    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 <angelo@droppedbits.com>
Date:   Thu Dec 29 09:26:18 2022 -0500

    Revert "Set the post editor font in the updateUIView method (#237)" (#240)

    This reverts commit d46eb639ad.

commit 43b53c6e456d7b59e7363d1591363c58a246b4be
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Thu Dec 29 09:25:36 2022 -0500

    Revert "Don't navigate to new/last draft on launch (#238)" (#239)

    This reverts commit f4ba5f9a90.

commit 34546f994efaa77d21ff51aad84201f2dbbffd3e
Author: Angelo Stavrow <angelo@droppedbits.com>
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 bc3bc23308
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Mon Dec 12 07:47:37 2022 -0500

    Bump build number and update change log

commit 7703e925b7
Author: Angelo Stavrow <angelo@droppedbits.com>
Date:   Mon Dec 12 07:40:41 2022 -0500

    Set the font in the updateUIView method

commit 6e60e0ded5
Author: Angelo Stavrow <angelo@droppedbits.com>
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
This commit is contained in:
Angelo Stavrow 2023-02-12 11:14:26 -05:00 committed by GitHub
parent 31e5b63443
commit 39a78c56b6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 20 deletions

View File

@ -36,7 +36,7 @@ struct ContentView: View {
}, label: { Image(systemName: "square.and.pencil") }) }, label: { Image(systemName: "square.and.pencil") })
.help("Create a new local draft.") .help("Create a new local draft.")
} }
.frame(idealWidth: 200) .frame(width: 200)
#else #else
CollectionListView() CollectionListView()
.withErrorHandling() .withErrorHandling()
@ -46,7 +46,7 @@ struct ContentView: View {
ZStack { ZStack {
PostListView(selectedCollection: model.selectedCollection, showAllPosts: model.showAllPosts) PostListView(selectedCollection: model.selectedCollection, showAllPosts: model.showAllPosts)
.withErrorHandling() .withErrorHandling()
.frame(idealWidth: 300) .frame(width: 300)
if model.isProcessingRequest { if model.isProcessingRequest {
ZStack { ZStack {
Color(NSColor.controlBackgroundColor).opacity(0.75) Color(NSColor.controlBackgroundColor).opacity(0.75)
@ -59,8 +59,14 @@ struct ContentView: View {
.withErrorHandling() .withErrorHandling()
#endif #endif
#if os(macOS)
Text("Select a post, or create a new local draft.") Text("Select a post, or create a new local draft.")
.foregroundColor(.secondary) .foregroundColor(.secondary)
.frame(width: 500, height: 500)
#else
Text("Select a post, or create a new local draft.")
.foregroundColor(.secondary)
#endif
} }
.environmentObject(model) .environmentObject(model)
.onChange(of: model.hasError) { value in .onChange(of: model.hasError) { value in

View File

@ -1278,7 +1278,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 690; CURRENT_PROJECT_VERSION = 704;
DEVELOPMENT_TEAM = TPPAB4YBA6; DEVELOPMENT_TEAM = TPPAB4YBA6;
ENABLE_HARDENED_RUNTIME = YES; ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@ -1287,8 +1287,8 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 11.0; MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 0.7.0; MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.abunchtell.WriteFreely-MultiPlatform"; PRODUCT_BUNDLE_IDENTIFIER = "com.abunchtell.WriteFreely-MultiPlatform";
PRODUCT_NAME = "WriteFreely for Mac"; PRODUCT_NAME = "WriteFreely for Mac";
SDKROOT = macosx; SDKROOT = macosx;
@ -1305,7 +1305,7 @@
CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 690; CURRENT_PROJECT_VERSION = 704;
DEVELOPMENT_TEAM = TPPAB4YBA6; DEVELOPMENT_TEAM = TPPAB4YBA6;
ENABLE_HARDENED_RUNTIME = YES; ENABLE_HARDENED_RUNTIME = YES;
ENABLE_PREVIEWS = YES; ENABLE_PREVIEWS = YES;
@ -1314,8 +1314,8 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MACOSX_DEPLOYMENT_TARGET = 11.0; MACOSX_DEPLOYMENT_TARGET = 12.0;
MARKETING_VERSION = 0.7.0; MARKETING_VERSION = 1.0.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.abunchtell.WriteFreely-MultiPlatform"; PRODUCT_BUNDLE_IDENTIFIER = "com.abunchtell.WriteFreely-MultiPlatform";
PRODUCT_NAME = "WriteFreely for Mac"; PRODUCT_NAME = "WriteFreely for Mac";
SDKROOT = macosx; SDKROOT = macosx;
@ -1374,6 +1374,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 702;
DEVELOPMENT_TEAM = TPPAB4YBA6; DEVELOPMENT_TEAM = TPPAB4YBA6;
INFOPLIST_FILE = "Tests macOS/Info.plist"; INFOPLIST_FILE = "Tests macOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
@ -1396,6 +1397,7 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES; COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 702;
DEVELOPMENT_TEAM = TPPAB4YBA6; DEVELOPMENT_TEAM = TPPAB4YBA6;
INFOPLIST_FILE = "Tests macOS/Info.plist"; INFOPLIST_FILE = "Tests macOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (

View File

@ -76,13 +76,12 @@ struct ActivePostToolbarView: View {
) )
.disabled(activePost.status == PostStatus.local.rawValue) .disabled(activePost.status == PostStatus.local.rawValue)
.help("Copy the post's URL to your Mac's pasteboard.") .help("Copy the post's URL to your Mac's pasteboard.")
.popover(isPresented: $isPresentingSharingServicePicker) { .background(
PostEditorSharingPicker( PostEditorSharingPicker(
isPresented: $isPresentingSharingServicePicker, isPresented: $isPresentingSharingServicePicker,
sharingItems: createPostUrl() sharingItems: createPostUrl()
) )
.frame(width: .zero, height: .zero) )
}
Button(action: { publishPost(activePost) }, label: { Image(systemName: "paperplane") }) Button(action: { publishPost(activePost) }, label: { Image(systemName: "paperplane") })
.disabled(activePost.body.isEmpty || activePost.status == PostStatus.published.rawValue) .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 .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 [] } guard let postId = model.selectedPost?.postId else { return [] }
var urlString: String var urlString: String
@ -116,7 +115,7 @@ struct ActivePostToolbarView: View {
let baseURL = urls.first?.url ?? "\(model.account.server)/\(postCollectionAlias)/" let baseURL = urls.first?.url ?? "\(model.account.server)/\(postCollectionAlias)/"
urlString = "\(baseURL)\(postSlug)" urlString = "\(baseURL)\(postSlug)"
} else { } 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)" urlString = "\(model.account.server)/\(postId)"
} }

View File

@ -2,20 +2,22 @@ import SwiftUI
struct PostEditorSharingPicker: NSViewRepresentable { struct PostEditorSharingPicker: NSViewRepresentable {
@Binding var isPresented: Bool @Binding var isPresented: Bool
var sharingItems: [Any] = [] var sharingItems: [NSURL] = []
func makeNSView(context: Context) -> some NSView { func makeNSView(context: Context) -> some NSView {
let view = 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 return view
} }
func updateNSView(_ nsView: NSViewType, context: Context) { 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 { func makeCoordinator() -> Coordinator {
@ -24,10 +26,38 @@ struct PostEditorSharingPicker: NSViewRepresentable {
class Coordinator: NSObject, NSSharingServicePickerDelegate { class Coordinator: NSObject, NSSharingServicePickerDelegate {
let owner: PostEditorSharingPicker let owner: PostEditorSharingPicker
init(owner: PostEditorSharingPicker) { init(owner: PostEditorSharingPicker) {
self.owner = owner 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( func sharingServicePicker(
_ sharingServicePicker: NSSharingServicePicker, _ sharingServicePicker: NSSharingServicePicker,
didChoose service: NSSharingService? didChoose service: NSSharingService?
@ -35,5 +65,6 @@ struct PostEditorSharingPicker: NSViewRepresentable {
sharingServicePicker.delegate = nil sharingServicePicker.delegate = nil
self.owner.isPresented = false self.owner.isPresented = false
} }
} }
} }