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)
40 container: AppContainer,
44 val vm: ServerEditViewModel =
45 viewModel(factory = vmFactory { ServerEditViewModel(container, profileId) })
46 val state by vm.state.collectAsStateWithLifecycle()
51 title = { Text(if (state.isNew) stringResource(R.string.add_server) else stringResource(R.string.edit_server)) },
53 IconButton(onClick = onDone) {
54 Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = stringResource(R.string.back))
64 .widthIn(max = 600.dp)
66 .verticalScroll(rememberScrollState()),
67 verticalArrangement = Arrangement.spacedBy(12.dp),
71 onValueChange = { v -> vm.update { it.copy(label = v) } },
72 label = { Text(stringResource(R.string.label_optional)) },
74 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
75 modifier = Modifier.fillMaxWidth(),
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)) },
83 keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Uri, imeAction = ImeAction.Next),
84 modifier = Modifier.fillMaxWidth(),
87 stringResource(R.string.auth_help),
88 style = androidx.compose.material3.MaterialTheme.typography.bodySmall,
91 value = state.username,
92 onValueChange = { v -> vm.update { it.copy(username = v) } },
93 label = { Text(stringResource(R.string.username_optional)) },
95 keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
96 modifier = Modifier.fillMaxWidth(),
99 value = state.password,
100 onValueChange = { v -> vm.update { it.copy(password = v) } },
101 label = { Text(stringResource(R.string.password_optional)) },
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(),
109 onClick = { vm.save(onDone) },
110 enabled = state.canSave,
111 modifier = Modifier.fillMaxWidth(),
113 Text(stringResource(R.string.save))
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list