mirror of
https://github.com/writeas/writefreely-swiftui-multiplatform.git
synced 2024-11-15 01:11:02 +00:00
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 commitf4ba5f9a90
. * Revert "Set the post editor font in the updateUIView method (#237)" (#240) This reverts commitd46eb639ad
. * Squashed commit of the following: commit804255b1da
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 commita799fd6210
Author: Angelo Stavrow <angelo@droppedbits.com> Date: Sun Dec 18 08:16:34 2022 -0500 Bump build number and update change log commitb81276d629
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: commit804255b1da
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 commita799fd6210
Author: Angelo Stavrow <angelo@droppedbits.com> Date: Sun Dec 18 08:16:34 2022 -0500 Bump build number and update change log commitb81276d629
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 commitd46eb639ad
. 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 commitf4ba5f9a90
. 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 commitbc3bc23308
Author: Angelo Stavrow <angelo@droppedbits.com> Date: Mon Dec 12 07:47:37 2022 -0500 Bump build number and update change log commit7703e925b7
Author: Angelo Stavrow <angelo@droppedbits.com> Date: Mon Dec 12 07:40:41 2022 -0500 Set the font in the updateUIView method commit6e60e0ded5
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: commit804255b1da
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 commita799fd6210
Author: Angelo Stavrow <angelo@droppedbits.com> Date: Sun Dec 18 08:16:34 2022 -0500 Bump build number and update change log commitb81276d629
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 commitd46eb639ad
. 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 commitf4ba5f9a90
. 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 commitbc3bc23308
Author: Angelo Stavrow <angelo@droppedbits.com> Date: Mon Dec 12 07:47:37 2022 -0500 Bump build number and update change log commit7703e925b7
Author: Angelo Stavrow <angelo@droppedbits.com> Date: Mon Dec 12 07:40:41 2022 -0500 Set the font in the updateUIView method commit6e60e0ded5
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:
parent
31e5b63443
commit
39a78c56b6
@ -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
|
||||||
|
@ -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 = (
|
||||||
|
@ -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)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user