package soy.iko.opencode.ui.settings import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.selection.selectable import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.RadioButton import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import kotlinx.coroutines.launch import soy.iko.opencode.data.repo.ThemeMode import soy.iko.opencode.di.AppContainer @OptIn(ExperimentalMaterial3Api::class) @Composable fun SettingsScreen(container: AppContainer, onBack: () -> Unit) { val scope = rememberCoroutineScope() val themeMode by container.settingsStore.themeMode.collectAsStateWithLifecycle(initialValue = ThemeMode.SYSTEM) val activeProfile = container.activeConnection.collectAsStateWithLifecycle().value?.profile Scaffold( topBar = { TopAppBar( title = { Text("Settings") }, navigationIcon = { IconButton(onClick = onBack) { Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Back") } }, ) }, ) { padding -> Column(modifier = Modifier.padding(padding).padding(16.dp)) { Text("Appearance", style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.primary) ThemeMode.entries.forEach { mode -> Row( mode = mode, selected = themeMode == mode, onSelect = { scope.launch { container.settingsStore.setThemeMode(mode) } }, ) } HorizontalDivider(modifier = Modifier.padding(vertical = 16.dp)) Text("Connection", style = MaterialTheme.typography.titleSmall, color = MaterialTheme.colorScheme.primary) if (activeProfile != null) { Text(activeProfile.displayLabel, modifier = Modifier.padding(top = 8.dp)) Text( activeProfile.baseUrl + if (activeProfile.hasAuth) " • Basic auth" else "", style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) } else { Text( "Not connected.", modifier = Modifier.padding(top = 8.dp), color = MaterialTheme.colorScheme.onSurfaceVariant, ) } } } } @Composable private fun Row(mode: ThemeMode, selected: Boolean, onSelect: () -> Unit) { androidx.compose.foundation.layout.Row( modifier = Modifier .fillMaxWidth() .selectable(selected = selected, onClick = onSelect) .padding(vertical = 8.dp), horizontalArrangement = Arrangement.spacedBy(8.dp), verticalAlignment = Alignment.CenterVertically, ) { RadioButton(selected = selected, onClick = onSelect) Text( mode.name.lowercase().replaceFirstChar { it.uppercase() }, style = MaterialTheme.typography.bodyLarge, ) } }