| 1 | import Combine |
| 2 | import Foundation |
| 3 | |
| 4 | @MainActor |
| 5 | final class AppState: ObservableObject { |
| 6 | @Published var hasCompletedOnboarding: Bool { |
| 7 | didSet { |
| 8 | UserDefaults.standard.set(hasCompletedOnboarding, forKey: Keys.hasCompletedOnboarding) |
| 9 | } |
| 10 | } |
| 11 | |
| 12 | let contentRepository: ContentRepository |
| 13 | let searchService: SearchService |
| 14 | let favoritesStore: FavoritesStore |
| 15 | let recentSearchStore: RecentSearchStore |
| 16 | let recentlyViewedStore: RecentlyViewedStore |
| 17 | let guideEngine: OndeGuideEngine |
| 18 | let answerService: GuideAnswerService |
| 19 | let accountStore: AccountStore |
| 20 | |
| 21 | init() { |
| 22 | OndeEnvironmentBootstrap.configureIfNeeded() |
| 23 | |
| 24 | let repository = ContentRepository() |
| 25 | let favoritesStore = FavoritesStore() |
| 26 | let recentSearchStore = RecentSearchStore() |
| 27 | let recentlyViewedStore = RecentlyViewedStore() |
| 28 | let guideEngine = OndeGuideEngine() |
| 29 | let accountStore = AccountStore() |
| 30 | |
| 31 | self.contentRepository = repository |
| 32 | self.searchService = SearchService(repository: repository) |
| 33 | self.favoritesStore = favoritesStore |
| 34 | self.recentSearchStore = recentSearchStore |
| 35 | self.recentlyViewedStore = recentlyViewedStore |
| 36 | self.guideEngine = guideEngine |
| 37 | self.answerService = GuideAnswerService(repository: repository, guideEngine: guideEngine) |
| 38 | self.accountStore = accountStore |
| 39 | guideEngine.refreshStorageUsage() |
| 40 | self.hasCompletedOnboarding = UserDefaults.standard.bool( |
| 41 | forKey: Keys.hasCompletedOnboarding) |
| 42 | } |
| 43 | |
| 44 | func completeOnboarding() { |
| 45 | hasCompletedOnboarding = true |
| 46 | } |
| 47 | } |
| 48 | |
| 49 | private enum Keys { |
| 50 | static let hasCompletedOnboarding = "klepon.hasCompletedOnboarding" |
| 51 | } |