Files
forkmessager/client-mobile/core/presentation/settings/SettingsScreen.kt
Халимов Рустам 1fb1be47dd Приложение
2026-04-14 01:15:54 +03:00

103 lines
3.8 KiB
Kotlin

package core.presentation.settings
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material.icons.filled.Save
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import ru.knot.messager.R
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SettingsScreen(
onBack: () -> Unit,
onLogout: () -> Unit = {},
viewModel: SettingsViewModel = hiltViewModel()
) {
val state by viewModel.state.collectAsState()
var baseUrl by remember(state.baseUrl) { mutableStateOf(state.baseUrl) }
Scaffold(
topBar = {
TopAppBar(
title = { Text(stringResource(R.string.settings)) },
navigationIcon = {
IconButton(onClick = onBack) {
Icon(Icons.Default.ArrowBack, contentDescription = stringResource(R.string.back))
}
},
actions = {
IconButton(onClick = { viewModel.saveBaseUrl(baseUrl) }) {
Icon(Icons.Default.Save, contentDescription = stringResource(R.string.save))
}
}
)
}
) { paddingValues ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
.padding(16.dp)
) {
Text(
text = stringResource(R.string.server_connection),
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(bottom = 8.dp)
)
OutlinedTextField(
value = baseUrl,
onValueChange = { baseUrl = it },
label = { Text(stringResource(R.string.api_base_url)) },
modifier = Modifier.fillMaxWidth(),
placeholder = { Text("https://example.com/api/") }
)
Spacer(modifier = Modifier.height(24.dp))
Text(
text = stringResource(R.string.server_features),
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(bottom = 8.dp)
)
FeatureStatusItem(stringResource(R.string.stories), state.config.features.stories)
FeatureStatusItem(stringResource(R.string.polls), state.config.features.polls)
FeatureStatusItem(stringResource(R.string.calls), state.config.features.calls)
FeatureStatusItem(stringResource(R.string.groups), state.config.features.groups)
Spacer(modifier = Modifier.height(16.dp))
Text(
text = stringResource(R.string.limits),
style = MaterialTheme.typography.titleSmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Text("${stringResource(R.string.max_file_size)}: ${state.config.limits.maxFileSize / (1024 * 1024)} MB")
Text("${stringResource(R.string.max_group_members)}: ${state.config.limits.maxGroupMembers}")
}
}
}
@Composable
fun FeatureStatusItem(name: String, enabled: Boolean) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 4.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
Text(name)
Text(
text = if (enabled) stringResource(R.string.enabled) else stringResource(R.string.disabled),
color = if (enabled) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.error
)
}
}