From a810f1829032dc59f9cdcbd9fc4879d8f40a941b Mon Sep 17 00:00:00 2001 From: mdrlzy Date: Tue, 27 May 2025 03:48:03 +0600 Subject: [PATCH 1/2] Add change base code btn to portfolio main screen --- .../presentation/main/PortfolioScreen.kt | 68 ++++++++++++++++++- .../presentation/main/PortfolioViewModel.kt | 10 +-- .../presentation/SearchCurrencyScreen.kt | 3 +- 3 files changed, 73 insertions(+), 8 deletions(-) diff --git a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/main/PortfolioScreen.kt b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/main/PortfolioScreen.kt index 7c63ce769..162124ffc 100644 --- a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/main/PortfolioScreen.kt +++ b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/main/PortfolioScreen.kt @@ -4,16 +4,23 @@ package dev.arkbuilders.rate.feature.portfolio.presentation.main import androidx.activity.compose.BackHandler import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.pager.PagerState import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material3.ExperimentalMaterial3Api @@ -29,8 +36,10 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -40,11 +49,13 @@ import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.ExternalModuleGraph import com.ramcosta.composedestinations.generated.portfolio.destinations.AddAssetScreenDestination import com.ramcosta.composedestinations.generated.portfolio.destinations.EditAssetScreenDestination +import com.ramcosta.composedestinations.generated.search.destinations.SearchCurrencyScreenDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.result.ResultRecipient import com.ramcosta.composedestinations.result.onResult import dev.arkbuilders.rate.core.domain.CurrUtils import dev.arkbuilders.rate.core.domain.model.CurrencyCode +import dev.arkbuilders.rate.core.presentation.CoreRDrawable import dev.arkbuilders.rate.core.presentation.CoreRString import dev.arkbuilders.rate.core.presentation.theme.ArkColor import dev.arkbuilders.rate.core.presentation.ui.AppHorDiv16 @@ -62,6 +73,7 @@ import dev.arkbuilders.rate.core.presentation.ui.group.EditGroupReorderBottomShe import dev.arkbuilders.rate.feature.portfolio.di.PortfolioComponentHolder import dev.arkbuilders.rate.feature.portfolio.domain.model.Asset import dev.arkbuilders.rate.feature.portfolio.presentation.model.AddAssetsNavResult +import dev.arkbuilders.rate.feature.search.presentation.SearchNavResult import kotlinx.coroutines.launch import org.orbitmvi.orbit.compose.collectAsState import java.math.BigDecimal @@ -70,7 +82,8 @@ import java.math.BigDecimal @Composable fun PortfolioScreen( navigator: DestinationsNavigator, - resultRecipient: ResultRecipient, + addResultRecipient: ResultRecipient, + searchResultRecipient: ResultRecipient, ) { val ctx = LocalContext.current val component = @@ -81,9 +94,12 @@ fun PortfolioScreen( val viewModel: PortfolioViewModel = viewModel(factory = component.assetsVMFactory()) - resultRecipient.onResult { + addResultRecipient.onResult { viewModel.onReturnFromAddScreen(it) } + searchResultRecipient.onResult { + viewModel.onChangeBaseCurrency(it.code) + } BackHandler { viewModel.onBackClick() @@ -145,6 +161,16 @@ fun PortfolioScreen( navigator .navigate(EditAssetScreenDestination(display.asset.id)) }, + onChangeBaseCurrency = { + navigator.navigate( + SearchCurrencyScreenDestination( + title = + ctx.getString( + CoreRString.change_base_currency, + ), + ), + ) + }, onFilterChange = viewModel::onFilterChange, onDelete = viewModel::onAssetRemove, ) @@ -205,6 +231,7 @@ private fun Content( pagerState: PagerState, onEditGroups: () -> Unit, onClick: (PortfolioDisplayAsset) -> Unit, + onChangeBaseCurrency: () -> Unit, onFilterChange: (String) -> Unit, onDelete: (Asset) -> Unit, ) { @@ -227,6 +254,7 @@ private fun Content( baseCode = state.baseCode, amounts = state.pages.first().assets, onClick = onClick, + onChangeBaseCurrency = onChangeBaseCurrency, onDelete = onDelete, ) } else { @@ -240,6 +268,7 @@ private fun Content( baseCode = state.baseCode, amounts = state.pages[index].assets, onClick = onClick, + onChangeBaseCurrency = onChangeBaseCurrency, onDelete = onDelete, ) } @@ -253,6 +282,7 @@ private fun GroupPage( baseCode: CurrencyCode, amounts: List, onClick: (PortfolioDisplayAsset) -> Unit = {}, + onChangeBaseCurrency: () -> Unit, onDelete: (Asset) -> Unit, ) { val total = @@ -268,8 +298,40 @@ private fun GroupPage( ) { if (filter.isEmpty()) { item { + Spacer(Modifier.height(8.dp)) + Box(Modifier.fillMaxWidth()) { + Row( + modifier = + Modifier + .align(Alignment.CenterEnd) + .padding(end = 14.dp) + .clip(RoundedCornerShape(8.dp)) + .clickable { onChangeBaseCurrency() } + .padding(4.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + modifier = Modifier, + text = baseCode, + fontSize = 12.6.sp, + fontWeight = FontWeight.W500, + color = ArkColor.TextTertiary, + ) + Icon( + modifier = + Modifier + .padding(start = 8.dp) + .width(10.5.dp) + .height(6.dp), + painter = painterResource(CoreRDrawable.ic_chevron), + contentDescription = null, + tint = ArkColor.TextTertiary, + ) + } + } + Spacer(Modifier.height(8.dp)) Text( - modifier = Modifier.padding(top = 32.dp), + modifier = Modifier, text = stringResource(CoreRString.portfolio_total_assets), color = ArkColor.TextTertiary, fontWeight = FontWeight.Medium, diff --git a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/main/PortfolioViewModel.kt b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/main/PortfolioViewModel.kt index 6d609567c..34964f321 100644 --- a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/main/PortfolioViewModel.kt +++ b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/main/PortfolioViewModel.kt @@ -84,10 +84,6 @@ class PortfolioViewModel( intent { initPages() - prefs.flow(PreferenceKey.BaseCurrencyCode).drop(1).onEach { - initPages() - }.launchIn(viewModelScope) - assetsRepo.allAssetsFlow().drop(1).onEach { initPages() }.launchIn(viewModelScope) @@ -106,6 +102,12 @@ class PortfolioViewModel( } } + fun onChangeBaseCurrency(baseCode: CurrencyCode) = + intent { + prefs.set(PreferenceKey.BaseCurrencyCode, baseCode) + initPages() + } + fun onAssetRemove(asset: Asset) = intent { val deleted = assetsRepo.removeAsset(asset.id) diff --git a/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyScreen.kt b/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyScreen.kt index 594c05dd8..d353c3180 100644 --- a/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyScreen.kt +++ b/feature/search/src/main/java/dev/arkbuilders/rate/feature/search/presentation/SearchCurrencyScreen.kt @@ -36,6 +36,7 @@ import org.orbitmvi.orbit.compose.collectSideEffect @Destination @Composable fun SearchCurrencyScreen( + title: String? = null, navKey: String? = null, navPos: Int? = null, prohibitedCodes: Array? = null, @@ -72,7 +73,7 @@ fun SearchCurrencyScreen( Scaffold( topBar = { AppTopBarBack( - title = stringResource(CoreRString.search_currency), + title = title ?: stringResource(CoreRString.search_currency), onBackClick = { resultNavigator.navigateBack() }, ) }, From 8381688a874373bf0d78194a1094e1c7233e6b35 Mon Sep 17 00:00:00 2001 From: mdrlzy Date: Tue, 27 May 2025 03:51:58 +0600 Subject: [PATCH 2/2] Remove change base code btn from edit asset screen --- .../presentation/edit/EditAssetScreen.kt | 44 ------------------- .../presentation/edit/EditAssetViewModel.kt | 7 --- 2 files changed, 51 deletions(-) diff --git a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetScreen.kt b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetScreen.kt index 9c65cd123..c4eb62dfe 100644 --- a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetScreen.kt +++ b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetScreen.kt @@ -4,18 +4,13 @@ package dev.arkbuilders.rate.feature.portfolio.presentation.edit import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold import androidx.compose.material3.Text -import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -29,7 +24,6 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.focus.onFocusChanged import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalSoftwareKeyboardController -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -37,13 +31,9 @@ import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.ExternalModuleGraph -import com.ramcosta.composedestinations.generated.search.destinations.SearchCurrencyScreenDestination import com.ramcosta.composedestinations.navigation.DestinationsNavigator -import com.ramcosta.composedestinations.result.NavResult -import com.ramcosta.composedestinations.result.ResultRecipient import dev.arkbuilders.rate.core.domain.CurrUtils import dev.arkbuilders.rate.core.domain.model.CurrencyName -import dev.arkbuilders.rate.core.presentation.CoreRDrawable import dev.arkbuilders.rate.core.presentation.CoreRString import dev.arkbuilders.rate.core.presentation.theme.ArkColor import dev.arkbuilders.rate.core.presentation.ui.AppHorDiv @@ -52,7 +42,6 @@ import dev.arkbuilders.rate.core.presentation.ui.ArkCursorLargeTextField import dev.arkbuilders.rate.core.presentation.ui.InfoDialog import dev.arkbuilders.rate.core.presentation.ui.LoadingScreen import dev.arkbuilders.rate.feature.portfolio.di.PortfolioComponentHolder -import dev.arkbuilders.rate.feature.search.presentation.SearchNavResult import org.orbitmvi.orbit.compose.collectAsState @Destination @@ -60,7 +49,6 @@ import org.orbitmvi.orbit.compose.collectAsState fun EditAssetScreen( assetId: Long, navigator: DestinationsNavigator, - resultRecipient: ResultRecipient, ) { val ctx = LocalContext.current val component = @@ -73,15 +61,6 @@ fun EditAssetScreen( factory = component.editAssetVMFactory().create(assetId), ) - resultRecipient.onNavResult { result -> - when (result) { - NavResult.Canceled -> {} - is NavResult.Value -> { - viewModel.onNavResult(result.value) - } - } - } - val state by viewModel.collectAsState() Scaffold( @@ -189,28 +168,5 @@ private fun Content( color = ArkColor.TextPrimary, ) } - TextButton( - modifier = - Modifier - .padding(top = 16.dp) - .height(22.dp), - colors = ButtonDefaults.textButtonColors(contentColor = ArkColor.BrandUtility), - onClick = { - navigator.navigate( - SearchCurrencyScreenDestination(), - ) - }, - contentPadding = PaddingValues(2.dp), - ) { - Icon( - painter = painterResource(id = CoreRDrawable.ic_edit), - contentDescription = null, - ) - Text( - modifier = Modifier.padding(start = 6.dp), - text = stringResource(CoreRString.change_base_currency), - fontWeight = FontWeight.SemiBold, - ) - } } } diff --git a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetViewModel.kt b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetViewModel.kt index 2da84a194..8a3cd37a7 100644 --- a/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetViewModel.kt +++ b/feature/portfolio/src/main/java/dev/arkbuilders/rate/feature/portfolio/presentation/edit/EditAssetViewModel.kt @@ -10,12 +10,10 @@ import dev.arkbuilders.rate.core.domain.CurrUtils import dev.arkbuilders.rate.core.domain.model.CurrencyName import dev.arkbuilders.rate.core.domain.repo.AnalyticsManager import dev.arkbuilders.rate.core.domain.repo.CurrencyRepo -import dev.arkbuilders.rate.core.domain.repo.PreferenceKey import dev.arkbuilders.rate.core.domain.repo.Prefs import dev.arkbuilders.rate.core.domain.toBigDecimalArk import dev.arkbuilders.rate.feature.portfolio.domain.model.Asset import dev.arkbuilders.rate.feature.portfolio.domain.repo.PortfolioRepo -import dev.arkbuilders.rate.feature.search.presentation.SearchNavResult import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.launchIn @@ -64,11 +62,6 @@ class EditAssetViewModel( } } - fun onNavResult(result: SearchNavResult) = - intent { - prefs.set(PreferenceKey.BaseCurrencyCode, result.code) - } - fun onValueChange(input: String) = blockingIntent { val validated = CurrUtils.validateInput(state.value, input)