FrontPageViewModel.swift 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import SwiftUI
  2. @MainActor
  3. @Observable
  4. final class FrontPageViewModel {
  5. private static let redditHomeURL = URL(string: "https://www.reddit.com")!
  6. private(set) var redditLoadURL = redditHomeURL
  7. var selectedNavItem: SidebarNavItem?
  8. var isRedditActive = true
  9. var isSettingsActive = false
  10. var isPaywallPresented = false
  11. var authErrorMessage: String?
  12. private(set) var redditReloadTrigger = 0
  13. private(set) var redditGoBackTrigger = 0
  14. var redditCanGoBack = false
  15. static let settingsItem = SidebarNavItem(
  16. title: "Settings",
  17. subtitle: "Manage app preferences",
  18. iconKind: .settings
  19. )
  20. func openReddit(at url: URL? = nil) {
  21. selectedNavItem = nil
  22. isRedditActive = true
  23. isSettingsActive = false
  24. redditLoadURL = url ?? Self.redditHomeURL
  25. redditReloadTrigger += 1
  26. }
  27. func showAuthError(_ message: String) {
  28. authErrorMessage = message
  29. }
  30. func clearAuthError() {
  31. authErrorMessage = nil
  32. }
  33. func goBackInReddit() {
  34. guard redditCanGoBack else { return }
  35. redditGoBackTrigger += 1
  36. }
  37. func updateRedditCanGoBack(_ canGoBack: Bool) {
  38. redditCanGoBack = canGoBack
  39. }
  40. func openSettings() {
  41. selectedNavItem = nil
  42. isRedditActive = false
  43. isSettingsActive = true
  44. }
  45. func selectNavItem(_ item: SidebarNavItem) {
  46. selectedNavItem = item
  47. isRedditActive = false
  48. isSettingsActive = false
  49. }
  50. func showPaywall() {
  51. isPaywallPresented = true
  52. }
  53. func dismissPaywall() {
  54. isPaywallPresented = false
  55. }
  56. let createItems: [SidebarNavItem] = [
  57. SidebarNavItem(title: "Post Generator", subtitle: "Generate engaging posts", iconKind: .postGenerator),
  58. SidebarNavItem(title: "Title Optimizer", subtitle: "Create viral titles", iconKind: .titleOptimizer),
  59. SidebarNavItem(title: "Comment Writer", subtitle: "Write smart replies", iconKind: .commentWriter),
  60. ]
  61. }