FrontPageViewModel.swift 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. let targetURL = url ?? Self.redditHomeURL
  25. redditLoadURL = targetURL
  26. if RedditWebAuthHelper.isRedditHomeURL(targetURL) {
  27. redditCanGoBack = false
  28. }
  29. redditReloadTrigger += 1
  30. }
  31. func showAuthError(_ message: String) {
  32. authErrorMessage = message
  33. }
  34. func clearAuthError() {
  35. authErrorMessage = nil
  36. }
  37. func goBackInReddit() {
  38. guard redditCanGoBack else { return }
  39. redditGoBackTrigger += 1
  40. }
  41. func updateRedditCanGoBack(_ canGoBack: Bool) {
  42. redditCanGoBack = canGoBack
  43. }
  44. func openSettings() {
  45. selectedNavItem = nil
  46. isRedditActive = false
  47. isSettingsActive = true
  48. }
  49. func selectNavItem(_ item: SidebarNavItem) {
  50. selectedNavItem = item
  51. isRedditActive = false
  52. isSettingsActive = false
  53. }
  54. func showPaywall() {
  55. isPaywallPresented = true
  56. }
  57. func dismissPaywall() {
  58. isPaywallPresented = false
  59. }
  60. let createItems: [SidebarNavItem] = [
  61. SidebarNavItem(title: "Post Generator", subtitle: "Generate engaging posts", iconKind: .postGenerator),
  62. SidebarNavItem(title: "Title Optimizer", subtitle: "Create viral titles", iconKind: .titleOptimizer),
  63. SidebarNavItem(title: "Comment Writer", subtitle: "Write smart replies", iconKind: .commentWriter),
  64. ]
  65. }