Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-26 11:05:04 +01:00
parent 636ae3ee50
commit a71b7ed4ba
43 changed files with 590 additions and 681 deletions

View file

@ -14,9 +14,6 @@ import com.google.accompanist.systemuicontroller.rememberSystemUiController
import com.tangem.common.routing.AppRouter
import com.tangem.core.navigation.finisher.AppFinisher
import com.tangem.core.ui.UiDependencies
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig
import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfigContent
import com.tangem.core.ui.components.bottomsheets.sheet.TangemBottomSheet
import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.screen.ComposeActivity
import com.tangem.feature.tester.presentation.accounts.ui.AccountsScreen
@ -38,14 +35,7 @@ import com.tangem.feature.tester.presentation.providers.ui.BlockchainProvidersSc
import com.tangem.feature.tester.presentation.providers.viewmodel.BlockchainProvidersViewModel
import com.tangem.feature.tester.presentation.testpush.ui.TestPushScreen
import com.tangem.feature.tester.presentation.testpush.viewmodel.TestPushViewModel
import com.tangem.feature.tester.presentation.news.ui.NewsScreen
import com.tangem.feature.tester.presentation.news.viewmodel.NewsViewModel
import com.tangem.features.news.details.impl.MockArticlesFactory
import com.tangem.features.news.details.impl.ui.ArticleUM
import com.tangem.features.news.details.impl.ui.NewsDetailsContent
import com.tangem.features.news.details.impl.ui.NewsDetailsUM
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.collections.immutable.ImmutableList
import kotlinx.collections.immutable.persistentSetOf
import javax.inject.Inject
@ -92,7 +82,6 @@ internal class TesterActivity : ComposeActivity() {
ButtonUM.TESTER_ACTIONS,
ButtonUM.TEST_PUSHES,
ButtonUM.ACCOUNTS,
ButtonUM.NEWS,
),
onButtonClick = { buttonUM ->
val route = when (buttonUM) {
@ -103,7 +92,6 @@ internal class TesterActivity : ComposeActivity() {
ButtonUM.TESTER_ACTIONS -> TesterScreen.TESTER_ACTIONS
ButtonUM.TEST_PUSHES -> TesterScreen.TEST_PUSHES
ButtonUM.ACCOUNTS -> TesterScreen.ACCOUNTS
ButtonUM.NEWS -> TesterScreen.NEWS
}
innerTesterRouter.open(route)
@ -174,64 +162,6 @@ internal class TesterActivity : ComposeActivity() {
AccountsScreen(state)
}
composable(route = TesterScreen.NEWS.name) {
val viewModel = hiltViewModel<NewsViewModel>().apply {
setupNavigation(innerTesterRouter)
}
val state by viewModel.uiState.collectAsStateWithLifecycle()
NewsScreen(state)
}
composable(route = TesterScreen.NEWS_DETAILS.name) {
NewsDetailsContent(
state = NewsDetailsUM(
articles = MockArticlesFactory.createMockArticles(),
selectedArticleIndex = 0,
onLikeClick = { },
onShareClick = { },
),
onBackClick = { innerTesterRouter.back() },
)
}
composable(route = TesterScreen.NEWS_DETAILS_BOTTOM_SHEET.name) {
NewsDetailsBottomSheetTest(
onDismiss = { innerTesterRouter.back() },
)
}
}
}
@Composable
private fun NewsDetailsBottomSheetTest(onDismiss: () -> Unit) {
data class NewsDetailsBottomSheetContent(
val articles: ImmutableList<ArticleUM>,
) : TangemBottomSheetConfigContent
val content = NewsDetailsBottomSheetContent(
articles = MockArticlesFactory.createMockArticles(),
)
TangemBottomSheet<NewsDetailsBottomSheetContent>(
config = TangemBottomSheetConfig(
isShown = true,
onDismissRequest = onDismiss,
content = content,
),
containerColor = TangemTheme.colors.background.tertiary,
) { sheetContent ->
NewsDetailsContent(
state = NewsDetailsUM(
articles = sheetContent.articles,
selectedArticleIndex = 0,
onLikeClick = { },
onShareClick = { },
),
onBackClick = onDismiss,
isBottomSheetMode = true,
)
}
}
}

View file

@ -25,6 +25,5 @@ data class TesterMenuUM(
TESTER_ACTIONS(R.string.tester_actions),
TEST_PUSHES(R.string.test_push),
ACCOUNTS(R.string.accounts),
NEWS(R.string.news),
}
}

View file

@ -14,7 +14,4 @@ internal enum class TesterScreen {
BLOCKCHAIN_PROVIDERS,
TEST_PUSHES,
ACCOUNTS,
NEWS,
NEWS_DETAILS,
NEWS_DETAILS_BOTTOM_SHEET,
}

View file

@ -1,17 +0,0 @@
package com.tangem.feature.tester.presentation.news.state
import androidx.annotation.StringRes
import com.tangem.feature.tester.impl.R
import kotlinx.collections.immutable.ImmutableSet
data class NewsUM(
val onBackClick: () -> Unit,
val buttons: ImmutableSet<ButtonUM>,
val onButtonClick: (ButtonUM) -> Unit,
) {
enum class ButtonUM(@StringRes val textResId: Int) {
NEWS_DETAILS(R.string.news_details),
NEWS_DETAILS_BOTTOM_SHEET(R.string.news_details_bottom_sheet),
}
}

View file

@ -1,62 +0,0 @@
package com.tangem.feature.tester.presentation.news.ui
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import com.tangem.core.ui.components.PrimaryButton
import com.tangem.core.ui.components.appbar.AppBarWithBackButton
import com.tangem.core.ui.extensions.stringResourceSafe
import com.tangem.core.ui.res.TangemTheme
import com.tangem.feature.tester.impl.R
import com.tangem.feature.tester.presentation.news.state.NewsUM
import kotlinx.collections.immutable.ImmutableSet
@OptIn(ExperimentalFoundationApi::class)
@Composable
internal fun NewsScreen(state: NewsUM, modifier: Modifier = Modifier) {
BackHandler(onBack = state.onBackClick)
LazyColumn(
modifier = modifier
.fillMaxSize()
.background(TangemTheme.colors.background.primary),
) {
stickyHeader { AppBar(onBackClick = state.onBackClick) }
NewsButtons(buttons = state.buttons, onButtonClick = state.onButtonClick)
}
}
@Composable
private fun AppBar(onBackClick: () -> Unit) {
AppBarWithBackButton(
onBackClick = onBackClick,
text = stringResourceSafe(id = R.string.news),
containerColor = TangemTheme.colors.background.primary,
)
}
@Suppress("FunctionNaming")
private fun LazyListScope.NewsButtons(
buttons: ImmutableSet<NewsUM.ButtonUM>,
onButtonClick: (NewsUM.ButtonUM) -> Unit,
) {
items(buttons.toList()) { button ->
PrimaryButton(
text = stringResourceSafe(button.textResId),
onClick = { onButtonClick(button) },
modifier = Modifier
.padding(horizontal = 16.dp, vertical = 8.dp)
.fillMaxWidth(),
)
}
}

View file

@ -1,46 +0,0 @@
package com.tangem.feature.tester.presentation.news.viewmodel
import androidx.lifecycle.ViewModel
import com.tangem.feature.tester.presentation.navigation.InnerTesterRouter
import com.tangem.feature.tester.presentation.navigation.TesterScreen
import com.tangem.feature.tester.presentation.news.state.NewsUM
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.persistentSetOf
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import javax.inject.Inject
@HiltViewModel
internal class NewsViewModel @Inject constructor() : ViewModel() {
private val _uiState = MutableStateFlow(createInitialState())
val uiState: StateFlow<NewsUM> = _uiState
private var router: InnerTesterRouter? = null
fun setupNavigation(router: InnerTesterRouter) {
this.router = router
}
private fun createInitialState(): NewsUM {
return NewsUM(
onBackClick = ::onBackClick,
buttons = persistentSetOf(
NewsUM.ButtonUM.NEWS_DETAILS,
NewsUM.ButtonUM.NEWS_DETAILS_BOTTOM_SHEET,
),
onButtonClick = ::onButtonClick,
)
}
private fun onBackClick() {
router?.back()
}
private fun onButtonClick(button: NewsUM.ButtonUM) {
when (button) {
NewsUM.ButtonUM.NEWS_DETAILS -> router?.open(TesterScreen.NEWS_DETAILS)
NewsUM.ButtonUM.NEWS_DETAILS_BOTTOM_SHEET -> router?.open(TesterScreen.NEWS_DETAILS_BOTTOM_SHEET)
}
}
}