From 0b43caf85316735aad76b61733281ee19989661c Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 10 Jul 2026 16:39:11 +0100 Subject: [PATCH] Updated on 2026-08-14 --- .../block/model/ContactsBlockModel.kt | 2 +- .../list/model/AddressBookListModel.kt | 46 ++++++++----------- .../destination/model/SendDestinationModel.kt | 2 +- 3 files changed, 20 insertions(+), 30 deletions(-) diff --git a/features/address-book/impl/src/main/kotlin/com/tangem/features/addressbook/block/model/ContactsBlockModel.kt b/features/address-book/impl/src/main/kotlin/com/tangem/features/addressbook/block/model/ContactsBlockModel.kt index 278d95d8dd..f5c36a478b 100644 --- a/features/address-book/impl/src/main/kotlin/com/tangem/features/addressbook/block/model/ContactsBlockModel.kt +++ b/features/address-book/impl/src/main/kotlin/com/tangem/features/addressbook/block/model/ContactsBlockModel.kt @@ -37,7 +37,7 @@ internal class ContactsBlockModel @Inject constructor( val state: StateFlow get() = stateController.uiState init { - modelScope.launch { syncAddressBooksUseCase() } + modelScope.launch(context = dispatchers.default) { syncAddressBooksUseCase() } combine( params.queryFlow.flatMapLatest { query -> diff --git a/features/address-book/impl/src/main/kotlin/com/tangem/features/addressbook/list/model/AddressBookListModel.kt b/features/address-book/impl/src/main/kotlin/com/tangem/features/addressbook/list/model/AddressBookListModel.kt index e8fc7f8aa7..c91002fbfa 100644 --- a/features/address-book/impl/src/main/kotlin/com/tangem/features/addressbook/list/model/AddressBookListModel.kt +++ b/features/address-book/impl/src/main/kotlin/com/tangem/features/addressbook/list/model/AddressBookListModel.kt @@ -48,8 +48,8 @@ internal class AddressBookListModel @Inject constructor( private val contactSelectionTrigger: ContactSelectionTrigger, private val analyticsSender: AddressBookAnalyticsSender, private val syncAddressBooksUseCase: SyncAddressBooksUseCase, - getVerifiedContactsInteractor: GetVerifiedContactsInteractor, - getWalletsUseCase: GetWalletsUseCase, + private val getVerifiedContactsInteractor: GetVerifiedContactsInteractor, + private val getWalletsUseCase: GetWalletsUseCase, ) : Model() { private val params = paramsContainer.require() @@ -63,22 +63,19 @@ internal class AddressBookListModel @Inject constructor( private val searchActive = MutableStateFlow(value = false) private val selectedWalletId = MutableStateFlow(value = null) - // We keep skeletons during stale state - private val isInitialSyncDone = MutableStateFlow(value = false) - private val allContacts: SharedFlow> = getVerifiedContactsInteractor.getVerifiedContacts(query = "", userWalletId = null) .shareIn(modelScope, SharingStarted.Lazily, replay = 1) init { - modelScope.launch { - try { - syncAddressBooksUseCase() - } finally { - isInitialSyncDone.value = true - } + modelScope.launch(context = dispatchers.default) { + syncAddressBooksUseCase() + sendContactListScreenOpenedEvent() + observeContacts() } + } + private suspend fun observeContacts() { val matchedContacts = searchQuery.flatMapLatest { query -> if (query.isBlank()) { allContacts @@ -86,7 +83,7 @@ internal class AddressBookListModel @Inject constructor( getVerifiedContactsInteractor.getVerifiedContacts(query = query, userWalletId = null) } } - val listInputs = combine( + combine( allContacts, matchedContacts, searchQuery, @@ -101,12 +98,9 @@ internal class AddressBookListModel @Inject constructor( wallets = wallets, ) } - combine(listInputs, isInitialSyncDone) { inputs, syncDone -> inputs to syncDone } - .onEach { (inputs, syncDone) -> if (syncDone) updateState(inputs) } + .onEach(::updateState) .flowOn(dispatchers.default) - .launchIn(modelScope) - - sendContactListScreenOpenedEvent() + .collect() } fun deliverSelection(contact: SelectedContact) { @@ -170,17 +164,13 @@ internal class AddressBookListModel @Inject constructor( } } - private fun sendContactListScreenOpenedEvent() { - allContacts - .take(count = 1) - .onEach { contacts -> - analyticsSender.sendContactListScreenOpened( - source = params.mode.toAnalyticsSource(), - contactsCount = contacts.size, - scope = modelScope, - ) - } - .launchIn(modelScope) + private suspend fun sendContactListScreenOpenedEvent() { + val contacts = allContacts.first() + analyticsSender.sendContactListScreenOpened( + source = params.mode.toAnalyticsSource(), + contactsCount = contacts.size, + scope = modelScope, + ) } private fun AddressBookRoute.ListMode.toAnalyticsSource(): Source = when (this) { diff --git a/features/send/impl/src/main/java/com/tangem/features/send/subcomponents/destination/model/SendDestinationModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/subcomponents/destination/model/SendDestinationModel.kt index eac6616290..9ebade81e7 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/subcomponents/destination/model/SendDestinationModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/subcomponents/destination/model/SendDestinationModel.kt @@ -141,7 +141,7 @@ internal class SendDestinationModel @Inject constructor( private val backupProblematicWalletCache = AtomicReference?>(null) init { - modelScope.launch { syncAddressBooksUseCase() } + modelScope.launch(context = dispatchers.default) { syncAddressBooksUseCase() } subscribeOnQRScannerResult() initialState() resetContactOnEdit()