Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-17 12:32:52 +01:00
commit e8ccd67098
295 changed files with 4414 additions and 2971 deletions

View file

@ -0,0 +1,47 @@
package com.tangem.core.ui.message
import androidx.compose.material.SnackbarDuration
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.Stable
import com.tangem.core.decompose.ui.UiMessage
import com.tangem.core.ui.extensions.TextReference
/**
* Event that is used to show a message in the UI.
*
* @see EventMessageHandler
* */
@Immutable
sealed interface EventMessage : UiMessage
/**
* Shows a snackbar.
*
* @param message The message to show.
* @param duration The duration of the snackbar.
* @param actionLabel The label of the action button.
* @param action The action to perform when the action button is clicked.
* */
data class SnackbarMessage(
val message: TextReference,
val duration: SnackbarDuration = SnackbarDuration.Short,
val actionLabel: TextReference? = null,
val action: (() -> Unit)? = null,
) : EventMessage
/**
* Shows a [content] in the UI.
*
* @param content The content to show.
* */
data class ContentMessage(val content: Content) : EventMessage {
@Stable
fun interface Content {
@Suppress("ComposableFunctionName", "TopLevelComposableFunctions")
@Composable
operator fun invoke(onDismiss: () -> Unit)
}
}

View file

@ -0,0 +1,43 @@
package com.tangem.core.ui.message
import android.content.Context
import androidx.compose.material.SnackbarHostState
import androidx.compose.material.SnackbarResult
import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalContext
import com.tangem.core.ui.event.EventEffect
import com.tangem.core.ui.extensions.resolveReference
@Composable
fun EventMessageEffect(messageHandler: EventMessageHandler, snackbarHostState: SnackbarHostState) {
val messageEvent by messageHandler.collectAsState()
val context = LocalContext.current
var contentMessage: ContentMessage? by remember { mutableStateOf(value = null) }
EventEffect(event = messageEvent) { message ->
when (message) {
is ContentMessage -> {
contentMessage = message
}
is SnackbarMessage -> {
showSnackbar(snackbarHostState, message, context)
}
}
}
contentMessage?.content?.invoke(
onDismiss = { contentMessage = null },
)
}
private suspend fun showSnackbar(snackbarHostState: SnackbarHostState, message: SnackbarMessage, context: Context) {
val result = snackbarHostState.showSnackbar(
message = message.message.resolveReference(context.resources),
actionLabel = message.actionLabel?.resolveReference(context.resources),
duration = message.duration,
)
if (result == SnackbarResult.ActionPerformed) {
message.action?.invoke()
}
}

View file

@ -0,0 +1,27 @@
package com.tangem.core.ui.message
import com.tangem.core.decompose.ui.UiMessage
import com.tangem.core.decompose.ui.UiMessageHandler
import com.tangem.core.ui.event.StateEvent
import com.tangem.core.ui.event.consumedEvent
import com.tangem.core.ui.event.triggeredEvent
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
/**
* Message handler that is used to show or remove an [EventMessage] in the UI.
*/
class EventMessageHandler(
private val events: MutableStateFlow<StateEvent<EventMessage>>,
) : UiMessageHandler, StateFlow<StateEvent<EventMessage>> by events {
override fun handleMessage(message: UiMessage) {
if (message !is EventMessage) return
events.value = triggeredEvent(message, ::consumeEvent)
}
private fun consumeEvent() {
events.value = consumedEvent()
}
}

View file

@ -0,0 +1,9 @@
package com.tangem.core.ui.test
object TestTags {
const val STORIES_SCREEN = "STORIES_SCREEN_CONTAINER"
const val STORIES_SCREEN_SCAN_BUTTON = "STORIES_SCREEN_SCAN_BUTTON"
const val STORIES_SCREEN_ORDER_BUTTON = "STORIES_SCREEN_ORDER_BUTTON"
const val WALLET_SCREEN = "WALLET_SCREEN_CONTAINER"
}