From f8de55e67107dbeb47f69be8d806cbbd5752d17d Mon Sep 17 00:00:00 2001 From: hailin Date: Thu, 1 Jan 2026 22:21:30 -0800 Subject: [PATCH] fix(android): reset isLoading after signing completes to enable broadcast button MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The broadcast button was disabled because isLoading remained true after signing completed. Added isLoading = false reset in startSigningProcess after waitForSignature succeeds or fails. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../presentation/viewmodel/MainViewModel.kt | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/presentation/viewmodel/MainViewModel.kt b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/presentation/viewmodel/MainViewModel.kt index 458f4bfa..232e8ee7 100644 --- a/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/presentation/viewmodel/MainViewModel.kt +++ b/backend/mpc-system/services/service-party-android/app/src/main/java/com/durian/tssparty/presentation/viewmodel/MainViewModel.kt @@ -1244,10 +1244,12 @@ class MainViewModel @Inject constructor( onSuccess = { result -> android.util.Log.d("MainViewModel", "[SIGN] Signature received: ${result.signature.take(20)}...") _signature.value = result.signature + // IMPORTANT: Reset isLoading so broadcast button is enabled + _uiState.update { it.copy(isLoading = false) } }, onFailure = { e -> android.util.Log.e("MainViewModel", "[SIGN] waitForSignature FAILED: ${e.message}") - _uiState.update { it.copy(error = e.message) } + _uiState.update { it.copy(isLoading = false, error = e.message) } } ) } @@ -1257,26 +1259,37 @@ class MainViewModel @Inject constructor( * Broadcast the signed transaction */ fun broadcastTransaction() { + android.util.Log.d("MainViewModel", "[BROADCAST] broadcastTransaction() called") viewModelScope.launch { + android.util.Log.d("MainViewModel", "[BROADCAST] Starting broadcast...") _uiState.update { it.copy(isLoading = true, error = null) } val tx = _preparedTx.value val sig = _signature.value + android.util.Log.d("MainViewModel", "[BROADCAST] preparedTx: ${tx?.let { "present" } ?: "null"}") + android.util.Log.d("MainViewModel", "[BROADCAST] signature: ${sig?.let { "${it.take(20)}..." } ?: "null"}") + if (tx == null || sig == null) { + android.util.Log.e("MainViewModel", "[BROADCAST] Missing tx or signature! tx=$tx, sig=$sig") _uiState.update { it.copy(isLoading = false, error = "交易或签名缺失") } return@launch } val rpcUrl = _settings.value.kavaRpcUrl + android.util.Log.d("MainViewModel", "[BROADCAST] Using RPC URL: $rpcUrl") val result = repository.broadcastTransaction(tx, sig, rpcUrl) + android.util.Log.d("MainViewModel", "[BROADCAST] repository.broadcastTransaction returned: isSuccess=${result.isSuccess}") + result.fold( onSuccess = { hash -> + android.util.Log.d("MainViewModel", "[BROADCAST] SUCCESS! txHash=$hash") _txHash.value = hash _uiState.update { it.copy(isLoading = false, successMessage = "交易已广播!") } }, onFailure = { e -> + android.util.Log.e("MainViewModel", "[BROADCAST] FAILED: ${e.message}", e) _uiState.update { it.copy(isLoading = false, error = e.message) } } )