103 lines
3.8 KiB
Kotlin
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
|
|
)
|
|
}
|
|
}
|