Updated on 2026-08-14
This commit is contained in:
commit
e8ccd67098
295 changed files with 4414 additions and 2971 deletions
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
|
@ -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"
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue