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.
 
 
 

64 lines
2.4 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("showAllPostsFlag") var showAllPostsFlag: Bool = false
  10. @AppStorage("selectedCollectionURL") var selectedCollectionURL: URL?
  11. @AppStorage("lastDraftURL") var lastDraftURL: URL?
  12. func saveLastDraft(_ post: WFAPost) {
  13. self.lastDraftURL = post.status != PostStatus.published.rawValue ? post.objectID.uriRepresentation() : nil
  14. }
  15. func clearLastDraft() {
  16. self.lastDraftURL = nil
  17. }
  18. func fetchLastDraftFromAppStorage() -> WFAPost? {
  19. guard let postURL = lastDraftURL else { return nil }
  20. guard let post = fetchManagedObject(from: postURL) as? WFAPost else { return nil }
  21. return post
  22. }
  23. func generateNewLocalPost(withFont appearance: Int) -> WFAPost {
  24. let managedPost = WFAPost(context: LocalStorageManager.standard.container.viewContext)
  25. managedPost.createdDate = Date()
  26. managedPost.title = ""
  27. managedPost.body = ""
  28. managedPost.status = PostStatus.local.rawValue
  29. managedPost.collectionAlias = WriteFreelyModel.shared.selectedCollection?.alias
  30. switch appearance {
  31. case 1:
  32. managedPost.appearance = "sans"
  33. case 2:
  34. managedPost.appearance = "wrap"
  35. default:
  36. managedPost.appearance = "serif"
  37. }
  38. if let languageCode = Locale.current.languageCode {
  39. managedPost.language = languageCode
  40. managedPost.rtl = Locale.characterDirection(forLanguage: languageCode) == .rightToLeft
  41. }
  42. return managedPost
  43. }
  44. func fetchSelectedCollectionFromAppStorage() -> WFACollection? {
  45. guard let collectionURL = selectedCollectionURL else { return nil }
  46. guard let collection = fetchManagedObject(from: collectionURL) as? WFACollection else { return nil }
  47. return collection
  48. }
  49. private func fetchManagedObject(from objectURL: URL) -> NSManagedObject? {
  50. let coordinator = LocalStorageManager.standard.container.persistentStoreCoordinator
  51. guard let managedObjectID = coordinator.managedObjectID(forURIRepresentation: objectURL) else { return nil }
  52. let object = LocalStorageManager.standard.container.viewContext.object(with: managedObjectID)
  53. return object
  54. }
  55. }