Source code for the WriteFreely SwiftUI app for iOS, iPadOS, and macOS
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 
 

103 righe
3.8 KiB

  1. import Foundation
  2. import WriteFreely
  3. import Security
  4. import Network
  5. // MARK: - WriteFreelyModel
  6. final class WriteFreelyModel: ObservableObject {
  7. // MARK: - Models
  8. @Published var account = AccountModel()
  9. @Published var preferences = PreferencesModel()
  10. @Published var posts = PostListModel()
  11. @Published var editor = PostEditorModel()
  12. // MARK: - Error handling
  13. @Published var hasError: Bool = false
  14. var currentError: Error? {
  15. didSet {
  16. #if DEBUG
  17. print("⚠️ currentError -> didSet \(currentError?.localizedDescription ?? "nil")")
  18. print(" > hasError was: \(self.hasError)")
  19. #endif
  20. DispatchQueue.main.async {
  21. #if DEBUG
  22. print(" > self.currentError != nil: \(self.currentError != nil)")
  23. #endif
  24. self.hasError = self.currentError != nil
  25. #if DEBUG
  26. print(" > hasError is now: \(self.hasError)")
  27. #endif
  28. }
  29. }
  30. }
  31. // MARK: - State
  32. @Published var isLoggingIn: Bool = false
  33. @Published var isProcessingRequest: Bool = false
  34. @Published var hasNetworkConnection: Bool = true
  35. @Published var selectedPost: WFAPost?
  36. @Published var selectedCollection: WFACollection?
  37. @Published var showAllPosts: Bool = true
  38. @Published var isPresentingDeleteAlert: Bool = false
  39. @Published var postToDelete: WFAPost?
  40. #if os(iOS)
  41. @Published var isPresentingSettingsView: Bool = false
  42. #endif
  43. static var shared = WriteFreelyModel()
  44. // swiftlint:disable line_length
  45. let helpURL = URL(string: "https://discuss.write.as/c/help/5")!
  46. let howToURL = URL(string: "https://discuss.write.as/t/using-the-writefreely-ios-app/1946")!
  47. let reviewURL = URL(string: "https://apps.apple.com/app/id1531530896?action=write-review")!
  48. let licensesURL = URL(string: "https://github.com/writeas/writefreely-swiftui-multiplatform/tree/main/Shared/Resources/Licenses")!
  49. // swiftlint:enable line_length
  50. internal var client: WFClient?
  51. private let defaults = UserDefaults.shared
  52. private let monitor = NWPathMonitor()
  53. private let queue = DispatchQueue(label: "NetworkMonitor")
  54. internal var postToUpdate: WFAPost?
  55. init() {
  56. DispatchQueue.main.async {
  57. self.preferences.appearance = self.defaults.integer(forKey: WFDefaults.colorSchemeIntegerKey)
  58. self.preferences.font = self.defaults.integer(forKey: WFDefaults.defaultFontIntegerKey)
  59. self.account.restoreState()
  60. if self.account.isLoggedIn {
  61. guard let serverURL = URL(string: self.account.server) else {
  62. self.currentError = AccountError.invalidServerURL
  63. return
  64. }
  65. do {
  66. guard let token = try self.fetchTokenFromKeychain(
  67. username: self.account.username,
  68. server: self.account.server
  69. ) else {
  70. self.currentError = KeychainError.couldNotFetchAccessToken
  71. return
  72. }
  73. self.account.login(WFUser(token: token, username: self.account.username))
  74. self.client = WFClient(for: serverURL)
  75. self.client?.user = self.account.user
  76. self.fetchUserCollections()
  77. self.fetchUserPosts()
  78. } catch {
  79. self.currentError = KeychainError.couldNotFetchAccessToken
  80. return
  81. }
  82. }
  83. }
  84. monitor.pathUpdateHandler = { path in
  85. DispatchQueue.main.async {
  86. self.hasNetworkConnection = path.status == .satisfied
  87. }
  88. }
  89. monitor.start(queue: queue)
  90. }
  91. }