FrontPageViewModel.swift 2.7 KB

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