git.iko.soy/opencode-android
on 0bc1eda help sign in
117 lines 5.1 kB history raw
1package soy.iko.opencode.ui.server
3import androidx.compose.foundation.layout.Column
4import androidx.compose.foundation.layout.fillMaxWidth
5import androidx.compose.foundation.layout.imePadding
6import androidx.compose.foundation.layout.padding
7import androidx.compose.foundation.layout.widthIn
8import androidx.compose.foundation.rememberScrollState
9import androidx.compose.foundation.text.KeyboardActions
10import androidx.compose.foundation.text.KeyboardOptions
11import androidx.compose.foundation.verticalScroll
12import androidx.compose.material.icons.Icons
13import androidx.compose.material.icons.automirrored.filled.ArrowBack
14import androidx.compose.material3.Button
15import androidx.compose.material3.ExperimentalMaterial3Api
16import androidx.compose.material3.Icon
17import androidx.compose.material3.IconButton
18import androidx.compose.material3.OutlinedTextField
19import androidx.compose.material3.Scaffold
20import androidx.compose.material3.Text
21import androidx.compose.material3.TopAppBar
22import androidx.compose.runtime.Composable
23import androidx.compose.runtime.getValue
24import androidx.compose.ui.Modifier
25import androidx.compose.ui.text.input.ImeAction
26import androidx.compose.ui.text.input.KeyboardType
27import androidx.compose.ui.text.input.PasswordVisualTransformation
28import androidx.compose.foundation.layout.Arrangement
29import androidx.compose.ui.res.stringResource
30import androidx.compose.ui.unit.dp
31import androidx.lifecycle.compose.collectAsStateWithLifecycle
32import androidx.lifecycle.viewmodel.compose.viewModel
33import soy.iko.opencode.di.AppContainer
34import soy.iko.opencode.R
35import soy.iko.opencode.ui.vmFactory
37@OptIn(ExperimentalMaterial3Api::class)
38@Composable
39fun ServerEditScreen(
40 container: AppContainer,
41 profileId: String?,
42 onDone: () -> Unit,
43) {
44 val vm: ServerEditViewModel =
45 viewModel(factory = vmFactory { ServerEditViewModel(container, profileId) })
46 val state by vm.state.collectAsStateWithLifecycle()
48 Scaffold(
49 topBar = {
50 TopAppBar(
51 title = { Text(if (state.isNew) stringResource(R.string.add_server) else stringResource(R.string.edit_server)) },
52 navigationIcon = {
53 IconButton(onClick = onDone) {
54 Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(R.string.back))
55 }
56 },
57 )
58 },
59 ) { padding ->
60 Column(
61 modifier = Modifier
62 .padding(padding)
63 .imePadding()
64 .widthIn(max = 600.dp)
65 .padding(16.dp)
66 .verticalScroll(rememberScrollState()),
67 verticalArrangement = Arrangement.spacedBy(12.dp),
68 ) {
69 OutlinedTextField(
70 value = state.label,
71 onValueChange = { v -> vm.update { it.copy(label = v) } },
72 label = { Text(stringResource(R.string.label_optional)) },
73 singleLine = true,
74 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
75 modifier = Modifier.fillMaxWidth(),
76 )
77 OutlinedTextField(
78 value = state.baseUrl,
79 onValueChange = { v -> vm.update { it.copy(baseUrl = v) } },
80 label = { Text(stringResource(R.string.base_url)) },
81 placeholder = { Text(stringResource(R.string.base_url_hint)) },
82 singleLine = true,
83 keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri, imeAction = ImeAction.Next),
84 modifier = Modifier.fillMaxWidth(),
85 )
86 Text(
87 stringResource(R.string.auth_help),
88 style = androidx.compose.material3.MaterialTheme.typography.bodySmall,
89 )
90 OutlinedTextField(
91 value = state.username,
92 onValueChange = { v -> vm.update { it.copy(username = v) } },
93 label = { Text(stringResource(R.string.username_optional)) },
94 singleLine = true,
95 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
96 modifier = Modifier.fillMaxWidth(),
97 )
98 OutlinedTextField(
99 value = state.password,
100 onValueChange = { v -> vm.update { it.copy(password = v) } },
101 label = { Text(stringResource(R.string.password_optional)) },
102 singleLine = true,
103 visualTransformation = PasswordVisualTransformation(),
104 keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password, imeAction = ImeAction.Done),
105 keyboardActions = KeyboardActions(onDone = { if (state.canSave) vm.save(onDone) }),
106 modifier = Modifier.fillMaxWidth(),
107 )
108 Button(
109 onClick = { vm.save(onDone) },
110 enabled = state.canSave,
111 modifier = Modifier.fillMaxWidth(),
112 ) {
113 Text(stringResource(R.string.save))
114 }
115 }
116 }