git.iko.soy/opencode-android
on 61cdc75 help sign in
71 lines 2.6 kB history raw
1package soy.iko.opencode.ui.components
3import androidx.compose.foundation.layout.Arrangement
4import androidx.compose.foundation.layout.Column
5import androidx.compose.foundation.layout.padding
6import androidx.compose.foundation.layout.size
7import androidx.compose.material3.Button
8import androidx.compose.material3.Icon
9import androidx.compose.material3.MaterialTheme
10import androidx.compose.material3.Text
11import androidx.compose.runtime.Composable
12import androidx.compose.ui.Alignment
13import androidx.compose.ui.Modifier
14import androidx.compose.ui.graphics.vector.ImageVector
15import androidx.compose.ui.semantics.heading
16import androidx.compose.ui.semantics.semantics
17import androidx.compose.ui.text.style.TextAlign
18import androidx.compose.ui.unit.dp
20/**
21 * Shared empty/placeholder state: a centered icon, a title, an optional supporting line,
22 * and an optional call-to-action button. Extracted so every screen's "nothing here yet"
23 * state reads and behaves the same (see EmptySessions/EmptyServers/etc. which predate this).
24 */
25@Composable
26fun EmptyState(
27 icon: ImageVector,
28 title: String,
29 modifier: Modifier = Modifier,
30 description: String? = null,
31 actionIcon: ImageVector? = null,
32 actionLabel: String? = null,
33 onAction: (() -> Unit)? = null,
34) {
35 Column(
36 modifier = modifier.padding(32.dp),
37 horizontalAlignment = Alignment.CenterHorizontally,
38 verticalArrangement = Arrangement.spacedBy(8.dp, Alignment.CenterVertically),
39 ) {
40 Icon(
41 icon,
42 contentDescription = null,
43 modifier = Modifier.size(56.dp),
44 tint = MaterialTheme.colorScheme.onSurfaceVariant,
45 )
46 Text(
47 title,
48 style = MaterialTheme.typography.titleMedium,
49 textAlign = TextAlign.Center,
50 modifier = Modifier.semantics { heading() },
51 )
52 if (description != null) {
53 Text(
54 description,
55 style = MaterialTheme.typography.bodyMedium,
56 color = MaterialTheme.colorScheme.onSurfaceVariant,
57 textAlign = TextAlign.Center,
58 )
59 }
60 if (actionLabel != null && onAction != null) {
61 Button(onClick = onAction, modifier = Modifier.padding(top = 12.dp)) {
62 if (actionIcon != null) {
63 Icon(actionIcon, contentDescription = null, modifier = Modifier.size(18.dp))
64 Text(actionLabel, modifier = Modifier.padding(start = 6.dp))
65 } else {
66 Text(actionLabel)
67 }
68 }
69 }
70 }