diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt index a00a26f468..25598c9983 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensStateHolder.kt @@ -16,15 +16,14 @@ import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.err import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.items.CryptoCurrencyToDraggableItemConverter import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.items.NetworkGroupToDraggableItemsConverter import com.tangem.feature.wallet.presentation.organizetokens.utils.converter.items.TokenListToListStateConverter -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.* +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.update internal class OrganizeTokensStateHolder( private val intents: OrganizeTokensIntents, private val dragAndDropIntents: DragAndDropIntents, private val appCurrencyProvider: Provider, - private val onSubscription: () -> Unit, - stateFlowScope: CoroutineScope, ) { private val stateFlowInternal: MutableStateFlow = MutableStateFlow(getInitialState()) @@ -52,12 +51,6 @@ internal class OrganizeTokensStateHolder( } val stateFlow: StateFlow = stateFlowInternal - .onSubscription { onSubscription() } - .stateIn( - scope = stateFlowScope, - started = SharingStarted.WhileSubscribed(), - initialValue = getInitialState(), - ) fun updateStateWithTokenList(tokenList: TokenList) { updateState { tokenListConverter.convert(tokenList) } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt index a972f62260..9fa199b6a1 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/OrganizeTokensViewModel.kt @@ -50,14 +50,9 @@ internal class OrganizeTokensViewModel @Inject constructor( ) private val stateHolder = OrganizeTokensStateHolder( - stateFlowScope = viewModelScope, intents = this, dragAndDropIntents = dragAndDropAdapter, appCurrencyProvider = Provider(selectedAppCurrencyFlow::value), - onSubscription = { - bootstrapTokenList() - bootstrapDragAndDropUpdates() - }, ) private val userWalletId: UserWalletId by lazy { @@ -72,6 +67,9 @@ internal class OrganizeTokensViewModel @Inject constructor( override fun onCreate(owner: LifecycleOwner) { analyticsEventsHandler.send(PortfolioOrganizeTokensAnalyticsEvent.ScreenOpened) + + bootstrapTokenList() + bootstrapDragAndDropUpdates() } override fun onBackClick() { @@ -166,7 +164,7 @@ internal class OrganizeTokensViewModel @Inject constructor( } private fun bootstrapDragAndDropUpdates() { - dragAndDropAdapter.stateFlow + dragAndDropAdapter.dragAndDropUpdates .distinctUntilChanged() .onEach { stateHolder.updateStateWithManualSorting(it) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/dnd/DragAndDropAdapter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/dnd/DragAndDropAdapter.kt index 45dcb02cee..7cdc7d9d4c 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/dnd/DragAndDropAdapter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/utils/dnd/DragAndDropAdapter.kt @@ -9,8 +9,8 @@ import com.tangem.feature.wallet.presentation.organizetokens.utils.common.uniteI import com.tangem.feature.wallet.presentation.organizetokens.utils.common.updateItems import kotlinx.collections.immutable.mutate import kotlinx.coroutines.channels.BufferOverflow -import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.SharedFlow import org.burnoutcrew.reorderable.ItemPosition internal class DragAndDropAdapter( @@ -22,15 +22,15 @@ internal class DragAndDropAdapter( private val currentListState: OrganizeTokensListState get() = listStateProvider.invoke() - private val listStateFlowInternal: MutableSharedFlow = MutableSharedFlow( + private val dragAndDropUpdatesInternal: MutableSharedFlow = MutableSharedFlow( replay = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST, ) private var currentDraggingItem: DraggableItem? = null - val stateFlow: Flow - get() = listStateFlowInternal + val dragAndDropUpdates: SharedFlow + get() = dragAndDropUpdatesInternal override fun canDragItemOver(dragOver: ItemPosition, dragging: ItemPosition): Boolean { val items = when (val listState = currentListState) { @@ -97,7 +97,7 @@ internal class DragAndDropAdapter( private fun updateListState(block: OrganizeTokensListState.() -> List) { val updatedState = currentListState.updateItems { block(currentListState) } - listStateFlowInternal.tryEmit(updatedState) + dragAndDropUpdatesInternal.tryEmit(updatedState) } private fun findItemsToMove( diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt index 2e5be36d4a..dbe5b06c33 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/router/DefaultWalletRouter.kt @@ -58,10 +58,10 @@ internal class DefaultWalletRouter(private val reduxNavController: ReduxNavContr WalletRoute.OrganizeTokens.route, arguments = listOf(navArgument(WalletRoute.userWalletIdKey) { type = NavType.StringType }), ) { - val viewModel: OrganizeTokensViewModel = hiltViewModel() - .apply { - router = this@DefaultWalletRouter - } + val viewModel = hiltViewModel().apply { + router = this@DefaultWalletRouter + } + LocalLifecycleOwner.current.lifecycle.addObserver(viewModel) val uiState by viewModel.uiState.collectAsStateWithLifecycle()