FrontPageViewModel.swift 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 isHistoryActive = false
  11. var isPaywallPresented = false
  12. var authErrorMessage: String?
  13. private(set) var redditReloadTrigger = 0
  14. private(set) var redditGoBackTrigger = 0
  15. var redditCanGoBack = false
  16. static let historyItem = SidebarNavItem(
  17. title: "History",
  18. subtitle: "Saved AI responses",
  19. iconKind: .history
  20. )
  21. static let settingsItem = SidebarNavItem(
  22. title: "Settings",
  23. subtitle: "Manage app preferences",
  24. iconKind: .settings
  25. )
  26. func openReddit(at url: URL? = nil) {
  27. selectedNavItem = nil
  28. isRedditActive = true
  29. isSettingsActive = false
  30. isHistoryActive = false
  31. let targetURL = url ?? Self.redditHomeURL
  32. redditLoadURL = targetURL
  33. if RedditWebAuthHelper.isRedditHomeURL(targetURL) {
  34. redditCanGoBack = false
  35. }
  36. redditReloadTrigger += 1
  37. }
  38. func showAuthError(_ message: String) {
  39. authErrorMessage = message
  40. }
  41. func clearAuthError() {
  42. authErrorMessage = nil
  43. }
  44. func goBackInReddit() {
  45. guard redditCanGoBack else { return }
  46. redditGoBackTrigger += 1
  47. }
  48. func updateRedditCanGoBack(_ canGoBack: Bool) {
  49. redditCanGoBack = canGoBack
  50. }
  51. func openSettings() {
  52. selectedNavItem = nil
  53. isRedditActive = false
  54. isSettingsActive = true
  55. isHistoryActive = false
  56. }
  57. func openHistory() {
  58. selectedNavItem = nil
  59. isRedditActive = false
  60. isSettingsActive = false
  61. isHistoryActive = true
  62. }
  63. func selectNavItem(_ item: SidebarNavItem) {
  64. selectedNavItem = item
  65. isRedditActive = false
  66. isSettingsActive = false
  67. isHistoryActive = false
  68. }
  69. func showPaywall() {
  70. isPaywallPresented = true
  71. }
  72. func dismissPaywall() {
  73. isPaywallPresented = false
  74. }
  75. let createItems: [SidebarNavItem] = [
  76. SidebarNavItem(title: "Post Generator", subtitle: "Generate engaging posts", iconKind: .postGenerator),
  77. SidebarNavItem(title: "Title Optimizer", subtitle: "Create viral titles", iconKind: .titleOptimizer),
  78. SidebarNavItem(title: "Comment Writer", subtitle: "Write smart replies", iconKind: .commentWriter),
  79. ]
  80. }