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.
 
 
 

86 regels
3.3 KiB

  1. import SwiftUI
  2. import CoreData
  3. enum PostAppearance: String {
  4. case sans = "OpenSans-Regular"
  5. case mono = "Hack-Regular"
  6. case serif = "Lora-Regular"
  7. }
  8. struct PostEditorModel {
  9. @AppStorage(WFDefaults.showAllPostsFlag, store: UserDefaults.shared) var showAllPostsFlag: Bool = false
  10. @AppStorage(WFDefaults.selectedCollectionURL, store: UserDefaults.shared) var selectedCollectionURL: URL?
  11. @AppStorage(WFDefaults.lastDraftURL, store: UserDefaults.shared) var lastDraftURL: URL?
  12. private(set) var initialPostTitle: String?
  13. private(set) var initialPostBody: String?
  14. #if os(macOS)
  15. var postToUpdate: WFAPost?
  16. #endif
  17. func saveLastDraft(_ post: WFAPost) {
  18. self.lastDraftURL = post.status != PostStatus.published.rawValue ? post.objectID.uriRepresentation() : nil
  19. }
  20. func clearLastDraft() {
  21. self.lastDraftURL = nil
  22. }
  23. func fetchLastDraftFromAppStorage() -> WFAPost? {
  24. guard let postURL = lastDraftURL else { return nil }
  25. guard let post = fetchManagedObject(from: postURL) as? WFAPost else { return nil }
  26. return post
  27. }
  28. func generateNewLocalPost(withFont appearance: Int) -> WFAPost {
  29. let managedPost = WFAPost(context: LocalStorageManager.standard.container.viewContext)
  30. managedPost.createdDate = Date()
  31. managedPost.title = ""
  32. managedPost.body = ""
  33. managedPost.status = PostStatus.local.rawValue
  34. managedPost.collectionAlias = WriteFreelyModel.shared.selectedCollection?.alias
  35. switch appearance {
  36. case 1:
  37. managedPost.appearance = "sans"
  38. case 2:
  39. managedPost.appearance = "wrap"
  40. default:
  41. managedPost.appearance = "serif"
  42. }
  43. if let languageCode = Locale.current.languageCode {
  44. managedPost.language = languageCode
  45. managedPost.rtl = Locale.characterDirection(forLanguage: languageCode) == .rightToLeft
  46. }
  47. return managedPost
  48. }
  49. func fetchSelectedCollectionFromAppStorage() -> WFACollection? {
  50. guard let collectionURL = selectedCollectionURL else { return nil }
  51. guard let collection = fetchManagedObject(from: collectionURL) as? WFACollection else { return nil }
  52. return collection
  53. }
  54. /// Sets the initial values for title and body on a published post.
  55. ///
  56. /// Used to detect if the title and body have changed back to their initial values. If the passed `WFAPost` isn't
  57. /// published, any title and post values already stored are reset to `nil`.
  58. /// - Parameter post: The `WFAPost` for which we're setting initial title/body values.
  59. mutating func setInitialValues(for post: WFAPost) {
  60. if post.status != PostStatus.published.rawValue {
  61. initialPostTitle = nil
  62. initialPostBody = nil
  63. return
  64. }
  65. initialPostTitle = post.title
  66. initialPostBody = post.body
  67. }
  68. private func fetchManagedObject(from objectURL: URL) -> NSManagedObject? {
  69. let coordinator = LocalStorageManager.standard.container.persistentStoreCoordinator
  70. guard let managedObjectID = coordinator.managedObjectID(forURIRepresentation: objectURL) else { return nil }
  71. let object = LocalStorageManager.standard.container.viewContext.object(with: managedObjectID)
  72. return object
  73. }
  74. }