Source code for the WriteFreely SwiftUI app for iOS, iPadOS, and macOS
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 

103 rader
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. }