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 f69e50bf9c..fcb9d013c1 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 @@ -65,6 +65,10 @@ sealed class TransactionExtrasAction : SendScreenActionUi { sealed class XrpDestinationTag : TransactionExtrasAction() { data class HandleUserInput(val data: String) : XrpDestinationTag() } + + sealed class TonMemo : TransactionExtrasAction() { + data class HandleUserInput(val data: String) : TonMemo() + } } sealed class AddressPayIdVerifyAction : SendScreenAction { diff --git a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt index b87cc3c49b..0a528bd856 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/middlewares/SendMiddleware.kt @@ -4,6 +4,7 @@ import com.google.firebase.crashlytics.FirebaseCrashlytics import com.tangem.blockchain.blockchains.binance.BinanceTransactionExtras import com.tangem.blockchain.blockchains.polkadot.ExistentialDepositProvider import com.tangem.blockchain.blockchains.stellar.StellarTransactionExtras +import com.tangem.blockchain.blockchains.ton.TonTransactionExtras import com.tangem.blockchain.blockchains.xrp.XrpTransactionBuilder import com.tangem.blockchain.common.Amount import com.tangem.blockchain.common.BlockchainSdkError @@ -170,6 +171,7 @@ private fun sendTransaction( transactionExtras.xrpDestinationTag?.tag?.let { txData = txData.copy(extras = XrpTransactionBuilder.XrpTransactionExtras(it)) } + transactionExtras.tonMemoState?.memo?.let { txData = txData.copy(extras = TonTransactionExtras(it)) } scope.launch { val updateWalletResult = walletManager.safeUpdate() 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 b59ed31979..6bca1e9649 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 @@ -6,11 +6,13 @@ import com.tangem.tap.features.send.redux.SendScreenAction import com.tangem.tap.features.send.redux.TransactionExtrasAction.BinanceMemo import com.tangem.tap.features.send.redux.TransactionExtrasAction.Prepare import com.tangem.tap.features.send.redux.TransactionExtrasAction.Release +import com.tangem.tap.features.send.redux.TransactionExtrasAction.TonMemo import com.tangem.tap.features.send.redux.TransactionExtrasAction.XlmMemo import com.tangem.tap.features.send.redux.TransactionExtrasAction.XrpDestinationTag import com.tangem.tap.features.send.redux.states.BinanceMemoState import com.tangem.tap.features.send.redux.states.InputViewValue import com.tangem.tap.features.send.redux.states.SendState +import com.tangem.tap.features.send.redux.states.TonMemoState import com.tangem.tap.features.send.redux.states.TransactionExtraError import com.tangem.tap.features.send.redux.states.TransactionExtrasState import com.tangem.tap.features.send.redux.states.XlmMemoState @@ -28,6 +30,7 @@ class TransactionExtrasReducer : SendInternalReducer { is XlmMemo -> handleXlmMemo(action, sendState, sendState.transactionExtrasState) is BinanceMemo -> handleBinanceMemo(action, sendState, sendState.transactionExtrasState) is XrpDestinationTag -> handleXrpTag(action, sendState, sendState.transactionExtrasState) + is TonMemo -> handleTonMemo(action, sendState, sendState.transactionExtrasState) else -> sendState } } @@ -56,6 +59,7 @@ class TransactionExtrasReducer : SendInternalReducer { } Blockchain.Stellar -> TransactionExtrasState(xlmMemo = XlmMemoState()) Blockchain.Binance -> TransactionExtrasState(binanceMemo = BinanceMemoState()) + Blockchain.TON, Blockchain.TONTestnet -> TransactionExtrasState(tonMemoState = TonMemoState()) else -> emptyResult } return updateLastState(sendState.copy(transactionExtrasState = result), result) @@ -144,4 +148,19 @@ class TransactionExtrasReducer : SendInternalReducer { } return updateLastState(sendState.copy(transactionExtrasState = result), result) } + + private fun handleTonMemo( + action: TonMemo, + sendState: SendState, + infoState: TransactionExtrasState, + ): SendState { + val result = when (action) { + is TonMemo.HandleUserInput -> { + val memo = action.data + val input = InputViewValue(memo, true) + infoState.copy(tonMemoState = TonMemoState(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/AddressPayIdState.kt b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt index 6d0b9bee8a..ad707474af 100644 --- a/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt +++ b/app/src/main/java/com/tangem/tap/features/send/redux/states/AddressPayIdState.kt @@ -30,6 +30,7 @@ data class TransactionExtrasState( val xlmMemo: XlmMemoState? = null, val binanceMemo: BinanceMemoState? = null, val xrpDestinationTag: XrpDestinationTagState? = null, + val tonMemoState: TonMemoState? = null, ) : IdStateHolder { override val stateId: StateId = StateId.TRANSACTION_EXTRAS } @@ -98,6 +99,12 @@ data class XrpDestinationTagState( } } +data class TonMemoState( + 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 ecc6d5d00e..519556af28 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 @@ -60,7 +60,6 @@ import com.tangem.tap.mainScope import com.tangem.tap.store import com.tangem.wallet.R import com.tangem.wallet.databinding.FragmentSendBinding -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow @@ -173,6 +172,15 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { } .onEach { store.dispatch(TransactionExtrasAction.BinanceMemo.HandleUserInput(it)) } .launchIn(mainScope) + + etTonMemo.inputtedTextAsFlow() + .debounce(400) + .filter { + val info = store.state.sendState.transactionExtrasState + info.tonMemoState?.viewFieldValue?.value != it + } + .onEach { store.dispatch(TransactionExtrasAction.TonMemo.HandleUserInput(it)) } + .launchIn(mainScope) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -331,7 +339,6 @@ class SendFragment : BaseStoreFragment(R.layout.fragment_send) { } } -@ExperimentalCoroutinesApi fun EditText.inputtedTextAsFlow(): Flow = callbackFlow { val watcher = addTextChangedListener { editable -> trySend(editable?.toString() ?: "") } awaitClose { removeTextChangedListener(watcher) } 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 055f885169..635017f96b 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 @@ -46,8 +46,8 @@ import com.tangem.wallet.R /** [REDACTED_AUTHOR] */ -class SendStateSubscriber(fragment: BaseStoreFragment) : - FragmentStateSubscriber(fragment) { +@Suppress("LargeClass") +class SendStateSubscriber(fragment: BaseStoreFragment) : FragmentStateSubscriber(fragment) { private var dialog: Dialog? = null @@ -79,6 +79,7 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : showView(xlmMemoContainer, infoState.xlmMemo) showView(xrpDestinationTagContainer, infoState.xrpDestinationTag) showView(binanceMemoContainer, infoState.binanceMemo) + showView(tonMemoContainer, infoState.tonMemoState) infoState.xlmMemo?.let { if (!it.viewFieldValue.isFromUserInput) etXlmMemo.setText(it.viewFieldValue.value) @@ -115,6 +116,16 @@ class SendStateSubscriber(fragment: BaseStoreFragment) : etBinanceMemo.setText(it.viewFieldValue.value) } } + infoState.tonMemoState?.let { + if (infoState.tonMemoState.error != null) { + tilTonMemo.error = fg.getText(R.string.send_extras_error_invalid_memo) + } else { + tilBinanceMemo.error = null + } + if (!it.viewFieldValue.isFromUserInput) { + etTonMemo.setText(it.viewFieldValue.value) + } + } } private fun handleSendScreen(fg: SendFragment, state: SendState) = with(fg.binding) { diff --git a/app/src/main/res/layout/layout_send_address_payid.xml b/app/src/main/res/layout/layout_send_address_payid.xml index b16e59b974..f16f48a119 100644 --- a/app/src/main/res/layout/layout_send_address_payid.xml +++ b/app/src/main/res/layout/layout_send_address_payid.xml @@ -228,6 +228,37 @@ + + + + + + + + + + - \ No newline at end of file + diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index 9170119d22..d433207213 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -68,7 +68,7 @@ kotlinSerialization = "1.4.1" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "develop-187" +tangemBlockchainSdk = "develop-189" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "develop-206" # tangemCardSdk = "0.0.1" # Keep it! - used for local builds