diff --git a/core/ui/src/main/java/com/tangem/core/ui/event/EventEffect.kt b/core/ui/src/main/java/com/tangem/core/ui/event/EventEffect.kt index 49abda9299..e6f3ad0d84 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/event/EventEffect.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/event/EventEffect.kt @@ -13,11 +13,12 @@ import androidx.compose.runtime.NonRestartableComposable */ @Composable @NonRestartableComposable -fun EventEffect(event: StateEvent, onTrigger: suspend () -> Unit) { +@Suppress("UnnecessaryEventHandlerParameter") +fun EventEffect(event: StateEvent, onTrigger: suspend (data: A) -> Unit) { LaunchedEffect(event) { - if (event is StateEvent.Triggered) { - onTrigger() - event.consume() + if (event is StateEvent.Triggered) { + onTrigger(event.data) + event.onConsume() } } } \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/event/StateEvent.kt b/core/ui/src/main/java/com/tangem/core/ui/event/StateEvent.kt index d0f495b944..1860808b1d 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/event/StateEvent.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/event/StateEvent.kt @@ -9,32 +9,34 @@ import androidx.compose.runtime.Immutable * re-triggered on recompositions or state changes. */ @Immutable -sealed class StateEvent { - - /** Defines the action to be executed when the event is consumed. */ - protected abstract val onConsume: () -> Unit +sealed class StateEvent { /** * Represents an already consumed state event. * Events of this type will not trigger any further actions. */ - object Consumed : StateEvent() { - override val onConsume: () -> Unit = {} + class Consumed : StateEvent() { + + override fun equals(other: Any?): Boolean { + if (this === other) return true + return other is Consumed<*> + } + + override fun hashCode(): Int { + return javaClass.hashCode() + } } /** * Represents a state event that has been triggered but not yet consumed. * + * @property data The data provided by the event. * @property onConsume The action to be executed when the event is consumed. */ - data class Triggered(override val onConsume: () -> Unit) : StateEvent() - - /** - * Consumes the event, triggering any associated action. - */ - fun consume() { - onConsume() - } + data class Triggered( + val data: A, + internal val onConsume: () -> Unit, + ) : StateEvent() } /** @@ -43,9 +45,11 @@ sealed class StateEvent { * @param onConsume The action to be executed when the event is consumed. * @return A triggered state event. */ -fun triggered(onConsume: () -> Unit): StateEvent.Triggered = StateEvent.Triggered(onConsume) +fun triggeredEvent(data: A, onConsume: () -> Unit): StateEvent = StateEvent.Triggered(data, onConsume) /** - * Represents a statically defined [StateEvent.Consumed] event. + * Creates a [StateEvent.Consumed] instance. + * + * @return A consumed state event. */ -val consumed: StateEvent.Consumed = StateEvent.Consumed \ No newline at end of file +fun consumedEvent(): StateEvent = StateEvent.Consumed() \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt index 7562581a91..8fd27445cb 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt @@ -6,7 +6,7 @@ import com.tangem.core.ui.components.marketprice.MarketPriceBlockState import com.tangem.core.ui.components.marketprice.PriceChangeConfig import com.tangem.core.ui.components.transactions.state.TransactionState import com.tangem.core.ui.components.transactions.state.TxHistoryState -import com.tangem.core.ui.event.consumed +import com.tangem.core.ui.event.consumedEvent import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.stringReference import com.tangem.core.ui.res.TangemColorPalette @@ -276,7 +276,7 @@ internal object WalletPreviewData { onApplyClick = {}, onCancelClick = {}, ), - scrollListToTop = consumed, + scrollListToTop = consumedEvent(), ) } 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 4552ef0050..a00a26f468 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 @@ -1,8 +1,8 @@ package com.tangem.feature.wallet.presentation.organizetokens import com.tangem.common.Provider -import com.tangem.core.ui.event.consumed -import com.tangem.core.ui.event.triggered +import com.tangem.core.ui.event.consumedEvent +import com.tangem.core.ui.event.triggeredEvent import com.tangem.domain.appcurrency.model.AppCurrency import com.tangem.domain.tokens.error.TokenListError import com.tangem.domain.tokens.error.TokenListSortingError @@ -66,7 +66,7 @@ internal class OrganizeTokensStateHolder( fun updateStateAfterTokenListSorting(tokenList: TokenList) { updateState { tokenListConverter.convert(tokenList).copy( - scrollListToTop = triggered(::consumeScrollListToTopEvent), + scrollListToTop = triggeredEvent(Unit, ::consumeScrollListToTopEvent), ) } } @@ -114,15 +114,15 @@ internal class OrganizeTokensStateHolder( onItemDragEnd = dragAndDropIntents::onItemDraggingEnd, canDragItemOver = dragAndDropIntents::canDragItemOver, ), - scrollListToTop = consumed, + scrollListToTop = consumedEvent(), ) } - private fun updateState(block: OrganizeTokensState.() -> OrganizeTokensState) { + private inline fun updateState(block: OrganizeTokensState.() -> OrganizeTokensState) { stateFlowInternal.update(block) } private fun consumeScrollListToTopEvent() { - updateState { copy(scrollListToTop = consumed) } + updateState { copy(scrollListToTop = consumedEvent()) } } } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/OrganizeTokensState.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/OrganizeTokensState.kt index a1ae0ff965..a269938058 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/OrganizeTokensState.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/organizetokens/model/OrganizeTokensState.kt @@ -11,7 +11,7 @@ internal data class OrganizeTokensState( val header: HeaderConfig, val actions: ActionsConfig, val dndConfig: DragAndDropConfig, - val scrollListToTop: StateEvent, + val scrollListToTop: StateEvent, ) { data class HeaderConfig(