android, desktop: fix alerts/modals when they are shown before UI init (#3697)
This commit is contained in:
parent
809dd1ef01
commit
ab8a87acad
@ -22,24 +22,27 @@ import chat.simplex.common.ui.theme.*
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.StringResource
|
||||
import dev.icerock.moko.resources.compose.painterResource
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
|
||||
class AlertManager {
|
||||
private var alertViews = mutableStateListOf<(@Composable () -> Unit)>()
|
||||
// Don't use mutableStateOf() here, because it produces this if showing from SimpleXAPI.startChat():
|
||||
// java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied
|
||||
private var alertViews = MutableStateFlow(listOf<(@Composable () -> Unit)>())
|
||||
|
||||
fun showAlert(alert: @Composable () -> Unit) {
|
||||
Log.d(TAG, "AlertManager.showAlert")
|
||||
alertViews.add(alert)
|
||||
alertViews.value += alert
|
||||
}
|
||||
|
||||
fun hideAlert() {
|
||||
alertViews.removeLastOrNull()
|
||||
alertViews.value = ArrayList(alertViews.value).also { it.removeLastOrNull() }
|
||||
}
|
||||
|
||||
fun hideAllAlerts() {
|
||||
alertViews.clear()
|
||||
alertViews.value = listOf()
|
||||
}
|
||||
|
||||
fun hasAlertsShown() = alertViews.isNotEmpty()
|
||||
fun hasAlertsShown() = alertViews.value.isNotEmpty()
|
||||
|
||||
fun showAlertDialogButtons(
|
||||
title: String,
|
||||
@ -242,7 +245,7 @@ class AlertManager {
|
||||
|
||||
@Composable
|
||||
fun showInView() {
|
||||
remember { alertViews }.lastOrNull()?.invoke()
|
||||
alertViews.collectAsState().value.lastOrNull()?.invoke()
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
@ -11,6 +11,7 @@ import androidx.compose.ui.graphics.Color
|
||||
import chat.simplex.common.model.ChatModel
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.ui.theme.*
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
import kotlin.math.min
|
||||
|
||||
@ -49,7 +50,9 @@ class ModalManager(private val placement: ModalPlacement? = null) {
|
||||
private val modalCount = mutableStateOf(0)
|
||||
private val toRemove = mutableSetOf<Int>()
|
||||
private var oldViewChanging = AtomicBoolean(false)
|
||||
private var passcodeView: MutableState<(@Composable (close: () -> Unit) -> Unit)?> = mutableStateOf(null)
|
||||
// Don't use mutableStateOf() here, because it produces this if showing from SimpleXAPI.startChat():
|
||||
// java.lang.IllegalStateException: Reading a state that was created after the snapshot was taken or in a snapshot that has not yet been applied
|
||||
private var passcodeView: MutableStateFlow<(@Composable (close: () -> Unit) -> Unit)?> = MutableStateFlow(null)
|
||||
|
||||
fun showModal(settings: Boolean = false, showClose: Boolean = true, endButtons: @Composable RowScope.() -> Unit = {}, content: @Composable ModalData.() -> Unit) {
|
||||
val data = ModalData()
|
||||
@ -140,7 +143,7 @@ class ModalManager(private val placement: ModalPlacement? = null) {
|
||||
|
||||
@Composable
|
||||
fun showPasscodeInView() {
|
||||
remember { passcodeView }.value?.invoke { passcodeView.value = null }
|
||||
passcodeView.collectAsState().value?.invoke { passcodeView.value = null }
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user