anytype-kotlin-wild/app/src/main/java/com/anytypeio/anytype/di/feature/AuthDI.kt
Evgenii Kozlov 5886fc1ae5
DROID-1654 App | Feature | Multispaces + Misc. enhancements (#300)
Co-authored-by: Konstantin Ivanov <54908981+konstantiniiv@users.noreply.github.com>
2023-10-24 12:41:32 +02:00

403 lines
12 KiB
Kotlin

package com.anytypeio.anytype.di.feature
import androidx.compose.material.ExperimentalMaterialApi
import com.anytypeio.anytype.CrashReporter
import com.anytypeio.anytype.analytics.base.Analytics
import com.anytypeio.anytype.core_utils.di.scope.PerFeature
import com.anytypeio.anytype.core_utils.di.scope.PerScreen
import com.anytypeio.anytype.domain.auth.interactor.ConvertWallet
import com.anytypeio.anytype.domain.auth.interactor.CreateAccount
import com.anytypeio.anytype.domain.auth.interactor.ObserveAccounts
import com.anytypeio.anytype.domain.auth.interactor.RecoverWallet
import com.anytypeio.anytype.domain.auth.interactor.SaveMnemonic
import com.anytypeio.anytype.domain.auth.interactor.SelectAccount
import com.anytypeio.anytype.domain.auth.interactor.SetupWallet
import com.anytypeio.anytype.domain.auth.interactor.StartLoadingAccounts
import com.anytypeio.anytype.domain.auth.repo.AuthRepository
import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers
import com.anytypeio.anytype.domain.block.repo.BlockRepository
import com.anytypeio.anytype.domain.config.ConfigStorage
import com.anytypeio.anytype.domain.config.FeaturesConfigProvider
import com.anytypeio.anytype.domain.device.PathProvider
import com.anytypeio.anytype.domain.`object`.SetupMobileUseCaseSkip
import com.anytypeio.anytype.domain.platform.MetricsProvider
import com.anytypeio.anytype.domain.search.ObjectTypesSubscriptionManager
import com.anytypeio.anytype.domain.search.RelationsSubscriptionManager
import com.anytypeio.anytype.presentation.auth.account.CreateAccountViewModelFactory
import com.anytypeio.anytype.presentation.auth.account.SelectAccountViewModelFactory
import com.anytypeio.anytype.presentation.auth.account.SetupNewAccountViewModelFactory
import com.anytypeio.anytype.presentation.auth.account.SetupSelectedAccountViewModelFactory
import com.anytypeio.anytype.presentation.auth.keychain.KeychainLoginViewModelFactory
import com.anytypeio.anytype.presentation.auth.model.Session
import com.anytypeio.anytype.presentation.auth.start.StartLoginViewModelFactory
import com.anytypeio.anytype.presentation.spaces.SpaceGradientProvider
import com.anytypeio.anytype.ui.auth.AboutAnalyticsFragment
import com.anytypeio.anytype.ui.auth.InvitationFragment
import com.anytypeio.anytype.ui.auth.KeychainLoginFragment
import com.anytypeio.anytype.ui.auth.StartLoginFragment
import com.anytypeio.anytype.ui.auth.account.CreateAccountFragment
import com.anytypeio.anytype.ui.auth.account.SelectAccountFragment
import com.anytypeio.anytype.ui.auth.account.SetupNewAccountFragment
import com.anytypeio.anytype.ui.auth.account.SetupSelectedAccountFragment
import dagger.Module
import dagger.Provides
import dagger.Subcomponent
@Subcomponent(modules = [AuthModule::class])
@PerFeature
interface AuthSubComponent {
@Subcomponent.Builder
interface Builder {
fun authModule(module: AuthModule): Builder
fun build(): AuthSubComponent
}
fun inject(fragment: InvitationFragment)
@ExperimentalMaterialApi
fun inject(fragment: AboutAnalyticsFragment)
fun startLoginComponentBuilder(): StartLoginSubComponent.Builder
fun createAccountComponentBuilder(): CreateAccountSubComponent.Builder
fun setupNewAccountComponentBuilder(): SetupNewAccountSubComponent.Builder
fun setupSelectedAccountComponentBuilder(): SetupSelectedAccountSubComponent.Builder
fun selectAccountComponentBuilder(): SelectAccountSubComponent.Builder
fun keychainLoginComponentBuilder(): KeychainLoginSubComponent.Builder
}
@Subcomponent(modules = [StartLoginModule::class])
@PerScreen
interface StartLoginSubComponent {
@Subcomponent.Builder
interface Builder {
fun startLoginModule(module: StartLoginModule): Builder
fun build(): StartLoginSubComponent
}
fun inject(fragment: StartLoginFragment)
}
@Subcomponent(modules = [CreateAccountModule::class])
@PerScreen
interface CreateAccountSubComponent {
@Subcomponent.Builder
interface Builder {
fun createAccountModule(module: CreateAccountModule): Builder
fun build(): CreateAccountSubComponent
}
fun inject(fragment: CreateAccountFragment)
}
@Subcomponent(modules = [SetupNewAccountModule::class])
@PerScreen
interface SetupNewAccountSubComponent {
@Subcomponent.Builder
interface Builder {
fun setupNewAccountModule(module: SetupNewAccountModule): Builder
fun build(): SetupNewAccountSubComponent
}
fun inject(fragment: SetupNewAccountFragment)
}
@Subcomponent(modules = [SetupSelectedAccountModule::class])
@PerScreen
interface SetupSelectedAccountSubComponent {
@Subcomponent.Builder
interface Builder {
fun setupSelectedAccountModule(module: SetupSelectedAccountModule): Builder
fun build(): SetupSelectedAccountSubComponent
}
fun inject(fragment: SetupSelectedAccountFragment)
}
@Subcomponent(modules = [SelectAccountModule::class])
@PerScreen
interface SelectAccountSubComponent {
@Subcomponent.Builder
interface Builder {
fun selectAccountModule(module: SelectAccountModule): Builder
fun build(): SelectAccountSubComponent
}
fun inject(fragment: SelectAccountFragment)
}
@Subcomponent(modules = [KeychainLoginModule::class])
@PerScreen
interface KeychainLoginSubComponent {
@Subcomponent.Builder
interface Builder {
fun keychainLoginModule(module: KeychainLoginModule): Builder
fun build(): KeychainLoginSubComponent
}
fun inject(fragment: KeychainLoginFragment)
}
@Module
object AuthModule {
@JvmStatic
@PerFeature
@Provides
fun provideSession(): Session {
return Session()
}
}
@Module
object StartLoginModule {
@JvmStatic
@PerScreen
@Provides
fun provideStartLoginViewModelFactory(
setupWallet: SetupWallet,
pathProvider: PathProvider,
analytics: Analytics
): StartLoginViewModelFactory {
return StartLoginViewModelFactory(
setupWallet = setupWallet,
pathProvider = pathProvider,
analytics = analytics
)
}
@JvmStatic
@PerScreen
@Provides
fun provideSetupWalletUseCase(
authRepository: AuthRepository
): SetupWallet {
return SetupWallet(
repository = authRepository
)
}
}
@Module
object CreateAccountModule {
@JvmStatic
@PerScreen
@Provides
fun provideCreateAccountViewModelFactory(
session: Session,
analytics: Analytics
): CreateAccountViewModelFactory {
return CreateAccountViewModelFactory(
session = session,
analytics = analytics
)
}
}
@Module
object SetupNewAccountModule {
@JvmStatic
@Provides
@PerScreen
fun provideSetupAccountViewModelFactory(
createAccount: CreateAccount,
session: Session,
analytics: Analytics,
relationsSubscriptionManager: RelationsSubscriptionManager,
objectTypesSubscriptionManager: ObjectTypesSubscriptionManager,
spaceGradientProvider: SpaceGradientProvider,
configStorage: ConfigStorage,
crashReporter: CrashReporter,
setupMobileUseCaseSkip: SetupMobileUseCaseSkip
): SetupNewAccountViewModelFactory {
return SetupNewAccountViewModelFactory(
createAccount = createAccount,
session = session,
analytics = analytics,
relationsSubscriptionManager = relationsSubscriptionManager,
objectTypesSubscriptionManager = objectTypesSubscriptionManager,
spaceGradientProvider = spaceGradientProvider,
configStorage = configStorage,
crashReporter = crashReporter,
setupMobileUseCaseSkip = setupMobileUseCaseSkip
)
}
@JvmStatic
@Provides
@PerScreen
fun gradientProvider(): SpaceGradientProvider = SpaceGradientProvider.Default
@JvmStatic
@Provides
@PerScreen
fun provideCreateAccountUseCase(
repository: AuthRepository,
configStorage: ConfigStorage,
metricsProvider: MetricsProvider
): CreateAccount = CreateAccount(
repository = repository,
configStorage = configStorage,
metricsProvider = metricsProvider
)
@JvmStatic
@Provides
@PerScreen
fun provideImportUseCase(
dispatchers: AppCoroutineDispatchers,
blockRepository: BlockRepository
) = SetupMobileUseCaseSkip(
repo = blockRepository,
dispatchers = dispatchers
)
}
@Module
object SetupSelectedAccountModule {
@JvmStatic
@Provides
@PerScreen
fun provideSetupSelectedAccountViewModelFactory(
selectAccount: SelectAccount,
pathProvider: PathProvider,
analytics: Analytics,
relationsSubscriptionManager: RelationsSubscriptionManager,
objectTypesSubscriptionManager: ObjectTypesSubscriptionManager,
crashReporter: CrashReporter,
configStorage: ConfigStorage
): SetupSelectedAccountViewModelFactory {
return SetupSelectedAccountViewModelFactory(
selectAccount = selectAccount,
pathProvider = pathProvider,
analytics = analytics,
relationsSubscriptionManager = relationsSubscriptionManager,
objectTypesSubscriptionManager = objectTypesSubscriptionManager,
crashReporter = crashReporter,
configStorage = configStorage
)
}
@JvmStatic
@Provides
@PerScreen
fun provideSelectAccountUseCase(
repository: AuthRepository,
configStorage: ConfigStorage,
featuresConfigProvider: FeaturesConfigProvider,
metricsProvider: MetricsProvider
): SelectAccount {
return SelectAccount(
repository = repository,
configStorage = configStorage,
featuresConfigProvider = featuresConfigProvider,
metricsProvider = metricsProvider
)
}
}
@Module
object SelectAccountModule {
@JvmStatic
@PerScreen
@Provides
fun provideSelectAccountViewModelFactory(
startLoadingAccounts: StartLoadingAccounts,
observeAccounts: ObserveAccounts,
analytics: Analytics
): SelectAccountViewModelFactory {
return SelectAccountViewModelFactory(
startLoadingAccounts = startLoadingAccounts,
observeAccounts = observeAccounts,
analytics = analytics
)
}
@JvmStatic
@PerScreen
@Provides
fun provideRecoverAccountUseCase(repository: AuthRepository): StartLoadingAccounts {
return StartLoadingAccounts(
repository = repository
)
}
@JvmStatic
@PerScreen
@Provides
fun provideObserveAccountsUseCase(
repository: AuthRepository
): ObserveAccounts {
return ObserveAccounts(
repository = repository
)
}
}
@Module
object KeychainLoginModule {
@JvmStatic
@Provides
@PerScreen
fun provideKeychainLoginViewModelFactory(
pathProvider: PathProvider,
recoverWallet: RecoverWallet,
convertWallet: ConvertWallet,
saveMnemonic: SaveMnemonic,
analytics: Analytics
): KeychainLoginViewModelFactory {
return KeychainLoginViewModelFactory(
pathProvider = pathProvider,
convertWallet = convertWallet,
recoverWallet = recoverWallet,
saveMnemonic = saveMnemonic,
analytics = analytics
)
}
@JvmStatic
@Provides
@PerScreen
fun provideRecoverWalletUseCase(
authRepository: AuthRepository
): RecoverWallet {
return RecoverWallet(
repository = authRepository
)
}
@JvmStatic
@Provides
@PerScreen
fun provideSaveMnemonicUseCase(
authRepository: AuthRepository
): SaveMnemonic {
return SaveMnemonic(
repository = authRepository
)
}
@JvmStatic
@Provides
@PerScreen
fun provideConvertWallet(
authRepository: AuthRepository
): ConvertWallet {
return ConvertWallet(
authRepository = authRepository
)
}
}