Source code for the WriteFreely SwiftUI app for iOS, iPadOS, and macOS
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

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