Updated on 2026-08-14
This commit is contained in:
parent
c4ec5774a3
commit
c62c6b032b
5 changed files with 35 additions and 30 deletions
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
|
|
@ -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(),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()) }
|
||||
}
|
||||
}
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue