@@ -6,12 +6,14 @@ import androidx.compose.foundation.layout.fillMaxSize
66import androidx.compose.foundation.layout.systemBarsPadding
77import androidx.compose.material3.Text
88import androidx.compose.runtime.Composable
9+ import androidx.compose.runtime.LaunchedEffect
910import androidx.compose.runtime.remember
1011import androidx.compose.ui.Alignment
1112import androidx.compose.ui.Modifier
1213import androidx.compose.ui.platform.LocalSoftwareKeyboardController
1314import androidx.compose.ui.platform.LocalView
1415import androidx.compose.ui.platform.SoftwareKeyboardController
16+ import androidx.compose.ui.res.stringResource
1517import androidx.navigation.NavController
1618import androidx.navigation.fragment.navArgs
1719import androidx.navigation.navGraphViewModels
@@ -21,6 +23,11 @@ import cash.p.terminal.core.App
2123import cash.p.terminal.core.ISendBitcoinAdapter
2224import cash.p.terminal.core.ISendEthereumAdapter
2325import cash.p.terminal.core.ISendTonAdapter
26+ import cash.p.terminal.core.ISendZcashAdapter
27+ import cash.p.terminal.core.ISendSolanaAdapter
28+ import cash.p.terminal.core.ISendMoneroAdapter
29+ import cash.p.terminal.core.ISendStellarAdapter
30+ import cash.p.terminal.core.ISendTronAdapter
2431import cash.p.terminal.core.authorizedAction
2532import cash.p.terminal.entities.Address
2633import cash.p.terminal.modules.amount.AmountInputModeModule
@@ -68,6 +75,7 @@ import kotlinx.parcelize.Parcelize
6875import cash.p.terminal.core.getKoinInstance
6976import cash.p.terminal.core.managers.PoisonAddressManager
7077import org.koin.java.KoinJavaComponent.inject
78+ import timber.log.Timber
7179import java.math.BigDecimal
7280
7381class SendFragment : BaseComposeFragment () {
@@ -114,11 +122,11 @@ class SendFragment : BaseComposeFragment() {
114122 BlockchainType .Dash -> {
115123 val adapter: ISendBitcoinAdapter ? = App .adapterManager.getAdapterForWallet(wallet)
116124 if (adapter == null ) {
117- HudHelper .showErrorMessage(
118- LocalView .current,
119- " No adapter for wallet $wallet "
125+ MissingWalletAdapterEffect (
126+ navController = navController,
127+ coinUid = wallet.coin.uid,
128+ coinCode = wallet.coin.code,
120129 )
121- navController.navigateUp()
122130 return
123131 }
124132 val factory = SendBitcoinModule .Factory (wallet, address, hideAddress, adapter)
@@ -146,7 +154,16 @@ class SendFragment : BaseComposeFragment() {
146154 }
147155
148156 BlockchainType .Zcash -> {
149- val factory = SendZCashModule .Factory (wallet, address, hideAddress)
157+ val adapter: ISendZcashAdapter ? = App .adapterManager.getAdapterForWallet(wallet)
158+ if (adapter == null ) {
159+ MissingWalletAdapterEffect (
160+ navController = navController,
161+ coinUid = wallet.coin.uid,
162+ coinCode = wallet.coin.code,
163+ )
164+ return
165+ }
166+ val factory = SendZCashModule .Factory (wallet, address, hideAddress, adapter)
150167 val sendZCashViewModel by navGraphViewModels<SendZCashViewModel >(R .id.sendXFragment) {
151168 factory
152169 }
@@ -181,11 +198,11 @@ class SendFragment : BaseComposeFragment() {
181198 BlockchainType .ArbitrumOne -> {
182199 val adapter: ISendEthereumAdapter ? = App .adapterManager.getAdapterForWallet(wallet)
183200 if (adapter == null ) {
184- HudHelper .showErrorMessage(
185- LocalView .current,
186- " No adapter for wallet $wallet "
201+ MissingWalletAdapterEffect (
202+ navController = navController,
203+ coinUid = wallet.coin.uid,
204+ coinCode = wallet.coin.code,
187205 )
188- navController.navigateUp()
189206 return
190207 }
191208 val factory = SendEvmModule .Factory (wallet, address, hideAddress, adapter)
@@ -213,7 +230,16 @@ class SendFragment : BaseComposeFragment() {
213230 }
214231
215232 BlockchainType .Solana -> {
216- val factory = SendSolanaModule .Factory (wallet, address, hideAddress)
233+ val adapter: ISendSolanaAdapter ? = App .adapterManager.getAdapterForWallet(wallet)
234+ if (adapter == null ) {
235+ MissingWalletAdapterEffect (
236+ navController = navController,
237+ coinUid = wallet.coin.uid,
238+ coinCode = wallet.coin.code,
239+ )
240+ return
241+ }
242+ val factory = SendSolanaModule .Factory (wallet, address, hideAddress, adapter)
217243 val sendSolanaViewModel by navGraphViewModels<SendSolanaViewModel >(R .id.sendXFragment) { factory }
218244 Box (
219245 modifier = Modifier
@@ -237,11 +263,11 @@ class SendFragment : BaseComposeFragment() {
237263 BlockchainType .Ton -> {
238264 val adapter: ISendTonAdapter ? = App .adapterManager.getAdapterForWallet(wallet)
239265 if (adapter == null ) {
240- HudHelper .showErrorMessage(
241- LocalView .current,
242- " No adapter for wallet $wallet "
266+ MissingWalletAdapterEffect (
267+ navController = navController,
268+ coinUid = wallet.coin.uid,
269+ coinCode = wallet.coin.code,
243270 )
244- navController.navigateUp()
245271 return
246272 }
247273 val factory = SendTonModule .Factory (wallet, address, hideAddress, adapter)
@@ -266,7 +292,16 @@ class SendFragment : BaseComposeFragment() {
266292 }
267293
268294 BlockchainType .Tron -> {
269- val factory = SendTronModule .Factory (wallet, address, hideAddress)
295+ val adapter: ISendTronAdapter ? = App .adapterManager.getAdapterForWallet(wallet)
296+ if (adapter == null ) {
297+ MissingWalletAdapterEffect (
298+ navController = navController,
299+ coinUid = wallet.coin.uid,
300+ coinCode = wallet.coin.code,
301+ )
302+ return
303+ }
304+ val factory = SendTronModule .Factory (wallet, address, hideAddress, adapter)
270305 val sendTronViewModel by navGraphViewModels<SendTronViewModel >(R .id.sendXFragment) { factory }
271306 Box (
272307 modifier = Modifier
@@ -288,7 +323,16 @@ class SendFragment : BaseComposeFragment() {
288323 }
289324
290325 BlockchainType .Monero -> {
291- val factory = SendMoneroModule .Factory (wallet, address, hideAddress)
326+ val adapter: ISendMoneroAdapter ? = App .adapterManager.getAdapterForWallet(wallet)
327+ if (adapter == null ) {
328+ MissingWalletAdapterEffect (
329+ navController = navController,
330+ coinUid = wallet.coin.uid,
331+ coinCode = wallet.coin.code,
332+ )
333+ return
334+ }
335+ val factory = SendMoneroModule .Factory (wallet, address, hideAddress, adapter)
292336 val sendMoneroViewModel by navGraphViewModels<SendMoneroViewModel >(R .id.sendXFragment) { factory }
293337 Box (
294338 modifier = Modifier
@@ -310,7 +354,16 @@ class SendFragment : BaseComposeFragment() {
310354 }
311355
312356 BlockchainType .Stellar -> {
313- val factory = SendStellarModule .Factory (wallet, address, hideAddress)
357+ val adapter: ISendStellarAdapter ? = App .adapterManager.getAdapterForWallet(wallet)
358+ if (adapter == null ) {
359+ MissingWalletAdapterEffect (
360+ navController = navController,
361+ coinUid = wallet.coin.uid,
362+ coinCode = wallet.coin.code,
363+ )
364+ return
365+ }
366+ val factory = SendStellarModule .Factory (wallet, address, hideAddress, adapter)
314367 val sendStellarViewModel by navGraphViewModels<SendStellarViewModel >(R .id.sendXFragment) { factory }
315368 SendStellarScreen (
316369 title = title,
@@ -340,6 +393,21 @@ class SendFragment : BaseComposeFragment() {
340393 }
341394 }
342395
396+ @Composable
397+ private fun MissingWalletAdapterEffect (
398+ navController : NavController ,
399+ coinUid : String ,
400+ coinCode : String ,
401+ ) {
402+ val view = LocalView .current
403+ val message = stringResource(R .string.send_error_adapter_not_found, coinCode)
404+ LaunchedEffect (coinUid) {
405+ Timber .w(" No adapter for wallet %s" , coinUid)
406+ HudHelper .showErrorMessage(view, message)
407+ navController.navigateUp()
408+ }
409+ }
410+
343411 private fun NavController.handleProceedAction (
344412 data : ProceedActionData ,
345413 keyboardController : SoftwareKeyboardController ?
0 commit comments