FrontPageViewModel.swift 2.6 KB

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