Skip to content
Snippets Groups Projects
DependencyRegistrator.swift 4.18 KiB
Newer Older
Bruno Muniz's avatar
Bruno Muniz committed
// MARK: SDK

import Network

// MARK: Isolated features

import HUD
import Theme
import Bindings
import XXLogger
import Keychain
import Defaults
import Integration
import Permissions
import CrashService
import CrashReporting
import NetworkMonitor
import VersionChecking
import PushNotifications
import DependencyInjection
import Voxophone

// MARK: UI Features

import ScanFeature
import ChatFeature
import MenuFeature
import SearchFeature
import ContactFeature
import ProfileFeature
import ChatListFeature
import SettingsFeature
import RequestsFeature
import OnboardingFeature
import ContactListFeature

struct DependencyRegistrator {
    static private let container = DependencyInjection.Container.shared

    // MARK: MOCK

    static func registerForMock() {
        container.register(XXLogger.noop)
        container.register(CrashReporter.noop)
        container.register(VersionChecker.mock)
        container.register(XXNetwork<BindingsMock>() as XXNetworking)
        container.register(MockNetworkMonitor() as NetworkMonitoring)
        container.register(KeyObjectStore.userDefaults)
        container.register(MockPushHandler() as PushHandling)
        container.register(MockKeychainHandler() as KeychainHandling)
        container.register(MockPermissionHandler() as PermissionHandling)
        registerCommonDependencies()
    }

    // MARK: LIVE

    static func registerForLive() {
        container.register(XXLogger.live())
        container.register(CrashReporter.live)
        container.register(VersionChecker.live())
        container.register(XXNetwork<BindingsClient>() as XXNetworking)
        container.register(NetworkMonitor() as NetworkMonitoring)
        container.register(KeyObjectStore.userDefaults)
        container.register(PushHandler() as PushHandling)
        container.register(KeychainHandler() as KeychainHandling)
        container.register(PermissionHandler() as PermissionHandling)
        registerCommonDependencies()
    }

    // MARK: COMMON

    static private func registerCommonDependencies() {
        container.register(Voxophone())

        // MARK: Isolated

        container.register(HUD() as HUDType)
        container.register(ThemeController() as ThemeControlling)
        container.register(StatusBarController() as StatusBarStyleControlling)

        // MARK: Coordinators

        container.register(SearchCoordinator() as SearchCoordinating)
        container.register(ProfileCoordinator() as ProfileCoordinating)
        container.register(SettingsCoordinator() as SettingsCoordinating)

        container.register(
            ChatCoordinator(
                retryFactory: RetrySheetController.init,
                contactFactory: ContactController.init(_:)
            ) as ChatCoordinating)

        container.register(
            ContactCoordinator(
                requestsFactory: RequestsContainerController.init
            ) as ContactCoordinating)

        container.register(
            RequestsCoordinator(
                searchFactory: SearchController.init
            ) as RequestsCoordinating)

        container.register(
            OnboardingCoordinator(
                chatListFactory: ChatListController.init
            ) as OnboardingCoordinating)

        container.register(
            ContactListCoordinator(
                scanFactory: ScanContainerController.init,
                searchFactory: SearchController.init,
                newGroupFactory: CreateGroupController.init,
                requestsFactory: RequestsContainerController.init
            ) as ContactListCoordinating)

        container.register(
            ScanCoordinator(
                contactsFactory: ContactListController.init,
                requestsFactory: RequestsContainerController.init
            ) as ScanCoordinating)

        container.register(
            ChatListCoordinator(
                scanFactory: ScanContainerController.init,
                searchFactory: SearchController.init,
                profileFactory: ProfileController.init,
                settingsFactory: SettingsController.init,
                contactsFactory: ContactListController.init,
                requestsFactory: RequestsContainerController.init
            ) as ChatListCoordinating)
    }
}