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(