chore: implementiere Auth-Status-abhängige Navigation und Icons, deaktiviere Module ohne Initialisierung und passe NavRail sowie Header für besseren UX an

Signed-off-by: StefanMoCoAt <stefan.mo.co@gmail.com>
This commit is contained in:
2026-04-20 14:23:44 +02:00
parent a1bf93342e
commit 8806d11e3c
4 changed files with 112 additions and 45 deletions
@@ -72,33 +72,26 @@ actual fun DeviceInitializationConfig(
isError = settings.sharedKey.isNotEmpty() && !DeviceInitializationValidator.isKeyValid(settings.sharedKey),
errorMessage = "Mindestens ${DeviceInitializationValidator.MIN_KEY_LENGTH} Zeichen erforderlich.",
visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
imeAction = if (settings.networkRole == NetworkRole.MASTER) ImeAction.Next else ImeAction.Done,
imeAction = ImeAction.Next,
keyboardActions = KeyboardActions(
onNext = { focusManager.moveFocus(FocusDirection.Next) },
onDone = {
if (DeviceInitializationValidator.canContinue(settings)) {
viewModel.completeInitialization()
} else {
focusManager.clearFocus()
}
}
onNext = { focusManager.moveFocus(FocusDirection.Next) }
),
modifier = Modifier.focusRequester(sharedKeyFocus),
trailingIcon = if (passwordVisible) Icons.Outlined.VisibilityOff else Icons.Outlined.Visibility,
onTrailingIconClick = { passwordVisible = !passwordVisible }
)
if (settings.networkRole == NetworkRole.MASTER) {
MsFilePicker(
label = "Backup-Verzeichnis (Pfad)",
selectedPath = settings.backupPath,
onFileSelected = { selectedPath ->
viewModel.updateSettings { s -> s.copy(backupPath = selectedPath) }
},
directoryOnly = true,
modifier = Modifier.focusRequester(backupPathFocus)
)
MsFilePicker(
label = "Backup-Verzeichnis (Pfad)",
selectedPath = settings.backupPath,
onFileSelected = { selectedPath ->
viewModel.updateSettings { s -> s.copy(backupPath = selectedPath) }
},
directoryOnly = true,
modifier = Modifier.focusRequester(backupPathFocus)
)
if (settings.networkRole == NetworkRole.MASTER) {
Text("Sync-Intervall: ${settings.syncInterval} Min.", style = MaterialTheme.typography.labelMedium)
Slider(
value = settings.syncInterval.toFloat(),
@@ -106,7 +99,19 @@ actual fun DeviceInitializationConfig(
valueRange = 1f..60f,
steps = 59
)
} else {
// Button zum Abschließen für Clients, da diese keinen Slider/Clients haben
Spacer(Modifier.height(8.dp))
Button(
onClick = { viewModel.completeInitialization() },
modifier = Modifier.fillMaxWidth(),
enabled = DeviceInitializationValidator.canContinue(settings)
) {
Text("Konfiguration abschließen")
}
}
if (settings.networkRole == NetworkRole.MASTER) {
HorizontalDivider(Modifier, DividerDefaults.Thickness, DividerDefaults.color)
Text("👥 Erwartete Clients", style = MaterialTheme.typography.titleSmall)