Source code for the WriteFreely SwiftUI app for iOS, iPadOS, and macOS
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 

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