From 98c262090bca488cd365b0839a53616e5e3f7182 Mon Sep 17 00:00:00 2001 From: benk10 Date: Mon, 24 Nov 2025 09:36:48 -0500 Subject: [PATCH] fix: backup tags on activity edit --- .../send/SendCoinSelectionViewModel.kt | 22 +++++----- .../viewmodels/ActivityDetailViewModel.kt | 43 ++++++++++--------- .../ActivityDetailViewModelTest.kt | 5 +-- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendCoinSelectionViewModel.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendCoinSelectionViewModel.kt index afe0ad9e8..026876255 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendCoinSelectionViewModel.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendCoinSelectionViewModel.kt @@ -14,8 +14,8 @@ import org.lightningdevkit.ldknode.SpendableUtxo import to.bitkit.di.BgDispatcher import to.bitkit.env.Env import to.bitkit.ext.rawId +import to.bitkit.repositories.ActivityRepo import to.bitkit.repositories.LightningRepo -import to.bitkit.services.CoreService import to.bitkit.ui.shared.toast.ToastEventBus import to.bitkit.utils.Logger import javax.inject.Inject @@ -24,7 +24,7 @@ import javax.inject.Inject class SendCoinSelectionViewModel @Inject constructor( @BgDispatcher private val bgDispatcher: CoroutineDispatcher, private val lightningRepo: LightningRepo, - private val coreService: CoreService, + private val activityRepo: ActivityRepo, ) : ViewModel() { private val _uiState = MutableStateFlow(CoinSelectionUiState()) @@ -74,17 +74,19 @@ class SendCoinSelectionViewModel @Inject constructor( if (_tagsByTxId.value.containsKey(txId)) return viewModelScope.launch(bgDispatcher) { - runCatching { - // find activity by txId - onchainActivities.firstOrNull { (it as? Onchain)?.v1?.txId == txId }?.let { activity -> - // get tags by activity id - coreService.activity.tags(forActivityId = activity.rawId()) - .takeIf { it.isNotEmpty() } - ?.let { tags -> + // find activity by txId + onchainActivities.firstOrNull { (it as? Onchain)?.v1?.txId == txId }?.let { activity -> + // get tags by activity id + activityRepo.getActivityTags(activity.rawId()) + .onSuccess { tags -> + if (tags.isNotEmpty()) { // add map entry linking tags to utxo.outpoint.txid _tagsByTxId.update { currentMap -> currentMap + (txId to tags) } } - } + } + .onFailure { e -> + Logger.error("Failed to load tags for utxo $txId", e) + } } } } diff --git a/app/src/main/java/to/bitkit/viewmodels/ActivityDetailViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/ActivityDetailViewModel.kt index 5f7f268ca..509a7a820 100644 --- a/app/src/main/java/to/bitkit/viewmodels/ActivityDetailViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/ActivityDetailViewModel.kt @@ -14,8 +14,8 @@ import kotlinx.coroutines.withContext import to.bitkit.data.SettingsStore import to.bitkit.di.BgDispatcher import to.bitkit.ext.rawId +import to.bitkit.repositories.ActivityRepo import to.bitkit.repositories.BlocktankRepo -import to.bitkit.services.CoreService import to.bitkit.utils.AddressChecker import to.bitkit.utils.Logger import to.bitkit.utils.TxDetails @@ -25,7 +25,7 @@ import javax.inject.Inject class ActivityDetailViewModel @Inject constructor( @BgDispatcher private val bgDispatcher: CoroutineDispatcher, private val addressChecker: AddressChecker, - private val coreService: CoreService, + private val activityRepo: ActivityRepo, private val settingsStore: SettingsStore, private val blocktankRepo: BlocktankRepo, ) : ViewModel() { @@ -48,40 +48,41 @@ class ActivityDetailViewModel @Inject constructor( fun loadTags() { val id = activity?.rawId() ?: return viewModelScope.launch(bgDispatcher) { - try { - val activityTags = coreService.activity.tags(forActivityId = id) - _tags.value = activityTags - } catch (e: Exception) { - Logger.error("Failed to load tags for activity $id", e, TAG) - _tags.value = emptyList() - } + activityRepo.getActivityTags(id) + .onSuccess { activityTags -> + _tags.value = activityTags + } + .onFailure { e -> + Logger.error("Failed to load tags for activity $id", e, TAG) + _tags.value = emptyList() + } } } fun removeTag(tag: String) { val id = activity?.rawId() ?: return viewModelScope.launch(bgDispatcher) { - try { - coreService.activity.dropTags(fromActivityId = id, tags = listOf(tag)) - loadTags() - } catch (e: Exception) { - Logger.error("Failed to remove tag $tag from activity $id", e, TAG) - } + activityRepo.removeTagsFromActivity(id, listOf(tag)) + .onSuccess { + loadTags() + } + .onFailure { e -> + Logger.error("Failed to remove tag $tag from activity $id", e, TAG) + } } } fun addTag(tag: String) { val id = activity?.rawId() ?: return viewModelScope.launch(bgDispatcher) { - try { - val result = coreService.activity.appendTags(toActivityId = id, tags = listOf(tag)) - if (result.isSuccess) { + activityRepo.addTagsToActivity(id, listOf(tag)) + .onSuccess { settingsStore.addLastUsedTag(tag) loadTags() } - } catch (e: Exception) { - Logger.error("Failed to add tag $tag to activity $id", e, TAG) - } + .onFailure { e -> + Logger.error("Failed to add tag $tag to activity $id", e, TAG) + } } } diff --git a/app/src/test/java/to/bitkit/repositories/ActivityDetailViewModelTest.kt b/app/src/test/java/to/bitkit/repositories/ActivityDetailViewModelTest.kt index 2fe1300ba..d958a40d3 100644 --- a/app/src/test/java/to/bitkit/repositories/ActivityDetailViewModelTest.kt +++ b/app/src/test/java/to/bitkit/repositories/ActivityDetailViewModelTest.kt @@ -8,7 +8,6 @@ import org.mockito.kotlin.doReturn import org.mockito.kotlin.mock import org.mockito.kotlin.whenever import to.bitkit.data.SettingsStore -import to.bitkit.services.CoreService import to.bitkit.test.BaseUnitTest import to.bitkit.utils.AddressChecker import to.bitkit.viewmodels.ActivityDetailViewModel @@ -17,7 +16,7 @@ import kotlin.test.assertNull class ActivityDetailViewModelTest : BaseUnitTest() { - private val coreService = mock() + private val activityRepo = mock() private val blocktankRepo = mock() private val settingsStore = mock() private val addressChecker = mock() @@ -30,7 +29,7 @@ class ActivityDetailViewModelTest : BaseUnitTest() { sut = ActivityDetailViewModel( bgDispatcher = testDispatcher, - coreService = coreService, + activityRepo = activityRepo, blocktankRepo = blocktankRepo, settingsStore = settingsStore, addressChecker = addressChecker,