62 lines
1.6 KiB
Swift
62 lines
1.6 KiB
Swift
import Foundation
|
|
import SwiftUI
|
|
|
|
@MainActor
|
|
final class AppRouter: ObservableObject {
|
|
enum Tab: Hashable {
|
|
case library
|
|
case discover
|
|
case stats
|
|
case profile
|
|
}
|
|
|
|
enum Route: Hashable {
|
|
case category(name: String)
|
|
case detail(BookRemote)
|
|
}
|
|
|
|
@Published var isAuthenticated = false
|
|
@Published var selectedTab: Tab = .library
|
|
@Published var path: [Route] = []
|
|
|
|
func resetToHome() {
|
|
path.removeAll()
|
|
selectedTab = .library
|
|
}
|
|
}
|
|
|
|
struct AppDependencies {
|
|
let apiClient: APIClientProtocol
|
|
let authService: AuthServiceProtocol
|
|
let booksService: BooksServiceProtocol
|
|
let keychain: KeychainStoreProtocol
|
|
let imageCache: ImageCacheProtocol
|
|
|
|
static func live() -> AppDependencies {
|
|
let config = URLSessionConfiguration.default
|
|
config.waitsForConnectivity = false
|
|
config.timeoutIntervalForRequest = 8
|
|
config.timeoutIntervalForResource = 15
|
|
let session = URLSession(configuration: config)
|
|
let client = APIClient(baseURL: Bundle.main.apiBaseURL, session: session)
|
|
return AppDependencies(
|
|
apiClient: client,
|
|
authService: AuthService(client: client),
|
|
booksService: BooksService(client: client),
|
|
keychain: KeychainStore(),
|
|
imageCache: ImageCache.shared
|
|
)
|
|
}
|
|
}
|
|
|
|
private struct DependenciesKey: EnvironmentKey {
|
|
static let defaultValue = AppDependencies.live()
|
|
}
|
|
|
|
extension EnvironmentValues {
|
|
var dependencies: AppDependencies {
|
|
get { self[DependenciesKey.self] }
|
|
set { self[DependenciesKey.self] = newValue }
|
|
}
|
|
}
|