diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt index 4ab9d106..aa63de76 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreen.kt @@ -31,6 +31,7 @@ import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.ime @@ -514,7 +515,7 @@ fun ChannelScreen( targetState = viewModel.ageGateUnlocked, label = "ageGateUnlocked" ) { ageGateUnlocked -> - if (!ageGateUnlocked) { + if (ageGateUnlocked == false) { ChannelScreenAgeGate( onAccept = { viewModel.ageGateUnlocked = true @@ -523,7 +524,11 @@ fun ChannelScreen( onToggleDrawer() } ) - } else { + } else if (ageGateUnlocked == null) { + Box(Modifier.fillMaxSize()) { + CircularProgressIndicator(modifier = Modifier.size(48.dp)) + } + } else if (ageGateUnlocked == true) { Column( modifier = Modifier .padding(pv) diff --git a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt index 6fb064b1..2f2f35f5 100644 --- a/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt +++ b/app/src/main/java/chat/revolt/screens/chat/views/channel/ChannelScreenViewModel.kt @@ -92,7 +92,7 @@ class ChannelScreenViewModel @Inject constructor( var editingMessage by mutableStateOf(null) - var ageGateUnlocked by mutableStateOf(false) + var ageGateUnlocked by mutableStateOf(null) init { viewModelScope.launch { @@ -405,7 +405,11 @@ class ChannelScreenViewModel @Inject constructor( } } - if (!didInitialChannelFetch) didInitialChannelFetch = true + val ackNewest: Boolean + if (!didInitialChannelFetch) { + didInitialChannelFetch = true + ackNewest = true + } else ackNewest = false val newItems = messages.filter { if (ignoreExisting) { @@ -438,6 +442,19 @@ class ChannelScreenViewModel @Inject constructor( } updateItems(newItemsWithPosition) + + // If ackNewest is true, we ack the newest (first, as initial fetch is newest to oldest) message. + if (ackNewest) { + ackMessage(newItemsWithPosition.first { + it is ChannelScreenItem.RegularMessage || it is ChannelScreenItem.SystemMessage + }.let { + when (it) { + is ChannelScreenItem.RegularMessage -> it.message.id + is ChannelScreenItem.SystemMessage -> it.message.id + else -> null + } + } ?: return@launch) + } } catch (e: Exception) { Log.e("ChannelScreenViewModel", "Failed to fetch messages", e) }