git.iko.soy/opencode-android
on e37d1bb help sign in
75 lines 3.2 kB history raw
1package soy.iko.opencode.ui.chat
3import androidx.compose.foundation.clickable
4import androidx.compose.foundation.layout.Column
5import androidx.compose.foundation.layout.fillMaxWidth
6import androidx.compose.foundation.layout.heightIn
7import androidx.compose.foundation.layout.padding
8import androidx.compose.foundation.lazy.LazyColumn
9import androidx.compose.foundation.lazy.items
10import androidx.compose.material.icons.Icons
11import androidx.compose.material.icons.automirrored.filled.PlaylistPlay
12import androidx.compose.material3.ExperimentalMaterial3Api
13import androidx.compose.material3.Icon
14import androidx.compose.material3.MaterialTheme
15import androidx.compose.material3.ModalBottomSheet
16import androidx.compose.material3.Text
17import androidx.compose.runtime.Composable
18import androidx.compose.ui.Modifier
19import androidx.compose.ui.text.style.TextOverflow
20import androidx.compose.ui.unit.dp
21import soy.iko.opencode.data.model.Command
23/** Bottom sheet that lists slash-commands; selecting one invokes it. */
24@OptIn(ExperimentalMaterial3Api::class)
25@Composable
26fun CommandPickerSheet(
27 commands: List<Command>,
28 onSelect: (Command) -> Unit,
29 onDismiss: () -> Unit,
30) {
31 ModalBottomSheet(onDismissRequest = onDismiss) {
32 Text(
33 "Commands",
34 style = MaterialTheme.typography.titleMedium,
35 modifier = Modifier.padding(start = 24.dp, end = 24.dp, bottom = 8.dp),
36 )
37 if (commands.isEmpty()) {
38 Text(
39 "No commands reported by the server.",
40 style = MaterialTheme.typography.bodyMedium,
41 color = MaterialTheme.colorScheme.onSurfaceVariant,
42 modifier = Modifier.padding(horizontal = 24.dp, vertical = 16.dp),
43 )
44 } else {
45 LazyColumn(modifier = Modifier.fillMaxWidth().heightIn(max = 420.dp)) {
46 items(commands, key = { it.name }) { cmd ->
47 Column(
48 modifier = Modifier
49 .fillMaxWidth()
50 .clickable { onSelect(cmd); onDismiss() }
51 .padding(horizontal = 24.dp, vertical = 12.dp),
52 ) {
53 androidx.compose.foundation.layout.Row(
54 verticalAlignment = androidx.compose.ui.Alignment.CenterVertically,
55 ) {
56 Icon(Icons.AutoMirrored.Filled.PlaylistPlay, contentDescription = null)
57 Text(
58 " /${cmd.name}",
59 style = MaterialTheme.typography.bodyLarge,
60 )
61 }
62 Text(
63 cmd.displayDescription,
64 style = MaterialTheme.typography.bodySmall,
65 color = MaterialTheme.colorScheme.onSurfaceVariant,
66 maxLines = 2,
67 overflow = TextOverflow.Ellipsis,
68 modifier = Modifier.padding(start = 28.dp, top = 2.dp),
69 )
70 }
71 }
72 }
73 }
74 }