git.iko.soy/opencode-android
on 66d239c help sign in
54 lines 2.1 kB history raw
1package soy.iko.opencode.ui.components
3import androidx.compose.foundation.layout.Arrangement
4import androidx.compose.foundation.layout.Row
5import androidx.compose.foundation.layout.fillMaxWidth
6import androidx.compose.foundation.layout.padding
7import androidx.compose.foundation.layout.size
8import androidx.compose.material3.CircularProgressIndicator
9import androidx.compose.material3.MaterialTheme
10import androidx.compose.material3.Surface
11import androidx.compose.material3.Text
12import androidx.compose.runtime.Composable
13import androidx.compose.ui.Alignment
14import androidx.compose.ui.Modifier
15import androidx.compose.ui.res.stringResource
16import androidx.compose.ui.unit.dp
17import soy.iko.opencode.R
18import soy.iko.opencode.data.network.EventStreamClient
20/**
21 * Banner shown when the SSE event stream is not connected. Shared by the chat and the
22 * session list so a dropped stream is visible everywhere, not just mid-conversation.
23 */
24@Composable
25fun ConnectionBanner(
26 state: EventStreamClient.ConnectionState,
27 modifier: Modifier = Modifier,
28) {
29 val text = when (state) {
30 EventStreamClient.ConnectionState.Connecting -> stringResource(R.string.connecting)
31 EventStreamClient.ConnectionState.Disconnected -> stringResource(R.string.reconnecting)
32 EventStreamClient.ConnectionState.Connected -> null
33 }
34 if (text != null) {
35 Surface(
36 modifier = modifier.fillMaxWidth(),
37 color = MaterialTheme.colorScheme.tertiaryContainer,
38 ) {
39 Row(
40 modifier = Modifier.fillMaxWidth().padding(vertical = 6.dp),
41 horizontalArrangement = Arrangement.Center,
42 verticalAlignment = Alignment.CenterVertically,
43 ) {
44 CircularProgressIndicator(Modifier.size(12.dp), strokeWidth = 2.dp)
45 Text(
46 text,
47 style = MaterialTheme.typography.labelMedium,
48 color = MaterialTheme.colorScheme.onTertiaryContainer,
49 modifier = Modifier.padding(start = 6.dp),
50 )
51 }
52 }
53 }