From 3a4ce4d24b572fef16aecb093f6d23665d521472 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 14 Feb 2024 15:03:07 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../features/send/redux/SendScreenAction.kt | 10 ++++++ .../reducers/TransactionExtrasReducer.kt | 17 ++++++++++ .../send/redux/states/AddressState.kt | 13 ++++++-- .../tap/features/send/ui/SendFragment.kt | 9 ++++++ .../stateSubscribers/SendStateSubscriber.kt | 14 +++++++- .../main/res/layout/layout_send_address.xml | 32 +++++++++++++++++++ .../CreateUserNetworkAccountResponse.kt | 2 +- .../core/ui/extensions/BlockchainIcons.kt | 6 ++-- .../DefaultTransactionRepository.kt | 2 ++ .../SendRecipientMemoFieldConverter.kt | 1 + 10 files changed, 99 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt b/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt index 08f0c090d5..00e279678b 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/SendScreenAction.kt @@ -59,26 +59,36 @@ sealed class TransactionExtrasAction : SendScreenActionUi { object Release : TransactionExtrasAction() + @Deprecated("Only in legacy send screen") sealed class XlmMemo : TransactionExtrasAction() { // data class ChangeSelectedMemo(val memoType: XlmMemoType) : XlmMemo() data class HandleUserInput(val data: String) : XlmMemo() } + @Deprecated("Only in legacy send screen") sealed class BinanceMemo : TransactionExtrasAction() { data class HandleUserInput(val data: String) : BinanceMemo() } + @Deprecated("Only in legacy send screen") sealed class XrpDestinationTag : TransactionExtrasAction() { data class HandleUserInput(val data: String) : XrpDestinationTag() } + @Deprecated("Only in legacy send screen") sealed class TonMemo : TransactionExtrasAction() { data class HandleUserInput(val data: String) : TonMemo() } + @Deprecated("Only in legacy send screen") sealed class CosmosMemo : TransactionExtrasAction() { data class HandleUserInput(val data: String) : CosmosMemo() } + + @Deprecated("Only in legacy send screen") + sealed class HederaMemo : TransactionExtrasAction() { + data class HandleUserInput(val data: String) : HederaMemo() + } } sealed class AddressVerifyAction : SendScreenAction { diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt index cb0fbaa3aa..058a8ded6e 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/reducers/TransactionExtrasReducer.kt @@ -19,6 +19,7 @@ class TransactionExtrasReducer : SendInternalReducer { is XrpDestinationTag -> handleXrpTag(action, sendState, sendState.transactionExtrasState) is TonMemo -> handleTonMemo(action, sendState, sendState.transactionExtrasState) is CosmosMemo -> handleCosmosMemo(action, sendState, sendState.transactionExtrasState) + is HederaMemo -> handleHederaMemo(action, sendState, sendState.transactionExtrasState) else -> sendState } } @@ -52,6 +53,7 @@ class TransactionExtrasReducer : SendInternalReducer { Blockchain.TerraV1, Blockchain.TerraV2, -> TransactionExtrasState(cosmosMemoState = CosmosMemoState()) + Blockchain.Hedera, Blockchain.HederaTestnet -> TransactionExtrasState(hederaMemoState = HederaMemoState()) else -> emptyResult } return updateLastState(sendState.copy(transactionExtrasState = result), result) @@ -162,4 +164,19 @@ class TransactionExtrasReducer : SendInternalReducer { } return updateLastState(sendState.copy(transactionExtrasState = result), result) } + + private fun handleHederaMemo( + action: HederaMemo, + sendState: SendState, + infoState: TransactionExtrasState, + ): SendState { + val result = when (action) { + is HederaMemo.HandleUserInput -> { + val memo = action.data + val input = InputViewValue(memo, true) + infoState.copy(hederaMemoState = HederaMemoState(input, memo)) + } + } + return updateLastState(sendState.copy(transactionExtrasState = result), result) + } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressState.kt b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressState.kt index b6b65a595f..bda2324f45 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressState.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressState.kt @@ -23,18 +23,20 @@ data class AddressState( fun isReady(): Boolean = error == null && destinationWalletAddress?.isNotEmpty() ?: false } +@Deprecated("Legacy") data class TransactionExtrasState( val xlmMemo: XlmMemoState? = null, val binanceMemo: BinanceMemoState? = null, val xrpDestinationTag: XrpDestinationTagState? = null, val tonMemoState: TonMemoState? = null, val cosmosMemoState: CosmosMemoState? = null, + val hederaMemoState: HederaMemoState? = null, ) : IdStateHolder { override val stateId: StateId = StateId.TRANSACTION_EXTRAS fun isNull(): Boolean { return xlmMemo == null && binanceMemo == null && xrpDestinationTag == null && tonMemoState == null && - cosmosMemoState == null + cosmosMemoState == null && hederaMemoState == null } fun isEmpty(): Boolean { @@ -43,8 +45,9 @@ data class TransactionExtrasState( val isXrpEmpty = xrpDestinationTag?.viewFieldValue?.value?.isEmpty() ?: false val isTonEmpty = tonMemoState?.viewFieldValue?.value?.isEmpty() ?: false val isCosmosEmpty = cosmosMemoState?.viewFieldValue?.value?.isEmpty() ?: false + val isHederaEmpty = hederaMemoState?.viewFieldValue?.value?.isEmpty() ?: false - return isXlmEmpty || isBinanceEmpty || isXrpEmpty || isTonEmpty || isCosmosEmpty + return isXlmEmpty || isBinanceEmpty || isXrpEmpty || isTonEmpty || isCosmosEmpty || isHederaEmpty } } @@ -120,6 +123,12 @@ data class CosmosMemoState( val error: TransactionExtraError? = null, ) +data class HederaMemoState( + val viewFieldValue: InputViewValue = InputViewValue(""), + val memo: String? = null, + val error: TransactionExtraError? = null, +) + enum class TransactionExtraError { INVALID_DESTINATION_TAG, INVALID_XLM_MEMO, diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt b/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt index 3e8b23a5d3..4bf8730db7 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/SendFragment.kt @@ -234,6 +234,15 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { } .onEach { store.dispatch(TransactionExtrasAction.CosmosMemo.HandleUserInput(it)) } .launchIn(mainScope) + + etHederaMemo.inputtedTextAsFlow() + .debounce(EDIT_TEXT_INPUT_DEBOUNCE) + .filter { + val info = store.state.sendState.transactionExtrasState + info.hederaMemoState?.viewFieldValue?.value != it + } + .onEach { store.dispatch(TransactionExtrasAction.HederaMemo.HandleUserInput(it)) } + .launchIn(mainScope) } private fun onCodeScanned(scannedCode: String) { diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt index 927468b7ea..a2342fb5bf 100644 --- a/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt +++ b/app/src/main/java/com/tangem/tap/features/send/ui/stateSubscribers/SendStateSubscriber.kt @@ -62,7 +62,8 @@ internal class SendStateSubscriber( } } - @Suppress("ComplexMethod") + @Deprecated("Legacy") + @Suppress("ComplexMethod", "LongMethod") private fun handleTransactionExtrasState(fg: SendFragment, infoState: TransactionExtrasState) = with(fg.binding.lSendAddress) { fun showView(view: View, info: Any?) { @@ -73,6 +74,7 @@ internal class SendStateSubscriber( showView(binanceMemoContainer, infoState.binanceMemo) showView(tonMemoContainer, infoState.tonMemoState) showView(cosmosMemoContainer, infoState.cosmosMemoState) + showView(hederaMemoContainer, infoState.hederaMemoState) infoState.xlmMemo?.let { if (!it.viewFieldValue.isFromUserInput) etXlmMemo.setText(it.viewFieldValue.value) @@ -129,6 +131,16 @@ internal class SendStateSubscriber( etCosmosMemo.setText(it.viewFieldValue.value) } } + infoState.hederaMemoState?.let { + if (infoState.hederaMemoState.error != null) { + tilHederaMemo.error = fg.getText(R.string.send_extras_error_invalid_memo) + } else { + tilHederaMemo.error = null + } + if (!it.viewFieldValue.isFromUserInput) { + etHederaMemo.setText(it.viewFieldValue.value) + } + } } @Suppress("ComplexMethod") diff --git a/app/src/main/res/layout/layout_send_address.xml b/app/src/main/res/layout/layout_send_address.xml index 8367bf3524..dd4b1d9cc2 100644 --- a/app/src/main/res/layout/layout_send_address.xml +++ b/app/src/main/res/layout/layout_send_address.xml @@ -260,6 +260,38 @@ + + + + + + + + + + diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/CreateUserNetworkAccountResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/CreateUserNetworkAccountResponse.kt index 742694245b..2dcb8bfb8f 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/CreateUserNetworkAccountResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/tangemTech/models/CreateUserNetworkAccountResponse.kt @@ -5,7 +5,7 @@ import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) data class CreateUserNetworkAccountResponse( - @Json(name = "status") val status: String, + @Json(name = "status") val status: Boolean, @Json(name = "data") val data: AccountCreated, ) { diff --git a/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt b/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt index 937b93c1d5..e38813089f 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt @@ -104,7 +104,7 @@ fun getActiveIconResByNetworkId(networkId: String): Int { "aptos", "aptos/test" -> R.drawable.img_aptos_22 "shibarium", "shibarium/test" -> R.drawable.img_shibarium_22 "algorand", "algorand/test" -> R.drawable.img_algorand_22 - "hedera", "hedera/test" -> R.drawable.img_hedera_22 + "hedera-hashgraph", "hedera/test" -> R.drawable.img_hedera_22 else -> R.drawable.ic_alert_24 } } @@ -154,7 +154,7 @@ fun getActiveIconResByCoinId(coinId: String): Int { "aptos" -> R.drawable.img_aptos_22 "shibarium" -> R.drawable.img_shibarium_22 "algorand" -> R.drawable.img_algorand_22 - "hedera" -> R.drawable.img_hedera_22 + "hedera-hashgraph" -> R.drawable.img_hedera_22 else -> R.drawable.ic_alert_24 } } @@ -260,7 +260,7 @@ fun getGreyedOutIconResByNetworkId(networkId: String): Int { "aptos", "aptos/test" -> R.drawable.ic_aptos_22 "shibarium", "shibarium/test" -> R.drawable.ic_shibarium_22 "algorand", "algorand/test" -> R.drawable.ic_algorand_22 - "hedera", "hedera/test" -> R.drawable.ic_hedera_22 + "hedera-hashgraph", "hedera/test" -> R.drawable.ic_hedera_22 else -> R.drawable.ic_alert_24 } } \ No newline at end of file diff --git a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt index 7c515253c2..25704e1bf1 100644 --- a/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt +++ b/data/transaction/src/main/java/com/tangem/data/transaction/DefaultTransactionRepository.kt @@ -3,6 +3,7 @@ package com.tangem.data.transaction import androidx.core.text.isDigitsOnly import com.tangem.blockchain.blockchains.binance.BinanceTransactionExtras import com.tangem.blockchain.blockchains.cosmos.CosmosTransactionExtras +import com.tangem.blockchain.blockchains.hedera.HederaTransactionBuilder import com.tangem.blockchain.blockchains.stellar.StellarMemo import com.tangem.blockchain.blockchains.stellar.StellarTransactionExtras import com.tangem.blockchain.blockchains.ton.TonTransactionExtras @@ -71,6 +72,7 @@ internal class DefaultTransactionRepository( Blockchain.XRP -> memo.toLongOrNull()?.let { XrpTransactionBuilder.XrpTransactionExtras(it) } Blockchain.Cosmos -> CosmosTransactionExtras(memo) Blockchain.TON -> TonTransactionExtras(memo) + Blockchain.Hedera -> HederaTransactionBuilder.HederaTransactionExtras(memo) else -> null } } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/recipient/SendRecipientMemoFieldConverter.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/recipient/SendRecipientMemoFieldConverter.kt index 91321769f0..f3a0cefdd9 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/recipient/SendRecipientMemoFieldConverter.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/state/recipient/SendRecipientMemoFieldConverter.kt @@ -28,6 +28,7 @@ internal class SendRecipientMemoFieldConverter( Blockchain.TerraV1.id, Blockchain.TerraV2.id, Blockchain.Stellar.id, + Blockchain.Hedera.id, -> convert(R.string.send_extras_hint_memo) else -> null }