Source code for the WriteFreely SwiftUI app for iOS, iPadOS, and macOS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

103 lines
3.6 KiB

  1. import SwiftUI
  2. struct PostEditorStatusToolbarView: View {
  3. @EnvironmentObject var model: WriteFreelyModel
  4. @ObservedObject var post: WFAPost
  5. var body: some View {
  6. if post.hasNewerRemoteCopy {
  7. #if os(iOS)
  8. PostStatusBadgeView(post: post)
  9. #else
  10. HStack {
  11. HStack {
  12. Text("⚠️ Newer copy on server. Replace local copy?")
  13. .font(.callout)
  14. .foregroundColor(.secondary)
  15. Button(action: {
  16. model.updateFromServer(post: post)
  17. }, label: {
  18. Image(systemName: "square.and.arrow.down")
  19. })
  20. .accessibilityLabel(Text("Update post"))
  21. .accessibilityHint(Text("Replace this post with the server version"))
  22. }
  23. .padding(.horizontal)
  24. .background(Color.primary.opacity(0.1))
  25. .clipShape(Capsule())
  26. .padding(.trailing)
  27. PostStatusBadgeView(post: post)
  28. }
  29. #endif
  30. } else if post.wasDeletedFromServer && post.status != PostStatus.local.rawValue {
  31. #if os(iOS)
  32. PostStatusBadgeView(post: post)
  33. #else
  34. HStack {
  35. HStack {
  36. Text("⚠️ Post deleted from server. Delete local copy?")
  37. .font(.callout)
  38. .foregroundColor(.secondary)
  39. Button(action: {
  40. model.selectedPost = nil
  41. DispatchQueue.main.async {
  42. model.posts.remove(post)
  43. }
  44. }, label: {
  45. Image(systemName: "trash")
  46. })
  47. .accessibilityLabel(Text("Delete"))
  48. .accessibilityHint(Text("Delete this post from your Mac"))
  49. }
  50. .padding(.horizontal)
  51. .background(Color.primary.opacity(0.1))
  52. .clipShape(Capsule())
  53. .padding(.trailing)
  54. PostStatusBadgeView(post: post)
  55. }
  56. #endif
  57. } else {
  58. PostStatusBadgeView(post: post)
  59. }
  60. }
  61. }
  62. struct PESTView_StandardPreviews: PreviewProvider {
  63. static var previews: some View {
  64. let context = LocalStorageManager.standard.container.viewContext
  65. let model = WriteFreelyModel()
  66. let testPost = WFAPost(context: context)
  67. testPost.status = PostStatus.published.rawValue
  68. return PostEditorStatusToolbarView(post: testPost)
  69. .environmentObject(model)
  70. }
  71. }
  72. struct PESTView_OutdatedLocalCopyPreviews: PreviewProvider {
  73. static var previews: some View {
  74. let context = LocalStorageManager.standard.container.viewContext
  75. let model = WriteFreelyModel()
  76. let updatedPost = WFAPost(context: context)
  77. updatedPost.status = PostStatus.published.rawValue
  78. updatedPost.hasNewerRemoteCopy = true
  79. return PostEditorStatusToolbarView(post: updatedPost)
  80. .environmentObject(model)
  81. }
  82. }
  83. struct PESTView_DeletedRemoteCopyPreviews: PreviewProvider {
  84. static var previews: some View {
  85. let context = LocalStorageManager.standard.container.viewContext
  86. let model = WriteFreelyModel()
  87. let deletedPost = WFAPost(context: context)
  88. deletedPost.status = PostStatus.published.rawValue
  89. deletedPost.wasDeletedFromServer = true
  90. return PostEditorStatusToolbarView(post: deletedPost)
  91. .environmentObject(model)
  92. }
  93. }