Updated on 2026-08-14

This commit is contained in:
Tangem 2023-09-11 12:53:42 +03:00
parent c4ec5774a3
commit c62c6b032b
5 changed files with 35 additions and 30 deletions

View file

@ -13,11 +13,12 @@ import androidx.compose.runtime.NonRestartableComposable
*/
@Composable
@NonRestartableComposable
fun EventEffect(event: StateEvent, onTrigger: suspend () -> Unit) {
@Suppress("UnnecessaryEventHandlerParameter")
fun <A> EventEffect(event: StateEvent<A>, onTrigger: suspend (data: A) -> Unit) {
LaunchedEffect(event) {
if (event is StateEvent.Triggered) {
onTrigger()
event.consume()
if (event is StateEvent.Triggered<A>) {
onTrigger(event.data)
event.onConsume()
}
}
}

View file

@ -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<in A> {
/**
* 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<A> : StateEvent<A>() {
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<A>(
val data: A,
internal val onConsume: () -> Unit,
) : StateEvent<A>()
}
/**
@ -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 <A> triggeredEvent(data: A, onConsume: () -> Unit): StateEvent<A> = 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
fun <A> consumedEvent(): StateEvent<A> = StateEvent.Consumed()

View file

@ -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(),
)
}

View file

@ -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()) }
}
}

View file

@ -11,7 +11,7 @@ internal data class OrganizeTokensState(
val header: HeaderConfig,
val actions: ActionsConfig,
val dndConfig: DragAndDropConfig,
val scrollListToTop: StateEvent,
val scrollListToTop: StateEvent<Unit>,
) {
data class HeaderConfig(