fix(groupchat): adopt lifecycle state collection, add error/skeleton states, and fix duplicate test tag

Use collectAsStateWithLifecycle, SkeletonListState, and ErrorState.
Disambiguate composer stop button test tag.
This commit is contained in:
Hy4ri committed 2026-09-11 18:27:20 +03:00
1 parent e6e79be10d
commit 02d99e159f
1 file changed
+18 -8
@@ -64,7 +64,6 @@ import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@@ -92,6 +91,7 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import com.m57.hermescontrol.R import com.m57.hermescontrol.R
import com.m57.hermescontrol.theme.LocalChatFontScale import com.m57.hermescontrol.theme.LocalChatFontScale
@@ -103,8 +103,10 @@ import com.m57.hermescontrol.ui.chat.components.tailContentKey
import com.m57.hermescontrol.ui.chat.formatTimestamp import com.m57.hermescontrol.ui.chat.formatTimestamp
import com.m57.hermescontrol.ui.common.BotAvatar import com.m57.hermescontrol.ui.common.BotAvatar
import com.m57.hermescontrol.ui.common.EmptyState import com.m57.hermescontrol.ui.common.EmptyState
import com.m57.hermescontrol.ui.common.ErrorState
import com.m57.hermescontrol.ui.common.HermesScaffold import com.m57.hermescontrol.ui.common.HermesScaffold
import com.m57.hermescontrol.ui.common.NavIcon import com.m57.hermescontrol.ui.common.NavIcon
import com.m57.hermescontrol.ui.common.SkeletonListState
import com.m57.hermescontrol.util.BidiUtils import com.m57.hermescontrol.util.BidiUtils
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -117,7 +119,7 @@ fun GroupChatScreen(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
viewModel: GroupChatViewModel = viewModel { GroupChatViewModel() }, viewModel: GroupChatViewModel = viewModel { GroupChatViewModel() },
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val listState = rememberLazyListState() val listState = rememberLazyListState()
val scrollScope = rememberCoroutineScope() val scrollScope = rememberCoroutineScope()
val scrollController = rememberChatScrollController(listState, scrollScope) val scrollController = rememberChatScrollController(listState, scrollScope)
@@ -220,15 +222,23 @@ fun GroupChatScreen(
) { ) {
when { when {
state.isLoading -> { state.isLoading -> {
Box( SkeletonListState(
modifier = modifier =
Modifier Modifier
.weight(1f) .weight(1f)
.fillMaxWidth(), .fillMaxWidth(),
contentAlignment = Alignment.Center, )
) { }
CircularProgressIndicator(modifier = Modifier.size(32.dp))
} state.errorMessage != null -> {
ErrorState(
message = state.errorMessage ?: "",
onRetry = { viewModel.setGroup(groupName) },
modifier =
Modifier
.weight(1f)
.fillMaxWidth(),
)
} }
state.messages.isEmpty() -> { state.messages.isEmpty() -> {
@@ -515,7 +525,7 @@ fun GroupChatScreen(
modifier = modifier =
Modifier Modifier
.size(36.dp) .size(36.dp)
.testTag("group_chat_stop_button"), .testTag("group_chat_composer_stop_button"),
) { ) {
Icon( Icon(
imageVector = Icons.Filled.Stop, imageVector = Icons.Filled.Stop,