diff --git a/api/src/main/java/com/getcode/network/BalanceController.kt b/api/src/main/java/com/getcode/network/BalanceController.kt index 5958e3f36..3edc36d94 100644 --- a/api/src/main/java/com/getcode/network/BalanceController.kt +++ b/api/src/main/java/com/getcode/network/BalanceController.kt @@ -1,12 +1,9 @@ package com.getcode.network import android.content.Context -import android.icu.text.NumberFormat -import android.icu.text.NumberFormat.INTEGERSTYLE import com.getcode.manager.SessionManager import com.getcode.model.Currency import com.getcode.model.CurrencyCode -import com.getcode.model.KinAmount import com.getcode.model.PrefsString import com.getcode.model.Rate import com.getcode.network.client.TransactionReceiver @@ -26,12 +23,10 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOn @@ -42,10 +37,8 @@ import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch import timber.log.Timber -import java.util.Locale import java.util.concurrent.TimeUnit import javax.inject.Inject -import kotlin.math.roundToInt data class BalanceDisplay( val marketValue: Double = 0.0, @@ -53,6 +46,7 @@ data class BalanceDisplay( val currency: Currency? = null, ) + open class BalanceController @Inject constructor( exchange: Exchange, networkObserver: NetworkConnectivityListener, diff --git a/api/src/main/java/com/getcode/network/source/ChatMessagePagingSource.kt b/api/src/main/java/com/getcode/network/source/ChatMessagePagingSource.kt index 546be613a..018d6c624 100644 --- a/api/src/main/java/com/getcode/network/source/ChatMessagePagingSource.kt +++ b/api/src/main/java/com/getcode/network/source/ChatMessagePagingSource.kt @@ -6,7 +6,6 @@ import com.getcode.ed25519.Ed25519.KeyPair import com.getcode.model.Chat import com.getcode.model.ChatMessage import com.getcode.model.Cursor -import com.getcode.model.ID import com.getcode.network.client.Client import com.getcode.network.client.fetchMessagesFor diff --git a/app/src/main/java/com/getcode/navigation/screens/ChatScreens.kt b/app/src/main/java/com/getcode/navigation/screens/ChatScreens.kt index 45e8b96f2..b3ca83afb 100644 --- a/app/src/main/java/com/getcode/navigation/screens/ChatScreens.kt +++ b/app/src/main/java/com/getcode/navigation/screens/ChatScreens.kt @@ -133,11 +133,12 @@ data object BalanceModal : ChatGraph, ModalRoot { LifecycleEffect( onDisposed = { - viewModel.dispatchEvent( - BalanceSheetViewModel.Event.OnDebugBucketsVisible( - false + val disposedScreen = navigator.lastItem + if (disposedScreen !is BalanceModal) { + viewModel.dispatchEvent( + BalanceSheetViewModel.Event.OnDebugBucketsVisible(false) ) - ) + } } ) } diff --git a/app/src/main/java/com/getcode/ui/components/chat/ChatInput.kt b/app/src/main/java/com/getcode/ui/components/chat/ChatInput.kt index c37817867..cdc9aef0f 100644 --- a/app/src/main/java/com/getcode/ui/components/chat/ChatInput.kt +++ b/app/src/main/java/com/getcode/ui/components/chat/ChatInput.kt @@ -38,6 +38,7 @@ import com.getcode.theme.CodeTheme import com.getcode.theme.extraLarge import com.getcode.theme.inputColors import com.getcode.ui.components.TextInput +import com.getcode.ui.utils.rememberedClickable import com.getcode.ui.utils.withTopBorder @OptIn(ExperimentalFoundationApi::class) @@ -64,7 +65,7 @@ fun ChatInput( .align(Alignment.Bottom) .border(width = 1.dp, color = Color.White, shape = CircleShape) .clip(CircleShape) - .clickable { onSendCash() } + .rememberedClickable { onSendCash() } .size(ChatInput_Size) .padding(8.dp), contentAlignment = Alignment.Center, @@ -110,7 +111,7 @@ fun ChatInput( .align(Alignment.Bottom) .background(ChatOutgoing, shape = CircleShape) .clip(CircleShape) - .clickable { onSendMessage() } + .rememberedClickable { onSendMessage() } .size(ChatInput_Size) .padding(8.dp), contentAlignment = Alignment.Center, diff --git a/app/src/main/java/com/getcode/ui/components/chat/ChatNode.kt b/app/src/main/java/com/getcode/ui/components/chat/ChatNode.kt index 348c7854e..eb86cc479 100644 --- a/app/src/main/java/com/getcode/ui/components/chat/ChatNode.kt +++ b/app/src/main/java/com/getcode/ui/components/chat/ChatNode.kt @@ -27,6 +27,7 @@ import com.getcode.theme.CodeTheme import com.getcode.ui.components.Badge import com.getcode.ui.components.chat.utils.localizedText import com.getcode.ui.utils.debugBounds +import com.getcode.ui.utils.rememberedClickable import com.getcode.util.DateUtils import com.getcode.util.formatTimeRelatively import com.getcode.util.toInstantFromMillis @@ -44,7 +45,7 @@ fun ChatNode( ) { Column( modifier = modifier - .clickable { onClick() } + .rememberedClickable { onClick() } .padding( vertical = CodeTheme.dimens.grid.x3, horizontal = CodeTheme.dimens.inset diff --git a/app/src/main/java/com/getcode/view/main/account/BucketDebugger.kt b/app/src/main/java/com/getcode/view/main/account/BucketDebugger.kt index d25b3d56c..15b80e74c 100644 --- a/app/src/main/java/com/getcode/view/main/account/BucketDebugger.kt +++ b/app/src/main/java/com/getcode/view/main/account/BucketDebugger.kt @@ -19,6 +19,7 @@ import com.getcode.solana.organizer.AccountType import com.getcode.theme.BrandLight import com.getcode.theme.CodeTheme import com.getcode.ui.components.MiddleEllipsisText +import com.getcode.ui.utils.rememberedClickable @Composable @@ -41,7 +42,7 @@ fun BucketDebugger() { items(buckets) { info -> Column( modifier = Modifier - .clickable { + .rememberedClickable { clipboard.setText(AnnotatedString(info.address.base58())) } .padding(horizontal = CodeTheme.dimens.grid.x3) diff --git a/app/src/main/java/com/getcode/view/main/balance/BalanceSheet.kt b/app/src/main/java/com/getcode/view/main/balance/BalanceSheet.kt index 9b74b405f..9ea774e08 100644 --- a/app/src/main/java/com/getcode/view/main/balance/BalanceSheet.kt +++ b/app/src/main/java/com/getcode/view/main/balance/BalanceSheet.kt @@ -22,6 +22,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier @@ -226,8 +227,9 @@ fun BalanceTop( isClickable: Boolean, onClick: () -> Unit = {} ) { + val text = rememberSaveable(state.amountText) { state.amountText } AmountArea( - amountText = state.amountText, + amountText = text, isAltCaption = false, isAltCaptionKinIcon = false, isLoading = state.chatsLoading, diff --git a/app/src/main/java/com/getcode/view/main/balance/BalanceSheetViewModel.kt b/app/src/main/java/com/getcode/view/main/balance/BalanceSheetViewModel.kt index 12989735e..10d74ab80 100644 --- a/app/src/main/java/com/getcode/view/main/balance/BalanceSheetViewModel.kt +++ b/app/src/main/java/com/getcode/view/main/balance/BalanceSheetViewModel.kt @@ -20,12 +20,14 @@ import com.getcode.view.main.getKin.GetKinSheetViewModel import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.cache import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.shareIn +import kotlinx.coroutines.flow.stateIn import timber.log.Timber import javax.inject.Inject @@ -60,9 +62,7 @@ class BalanceSheetViewModel @Inject constructor( data class OnDebugBucketsVisible(val show: Boolean) : Event data class OnBuyModuleStateChanged(val module: Feature) : Event data class OnCurrencySelectionStateChanged(val module: Feature): Event - data class OnLatestRateChanged( - val rate: Rate, - ) : Event + data class OnLatestRateChanged(val rate: Rate) : Event data class OnBalanceChanged( val flagResId: Int?, @@ -92,6 +92,7 @@ class BalanceSheetViewModel @Inject constructor( balanceController.formattedBalance .filterNotNull() + .distinctUntilChanged() .onEach { dispatchEvent( Dispatchers.Main, @@ -102,7 +103,8 @@ class BalanceSheetViewModel @Inject constructor( isKin = it.currency == Currency.Kin ) ) - }.launchIn(viewModelScope) + } + .launchIn(viewModelScope) historyController.chats .onEach { diff --git a/app/src/main/java/com/getcode/view/main/giveKin/AmountText.kt b/app/src/main/java/com/getcode/view/main/giveKin/AmountText.kt index 1d38bbed9..d020ae658 100644 --- a/app/src/main/java/com/getcode/view/main/giveKin/AmountText.kt +++ b/app/src/main/java/com/getcode/view/main/giveKin/AmountText.kt @@ -13,9 +13,11 @@ import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier @@ -50,8 +52,20 @@ fun AmountText( textStyle: TextStyle = CodeTheme.typography.h1, ) { val centeredText = textStyle.copy(textAlign = TextAlign.Center) - var scaledTextStyle by remember(amountText) { mutableStateOf(centeredText) } - var isReadyToDraw by remember(amountText) { mutableStateOf(false) } + + val cachedSize: TextUnit? by remember(amountText) { + derivedStateOf { AmountSizeStore.lookup(amountText) } + } + + var scaledTextStyle by remember(amountText, cachedSize) { + mutableStateOf( + cachedSize?.let { centeredText.copy(fontSize = it) } ?: centeredText + ) + } + + var isReadyToDraw by remember(amountText) { + mutableStateOf(AmountSizeStore.hasCachedSize(amountText)) + } Row( modifier = Modifier