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

import UIKit
Bruno Muniz's avatar
Bruno Muniz committed
import Network
import QuickLook
import MobileCoreServices
Bruno Muniz's avatar
Bruno Muniz committed

// MARK: Isolated features

import HUD
import Theme
import Bindings
import XXLogger
import Keychain
import Defaults
import Countries
import Voxophone
Bruno Muniz's avatar
Bruno Muniz committed
import Integration
import Permissions
import CrashService
import iCloudFeature
Bruno Muniz's avatar
Bruno Muniz committed
import CrashReporting
import NetworkMonitor
import DropboxFeature
Bruno Muniz's avatar
Bruno Muniz committed
import VersionChecking
import PushNotifications
import GoogleDriveFeature
Bruno Muniz's avatar
Bruno Muniz committed
import DependencyInjection

// MARK: UI Features

import ScanFeature
import ChatFeature
import MenuFeature
import BackupFeature
Bruno Muniz's avatar
Bruno Muniz committed
import SearchFeature
import RestoreFeature
Bruno Muniz's avatar
Bruno Muniz committed
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)

        /// Restore / Backup

        container.register(iCloudServiceMock() as iCloudInterface)
        container.register(DropboxServiceMock() as DropboxInterface)
        container.register(GoogleDriveServiceMock() as GoogleDriveInterface)

Bruno Muniz's avatar
Bruno Muniz committed
        registerCommonDependencies()
    }

    // MARK: LIVE

    static func registerForLive() {
        container.register(KeyObjectStore.userDefaults)
Bruno Muniz's avatar
Bruno Muniz committed
        container.register(XXLogger.live())
        container.register(CrashReporter.live)
        container.register(VersionChecker.live())
Bruno Muniz's avatar
Bruno Muniz committed
        container.register(XXNetwork<BindingsClient>() as XXNetworking)
        container.register(NetworkMonitor() as NetworkMonitoring)
        container.register(PushHandler() as PushHandling)
        container.register(KeychainHandler() as KeychainHandling)
        container.register(PermissionHandler() as PermissionHandling)

        /// Restore / Backup

        container.register(iCloudService() as iCloudInterface)
        container.register(DropboxService() as DropboxInterface)
        container.register(GoogleDriveService() as GoogleDriveInterface)

Bruno Muniz's avatar
Bruno Muniz committed
        registerCommonDependencies()
    }

    // MARK: COMMON

    static private func registerCommonDependencies() {
        container.register(Voxophone())
        container.register(BackupService())
Bruno Muniz's avatar
Bruno Muniz committed

        // MARK: Isolated

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

        // MARK: Coordinators

        container.register(BackupCoordinator() as BackupCoordinating)

        container.register(
            SearchCoordinator(
                contactFactory: ContactController.init(_:),
                countriesFactory: CountryListController.init(_:)
            ) as SearchCoordinating)

        container.register(
            ProfileCoordinator(
                emailFactory: ProfileEmailController.init,
                phoneFactory: ProfilePhoneController.init,
                imagePickerFactory: UIImagePickerController.init,
                permissionFactory: RequestPermissionController.init,
                countriesFactory: CountryListController.init(_:),
                codeFactory: ProfileCodeController.init(_:_:)
            ) as ProfileCoordinating)

        container.register(
            SettingsCoordinator(
                backupFactory: BackupController.init,
                advancedFactory: SettingsAdvancedController.init,
                accountDeleteFactory: AccountDeleteController.init
            ) as SettingsCoordinating)

        container.register(
            RestoreCoordinator(
                successFactory: RestoreSuccessController.init,
                chatListFactory: ChatListController.init,
                restoreFactory: RestoreController.init(_:_:)
            ) as RestoreCoordinating)
Bruno Muniz's avatar
Bruno Muniz committed

        container.register(
            ChatCoordinator(
                retryFactory: RetrySheetController.init,
                webFactory: WebScreen.init(url:),
                previewFactory: QLPreviewController.init,
                contactFactory: ContactController.init(_:),
                imagePickerFactory: UIImagePickerController.init,
                permissionFactory: RequestPermissionController.init
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ChatCoordinating)

        container.register(
            ContactCoordinator(
                requestsFactory: RequestsContainerController.init,
                singleChatFactory: SingleChatController.init(_:),
                imagePickerFactory: UIImagePickerController.init,
                nicknameFactory: NickameController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ContactCoordinating)

        container.register(
            RequestsCoordinator(
                searchFactory: SearchController.init,
                verifyingFactory: VerifyingController.init,
                contactFactory: ContactController.init(_:),
                nicknameFactory: NickameController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as RequestsCoordinating)

        container.register(
            OnboardingCoordinator(
                emailFactory: OnboardingEmailController.init,
                phoneFactory: OnboardingPhoneController.init,
                welcomeFactory: OnboardingWelcomeController.init,
                chatListFactory: ChatListController.init,
                startFactory: OnboardingStartController.init(_:),
                usernameFactory: OnboardingUsernameController.init(_:),
                restoreListFactory: RestoreListController.init(_:),
                successFactory: OnboardingSuccessController.init(_:),
                countriesFactory: CountryListController.init(_:),
                phoneConfirmationFactory: OnboardingPhoneConfirmationController.init(_:_:),
                emailConfirmationFactory: OnboardingEmailConfirmationController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as OnboardingCoordinating)

        container.register(
            ContactListCoordinator(
                scanFactory: ScanContainerController.init,
                searchFactory: SearchController.init,
                newGroupFactory: CreateGroupController.init,
                requestsFactory: RequestsContainerController.init,
                contactFactory: ContactController.init(_:),
                groupChatFactory: GroupChatController.init(_:),
                groupPopupFactory: CreatePopupController.init(_:_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ContactListCoordinating)

        container.register(
            ScanCoordinator(
                contactsFactory: ContactListController.init,
                requestsFactory: RequestsContainerController.init,
                contactFactory: ContactController.init(_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ScanCoordinating)

        container.register(
            ChatListCoordinator(
                scanFactory: ScanContainerController.init,
                searchFactory: SearchController.init,
                profileFactory: ProfileController.init,
                settingsFactory: SettingsController.init,
                contactsFactory: ContactListController.init,
                requestsFactory: RequestsContainerController.init,
                singleChatFactory: SingleChatController.init(_:),
                sideMenuFactory: MenuController.init(_:),
                groupChatFactory: GroupChatController.init(_:)
Bruno Muniz's avatar
Bruno Muniz committed
            ) as ChatListCoordinating)
    }
}