From cf7d5814d62bd491da760ff76f57ce92ec77fa3e Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 28 May 2024 19:20:56 +0400 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 3 ++ .../com/tangem/tap/ApplicationEntryPoint.kt | 6 +++ .../main/java/com/tangem/tap/MainActivity.kt | 5 +++ .../java/com/tangem/tap/TangemApplication.kt | 10 +++++ .../tap/common/extensions/Navigation.kt | 12 ++++- .../tap/di/RootAppComponentContextModule.kt | 45 +++++++++++++++++++ .../tap/proxy/redux/DaggerGraphAction.kt | 2 + .../tap/proxy/redux/DaggerGraphReducer.kt | 1 + .../tap/proxy/redux/DaggerGraphState.kt | 6 +++ core/decompose/build.gradle.kts | 2 +- .../configs/feature_toggles_config.json | 4 ++ features/details/api/.gitignore | 1 + features/details/api/build.gradle.kts | 21 +++++++++ .../features/details/DetailsEntryPoint.kt | 9 ++++ .../features/details/DetailsFeatureToggles.kt | 6 +++ features/details/impl/.gitignore | 1 + features/details/impl/build.gradle.kts | 45 +++++++++++++++++++ .../details/DefaultDetailsFeatureToggles.kt | 11 +++++ .../features/details/DetailsFragment.kt | 33 ++++++++++++++ .../details/component/DetailsComponent.kt | 22 +++++++++ .../component/UserWalletListComponent.kt | 16 +++++++ .../component/WalletConnectComponent.kt | 23 ++++++++++ .../preview/PreviewDetailsComponent.kt | 14 ++++++ .../preview/PreviewUserWalletListComponent.kt | 14 ++++++ .../preview/PreviewWalletConnectComponent.kt | 16 +++++++ .../features/details/di/FeatureModule.kt | 29 ++++++++++++ .../tangem/features/details/di/ModelModule.kt | 20 +++++++++ .../details/entity/DetailsFooterUM.kt | 17 +++++++ .../features/details/entity/DetailsItemUM.kt | 40 +++++++++++++++++ .../features/details/entity/DetailsUM.kt | 9 ++++ .../details/entity/UserWalletListUM.kt | 22 +++++++++ .../features/details/model/DetailsModel.kt | 10 +++++ settings.gradle.kts | 3 ++ 33 files changed, 476 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/com/tangem/tap/di/RootAppComponentContextModule.kt create mode 100644 features/details/api/.gitignore create mode 100644 features/details/api/build.gradle.kts create mode 100644 features/details/api/src/main/kotlin/com/tangem/features/details/DetailsEntryPoint.kt create mode 100644 features/details/api/src/main/kotlin/com/tangem/features/details/DetailsFeatureToggles.kt create mode 100644 features/details/impl/.gitignore create mode 100644 features/details/impl/build.gradle.kts create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/DefaultDetailsFeatureToggles.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/DetailsFragment.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/component/DetailsComponent.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/component/UserWalletListComponent.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/component/WalletConnectComponent.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewUserWalletListComponent.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewWalletConnectComponent.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/di/FeatureModule.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/di/ModelModule.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsFooterUM.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsItemUM.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsUM.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/entity/UserWalletListUM.kt create mode 100644 features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 46ab6491ef..512db83b6d 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -77,6 +77,7 @@ dependencies { implementation(projects.core.ui) implementation(projects.core.datasource) implementation(projects.core.utils) + implementation(projects.core.decompose) implementation(projects.core.deepLinks) implementation(projects.libs.crypto) implementation(projects.libs.auth) @@ -123,6 +124,8 @@ dependencies { implementation(projects.features.qrScanning.impl) implementation(projects.features.staking.api) implementation(projects.features.staking.impl) + implementation(projects.features.details.api) + implementation(projects.features.details.impl) /** AndroidX libraries */ implementation(deps.androidx.core.ktx) diff --git a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt index 83157a1231..be2d822333 100644 --- a/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt +++ b/app/src/main/java/com/tangem/tap/ApplicationEntryPoint.kt @@ -26,6 +26,8 @@ import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase +import com.tangem.features.details.DetailsEntryPoint +import com.tangem.features.details.DetailsFeatureToggles import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles import com.tangem.features.send.api.featuretoggles.SendFeatureToggles import com.tangem.tap.domain.walletconnect2.domain.WalletConnectSessionsRepository @@ -104,4 +106,8 @@ interface ApplicationEntryPoint { fun getGetFeedbackEmailUseCase(): GetFeedbackEmailUseCase fun getSaveBlockchainErrorUseCase(): SaveBlockchainErrorUseCase + + fun getDetailsFeatureToggles(): DetailsFeatureToggles + + fun getDetailsEntryPoint(): DetailsEntryPoint } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index 78b55f9ecb..7b2ac4c692 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -27,6 +27,7 @@ import by.kirich1409.viewbindingdelegate.viewBinding import com.google.android.material.snackbar.BaseTransientBottomBar import com.google.android.material.snackbar.Snackbar import com.tangem.core.analytics.api.AnalyticsEventHandler +import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.deeplink.DeepLinksRegistry import com.tangem.core.navigation.AppScreen import com.tangem.core.navigation.NavigationAction @@ -155,6 +156,9 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac @Inject lateinit var emailSender: EmailSender + @Inject + lateinit var rootComponentContext: AppComponentContext + internal val viewModel: MainViewModel by viewModels() private lateinit var appThemeModeFlow: SharedFlow @@ -239,6 +243,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac sendRouter = sendRouter, qrScanningRouter = qrScanningRouter, emailSender = emailSender, + rootComponentContext = rootComponentContext, ), ) } diff --git a/app/src/main/java/com/tangem/tap/TangemApplication.kt b/app/src/main/java/com/tangem/tap/TangemApplication.kt index d731d06dd8..792d4a3d22 100644 --- a/app/src/main/java/com/tangem/tap/TangemApplication.kt +++ b/app/src/main/java/com/tangem/tap/TangemApplication.kt @@ -43,6 +43,8 @@ import com.tangem.domain.walletmanager.WalletManagersFacade import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase +import com.tangem.features.details.DetailsEntryPoint +import com.tangem.features.details.DetailsFeatureToggles import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles import com.tangem.features.send.api.featuretoggles.SendFeatureToggles import com.tangem.tap.common.analytics.AnalyticsFactory @@ -181,6 +183,12 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { get() = entryPoint.getSaveBlockchainErrorUseCase() // endregion + private val detailsFeatureToggles: DetailsFeatureToggles + get() = entryPoint.getDetailsFeatureToggles() + + private val detailsEntryPoint: DetailsEntryPoint + get() = entryPoint.getDetailsEntryPoint() + override fun onCreate() { super.onCreate() @@ -264,6 +272,8 @@ abstract class TangemApplication : Application(), ImageLoaderFactory { settingsRepository = settingsRepository, blockchainSDKFactory = blockchainSDKFactory, saveBlockchainErrorUseCase = saveBlockchainErrorUseCase, + detailsFeatureToggles = detailsFeatureToggles, + detailsEntryPoint = detailsEntryPoint, ), ), ) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt index f6c299acb1..9ee6f6a614 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt @@ -137,7 +137,17 @@ private fun fragmentFactory(screen: AppScreen): Fragment { SendFragment() } } - AppScreen.Details -> DetailsFragment() + AppScreen.Details -> { + val featureToggles = store.inject(getDependency = DaggerGraphState::detailsFeatureToggles) + + if (featureToggles.isRedesignEnabled) { + store.inject(DaggerGraphState::detailsEntryPoint).entryFragment( + parentContext = store.inject(DaggerGraphState::rootComponentContext), + ) + } else { + DetailsFragment() + } + } AppScreen.DetailsSecurity -> SecurityModeFragment() AppScreen.CardSettings -> CardSettingsFragment() AppScreen.AppSettings -> AppSettingsFragment() diff --git a/app/src/main/java/com/tangem/tap/di/RootAppComponentContextModule.kt b/app/src/main/java/com/tangem/tap/di/RootAppComponentContextModule.kt new file mode 100644 index 0000000000..038c7d5a86 --- /dev/null +++ b/app/src/main/java/com/tangem/tap/di/RootAppComponentContextModule.kt @@ -0,0 +1,45 @@ +package com.tangem.tap.di + +import android.content.Context +import androidx.appcompat.app.AppCompatActivity +import com.arkivanov.decompose.defaultComponentContext +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.decompose.context.DefaultAppComponentContext +import com.tangem.core.decompose.di.DecomposeComponent +import com.tangem.core.decompose.ui.UiMessage +import com.tangem.core.decompose.ui.UiMessageHandler +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.android.components.ActivityComponent +import dagger.hilt.android.qualifiers.ActivityContext +import dagger.hilt.android.scopes.ActivityScoped +import timber.log.Timber + +@Module +@InstallIn(ActivityComponent::class) +internal object RootAppComponentContextModule { + + @Provides + @ActivityScoped + fun provideRootAppComponentContext( + @ActivityContext context: Context, + dispatchers: CoroutineDispatcherProvider, + componentBuilder: DecomposeComponent.Builder, + ): AppComponentContext { + // TODO: Implement message handler + val dummyMessageHandler = object : UiMessageHandler { + override fun handleMessage(message: UiMessage) { + Timber.w("Unable to handle message: $message") + } + } + + return DefaultAppComponentContext( + componentContext = (context as AppCompatActivity).defaultComponentContext(), + messageHandler = dummyMessageHandler, + dispatchers = dispatchers, + hiltComponentBuilder = componentBuilder, + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt index f854ba0dae..3855cdb3f8 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphAction.kt @@ -1,5 +1,6 @@ package com.tangem.tap.proxy.redux +import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.navigation.email.EmailSender import com.tangem.domain.card.ScanCardUseCase import com.tangem.domain.card.repository.CardSdkConfigRepository @@ -25,5 +26,6 @@ sealed interface DaggerGraphAction : Action { val sendRouter: SendRouter, val qrScanningRouter: QrScanningRouter, val emailSender: EmailSender, + val rootComponentContext: AppComponentContext, ) : DaggerGraphAction } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt index b25fdce12b..d6db12a587 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphReducer.kt @@ -23,6 +23,7 @@ object DaggerGraphReducer { sendRouter = action.sendRouter, qrScanningRouter = action.qrScanningRouter, emailSender = action.emailSender, + rootComponentContext = action.rootComponentContext, ) } } diff --git a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt index ab600ee8ea..b89bfaeb6f 100644 --- a/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt +++ b/app/src/main/java/com/tangem/tap/proxy/redux/DaggerGraphState.kt @@ -2,6 +2,7 @@ package com.tangem.tap.proxy.redux import com.tangem.TangemSdkLogger import com.tangem.blockchainsdk.BlockchainSDKFactory +import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.navigation.email.EmailSender import com.tangem.datasource.connection.NetworkConnectionManager import com.tangem.domain.appcurrency.repository.AppCurrencyRepository @@ -23,6 +24,8 @@ import com.tangem.domain.wallets.legacy.UserWalletsListManager import com.tangem.domain.wallets.repository.WalletsRepository import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase import com.tangem.feature.qrscanning.QrScanningRouter +import com.tangem.features.details.DetailsEntryPoint +import com.tangem.features.details.DetailsFeatureToggles import com.tangem.features.managetokens.featuretoggles.ManageTokensFeatureToggles import com.tangem.features.managetokens.navigation.ManageTokensUi import com.tangem.features.send.api.featuretoggles.SendFeatureToggles @@ -38,6 +41,7 @@ import com.tangem.tap.proxy.AppStateHolder import org.rekotlin.StateType data class DaggerGraphState( + val rootComponentContext: AppComponentContext? = null, val testerRouter: TesterRouter? = null, val networkConnectionManager: NetworkConnectionManager? = null, val customTokenFeatureToggles: CustomTokenFeatureToggles? = null, @@ -73,4 +77,6 @@ data class DaggerGraphState( val blockchainSDKFactory: BlockchainSDKFactory? = null, val emailSender: EmailSender? = null, val saveBlockchainErrorUseCase: SaveBlockchainErrorUseCase? = null, + val detailsFeatureToggles: DetailsFeatureToggles? = null, + val detailsEntryPoint: DetailsEntryPoint? = null, ) : StateType \ No newline at end of file diff --git a/core/decompose/build.gradle.kts b/core/decompose/build.gradle.kts index 7dfba4d379..aa1b6e3c82 100644 --- a/core/decompose/build.gradle.kts +++ b/core/decompose/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } dependencies { - implementation(projects.core.utils) + api(projects.core.utils) api(deps.decompose) implementation(deps.kotlin.coroutines) diff --git a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json index 19da1d1f14..015ca0a117 100644 --- a/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/featuretoggles/src/main/assets/configs/feature_toggles_config.json @@ -38,5 +38,9 @@ { "name": "FULL_RESET_ENABLED", "version": "5.12.0" + }, + { + "name": "DETAILS_REDESIGN_ENABLED", + "version": "undefined" } ] diff --git a/features/details/api/.gitignore b/features/details/api/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/features/details/api/.gitignore @@ -0,0 +1 @@ +/build diff --git a/features/details/api/build.gradle.kts b/features/details/api/build.gradle.kts new file mode 100644 index 0000000000..5010f64d85 --- /dev/null +++ b/features/details/api/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) + id("configuration") +} + +android { + namespace = "com.tangem.features.details.api" +} + +dependencies { + + /* Project - Domain */ + implementation(projects.domain.wallets.models) + + /* Project - Core */ + implementation(projects.core.decompose) + + /* AndroidX */ + implementation(deps.androidx.fragment.ktx) +} \ No newline at end of file diff --git a/features/details/api/src/main/kotlin/com/tangem/features/details/DetailsEntryPoint.kt b/features/details/api/src/main/kotlin/com/tangem/features/details/DetailsEntryPoint.kt new file mode 100644 index 0000000000..9f8a7d8226 --- /dev/null +++ b/features/details/api/src/main/kotlin/com/tangem/features/details/DetailsEntryPoint.kt @@ -0,0 +1,9 @@ +package com.tangem.features.details + +import androidx.fragment.app.Fragment +import com.tangem.core.decompose.context.AppComponentContext + +interface DetailsEntryPoint { + + fun entryFragment(parentContext: AppComponentContext): Fragment +} \ No newline at end of file diff --git a/features/details/api/src/main/kotlin/com/tangem/features/details/DetailsFeatureToggles.kt b/features/details/api/src/main/kotlin/com/tangem/features/details/DetailsFeatureToggles.kt new file mode 100644 index 0000000000..15ba44576e --- /dev/null +++ b/features/details/api/src/main/kotlin/com/tangem/features/details/DetailsFeatureToggles.kt @@ -0,0 +1,6 @@ +package com.tangem.features.details + +interface DetailsFeatureToggles { + + val isRedesignEnabled: Boolean +} \ No newline at end of file diff --git a/features/details/impl/.gitignore b/features/details/impl/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/features/details/impl/.gitignore @@ -0,0 +1 @@ +/build diff --git a/features/details/impl/build.gradle.kts b/features/details/impl/build.gradle.kts new file mode 100644 index 0000000000..76cfca8bdc --- /dev/null +++ b/features/details/impl/build.gradle.kts @@ -0,0 +1,45 @@ +plugins { + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) + alias(deps.plugins.kotlin.kapt) + alias(deps.plugins.kotlin.serialization) + alias(deps.plugins.hilt.android) + id("configuration") +} + +android { + namespace = "com.tangem.features.details.impl" +} + +dependencies { + + /* Project - API */ + implementation(projects.features.details.api) + + /* Project - Core */ + implementation(projects.core.decompose) + implementation(projects.core.ui) + implementation(projects.core.featuretoggles) + + /* Project - Domain */ + implementation(projects.domain.wallets.models) + + /* AndroidX */ + implementation(deps.androidx.fragment.ktx) + implementation(deps.lifecycle.compose) + + /* Compose */ + implementation(deps.compose.ui) + implementation(deps.compose.ui.tooling) + implementation(deps.compose.accompanist.systemUiController) + implementation(deps.compose.foundation) + implementation(deps.compose.material3) + implementation(deps.compose.shimmer) + + /* DI */ + implementation(deps.hilt.android) + kapt(deps.hilt.kapt) + + /* Other */ + implementation(deps.kotlin.immutable.collections) +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/DefaultDetailsFeatureToggles.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/DefaultDetailsFeatureToggles.kt new file mode 100644 index 0000000000..dc07bef55f --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/DefaultDetailsFeatureToggles.kt @@ -0,0 +1,11 @@ +package com.tangem.features.details + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager + +internal class DefaultDetailsFeatureToggles( + private val featureTogglesManager: FeatureTogglesManager, +) : DetailsFeatureToggles { + + override val isRedesignEnabled: Boolean + get() = featureTogglesManager.isFeatureEnabled("DETAILS_REDESIGN_ENABLED") +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/DetailsFragment.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/DetailsFragment.kt new file mode 100644 index 0000000000..454de7ed1b --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/DetailsFragment.kt @@ -0,0 +1,33 @@ +package com.tangem.features.details + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.fragment.app.Fragment +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.ui.UiDependencies +import com.tangem.core.ui.screen.ComposeFragment +import com.tangem.features.details.component.preview.PreviewDetailsComponent +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +// TODO: Remove after [REDACTED_JIRA] +@AndroidEntryPoint +internal class DetailsFragment : ComposeFragment() { + + @Inject + override lateinit var uiDependencies: UiDependencies + + @Composable + override fun ScreenContent(modifier: Modifier) { + // TODO: Update to use the actual component in [REDACTED_TASK_KEY] + PreviewDetailsComponent().View(modifier = modifier) + } + + companion object : DetailsEntryPoint { + + override fun entryFragment(parentContext: AppComponentContext): Fragment { + // TODO: Update to use the actual component in [REDACTED_TASK_KEY] + return DetailsFragment() + } + } +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/DetailsComponent.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/DetailsComponent.kt new file mode 100644 index 0000000000..fbe165d89e --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/DetailsComponent.kt @@ -0,0 +1,22 @@ +package com.tangem.features.details.component + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.domain.wallets.models.UserWalletId + +interface DetailsComponent { + + @Composable + @Suppress("TopLevelComposableFunctions") // TODO: Remove this check + fun View(modifier: Modifier) + + interface Factory { + + fun create(context: AppComponentContext, params: Params): DetailsComponent + } + + data class Params( + val selectedUserWalletId: UserWalletId, + ) +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/UserWalletListComponent.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/UserWalletListComponent.kt new file mode 100644 index 0000000000..0a76b5fcd1 --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/UserWalletListComponent.kt @@ -0,0 +1,16 @@ +package com.tangem.features.details.component + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.core.decompose.context.AppComponentContext + +interface UserWalletListComponent { + + @Composable + @Suppress("TopLevelComposableFunctions") // TODO: Remove this check + fun View(modifier: Modifier) + + interface Factory { + fun create(context: AppComponentContext): UserWalletListComponent + } +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/WalletConnectComponent.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/WalletConnectComponent.kt new file mode 100644 index 0000000000..c8a317814b --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/WalletConnectComponent.kt @@ -0,0 +1,23 @@ +package com.tangem.features.details.component + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.domain.wallets.models.UserWalletId + +interface WalletConnectComponent { + + suspend fun checkIsAvailable(): Boolean + + @Composable + @Suppress("TopLevelComposableFunctions") // TODO: Remove this check + fun View(modifier: Modifier) + + interface Factory { + fun create(context: AppComponentContext, params: Params): WalletConnectComponent + } + + data class Params( + val userWalletId: UserWalletId, + ) +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt new file mode 100644 index 0000000000..c0c9d5492c --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt @@ -0,0 +1,14 @@ +package com.tangem.features.details.component.preview + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.features.details.component.DetailsComponent + +internal class PreviewDetailsComponent : DetailsComponent { + + @Composable + @Suppress("TopLevelComposableFunctions") // TODO: Remove this check + override fun View(modifier: Modifier) { + TODO("Will be implemented in [REDACTED_TASK_KEY]") + } +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewUserWalletListComponent.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewUserWalletListComponent.kt new file mode 100644 index 0000000000..8341d24070 --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewUserWalletListComponent.kt @@ -0,0 +1,14 @@ +package com.tangem.features.details.component.preview + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.features.details.component.UserWalletListComponent + +internal class PreviewUserWalletListComponent : UserWalletListComponent { + + @Composable + @Suppress("TopLevelComposableFunctions") // TODO: Remove this check + override fun View(modifier: Modifier) { + TODO("Will be implemented in [REDACTED_TASK_KEY]") + } +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewWalletConnectComponent.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewWalletConnectComponent.kt new file mode 100644 index 0000000000..6a4aa2df28 --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewWalletConnectComponent.kt @@ -0,0 +1,16 @@ +package com.tangem.features.details.component.preview + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.features.details.component.WalletConnectComponent + +internal class PreviewWalletConnectComponent : WalletConnectComponent { + + override suspend fun checkIsAvailable(): Boolean = true + + @Composable + @Suppress("TopLevelComposableFunctions") // TODO: Remove this check + override fun View(modifier: Modifier) { + TODO("Will be implemented in [REDACTED_TASK_KEY]") + } +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/di/FeatureModule.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/di/FeatureModule.kt new file mode 100644 index 0000000000..f9a437ee25 --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/di/FeatureModule.kt @@ -0,0 +1,29 @@ +package com.tangem.features.details.di + +import com.tangem.core.featuretoggle.manager.FeatureTogglesManager +import com.tangem.features.details.DefaultDetailsFeatureToggles +import com.tangem.features.details.DetailsEntryPoint +import com.tangem.features.details.DetailsFeatureToggles +import com.tangem.features.details.DetailsFragment +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object FeatureModule { + + @Provides + @Singleton + fun provideFeatureToggles(featureTogglesManager: FeatureTogglesManager): DetailsFeatureToggles { + return DefaultDetailsFeatureToggles(featureTogglesManager) + } + + @Provides + @Singleton + fun provideEntryPoint(): DetailsEntryPoint { + return DetailsFragment.Companion + } +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/di/ModelModule.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/di/ModelModule.kt new file mode 100644 index 0000000000..8b429e0438 --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/di/ModelModule.kt @@ -0,0 +1,20 @@ +package com.tangem.features.details.di + +import com.tangem.core.decompose.di.DecomposeComponent +import com.tangem.core.decompose.model.Model +import com.tangem.features.details.model.DetailsModel +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.multibindings.ClassKey +import dagger.multibindings.IntoMap + +@Module +@InstallIn(DecomposeComponent::class) +internal interface ModelModule { + + @Binds + @IntoMap + @ClassKey(DetailsModel::class) + fun provideDetailsModel(model: DetailsModel): Model +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsFooterUM.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsFooterUM.kt new file mode 100644 index 0000000000..267acbe9d0 --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsFooterUM.kt @@ -0,0 +1,17 @@ +package com.tangem.features.details.entity + +import androidx.annotation.DrawableRes +import kotlinx.collections.immutable.ImmutableList + +internal data class DetailsFooterUM( + val appVersion: String, + val socials: ImmutableList, +) { + + data class Social( + val id: String, + @DrawableRes + val iconResId: Int, + val onClick: () -> Unit, + ) +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsItemUM.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsItemUM.kt new file mode 100644 index 0000000000..0dabab81bd --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsItemUM.kt @@ -0,0 +1,40 @@ +package com.tangem.features.details.entity + +import androidx.annotation.DrawableRes +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.ui.Modifier +import com.tangem.core.ui.extensions.TextReference +import kotlinx.collections.immutable.ImmutableList + +@Immutable +internal sealed class DetailsItemUM { + + abstract val id: String + + data class Basic( + override val id: String, + val items: ImmutableList, + ) : DetailsItemUM() { + + data class Item( + val title: TextReference, + @DrawableRes + val iconRes: Int, + val onClick: () -> Unit, + ) + } + + data class Component( + override val id: String, + val content: Content, + ) : DetailsItemUM() { + + fun interface Content { + + @Composable + @Suppress("TopLevelComposableFunctions", "ComposableFunctionName") + operator fun invoke(modifier: Modifier) + } + } +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsUM.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsUM.kt new file mode 100644 index 0000000000..15f0fead96 --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/DetailsUM.kt @@ -0,0 +1,9 @@ +package com.tangem.features.details.entity + +import kotlinx.collections.immutable.ImmutableList + +internal data class DetailsUM( + val items: ImmutableList, + val footer: DetailsFooterUM, + val popBack: () -> Unit, +) \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/UserWalletListUM.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/UserWalletListUM.kt new file mode 100644 index 0000000000..6848e0e77b --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/entity/UserWalletListUM.kt @@ -0,0 +1,22 @@ +package com.tangem.features.details.entity + +import androidx.annotation.DrawableRes +import com.tangem.core.ui.extensions.TextReference +import com.tangem.domain.wallets.models.UserWalletId +import kotlinx.collections.immutable.ImmutableList + +internal data class UserWalletListUM( + val userWallets: ImmutableList, + val addNewWalletText: TextReference, + val onAddNewWalletClick: () -> Unit, +) { + + data class UserWalletUM( + val id: UserWalletId, + val name: String, + val information: TextReference, + @DrawableRes + val imageResId: Int, + val onClick: () -> Unit, + ) +} \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt new file mode 100644 index 0000000000..918c27eb97 --- /dev/null +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt @@ -0,0 +1,10 @@ +package com.tangem.features.details.model + +import com.tangem.core.decompose.model.Model +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import javax.inject.Inject + +// TODO: Will be implemented later +internal class DetailsModel @Inject constructor( + override val dispatchers: CoroutineDispatcherProvider, +) : Model() \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index eeeaa4c19a..1b3dab02bb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -156,6 +156,9 @@ include(":features:qr-scanning:impl") include(":features:staking:api") include(":features:staking:impl") + +include(":features:details:api") +include(":features:details:impl") // endregion Feature modules // region Domain modules