chore: füge Warn-Dialoge für Rollenwechsel und Bearbeitungsmodus hinzu, verbessere Zustandshandhabung im Device-Setup und implementiere Turnierverwaltung im Veranstaltungs-Wizard

Signed-off-by: StefanMoCoAt <stefan.mo.co@gmail.com>
This commit is contained in:
2026-04-20 23:48:49 +02:00
parent 5b8ef5ea2d
commit 7a2c5700f9
6 changed files with 431 additions and 211 deletions
@@ -70,9 +70,6 @@ fun DeviceInitializationScreen(
NetworkRoleSelector(
selectedRole = uiState.settings.networkRole,
onRoleSelected = {
if (uiState.settings.networkRole != it && uiState.settings.deviceName.isNotBlank()) {
// Hier könnte ein Dialog kommen, aber fürs Erste einfach setzen
}
viewModel.setNetworkRole(it)
focusManager.moveFocus(FocusDirection.Next)
},
@@ -80,6 +77,20 @@ fun DeviceInitializationScreen(
enabled = !uiState.isLocked
)
if (uiState.showRoleChangeWarning) {
AlertDialog(
onDismissRequest = { viewModel.dismissRoleChangeWarning() },
title = { Text("Netzwerk-Rolle ändern?") },
text = { Text("Das Ändern der Netzwerk-Rolle kann Ihre bisherigen Eingaben in Schritt 2 beeinflussen. Wollen Sie fortfahren?") },
confirmButton = {
Button(onClick = { viewModel.confirmNetworkRoleChange() }) { Text("Ja, Ändern") }
},
dismissButton = {
TextButton(onClick = { viewModel.dismissRoleChangeWarning() }) { Text("Abbrechen") }
}
)
}
if (!uiState.isLocked) {
Button(
onClick = { viewModel.nextStep() },
@@ -126,8 +137,26 @@ fun DeviceInitializationScreen(
}
if (uiState.isLocked) {
var showUnlockWarning by remember { mutableStateOf(false) }
if (showUnlockWarning) {
AlertDialog(
onDismissRequest = { showUnlockWarning = false },
title = { Text("Konfiguration bearbeiten?") },
text = { Text("Achtung: Änderungen am SharedKey oder der Rolle können die Synchronisation mit anderen Geräten unterbrechen.") },
confirmButton = {
Button(onClick = {
viewModel.unlockConfiguration()
showUnlockWarning = false
}) { Text("Bearbeitungsmodus aktivieren") }
},
dismissButton = {
TextButton(onClick = { showUnlockWarning = false }) { Text("Abbrechen") }
}
)
}
Button(
onClick = { viewModel.unlockConfiguration() },
onClick = { showUnlockWarning = true },
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.secondary
)
@@ -11,5 +11,7 @@ data class DeviceInitializationUiState(
val discoveredMasters: List<DiscoveredService> = emptyList(),
val isProcessing: Boolean = false,
val error: String? = null,
val isLocked: Boolean = false
val isLocked: Boolean = false,
val showRoleChangeWarning: Boolean = false,
val pendingRole: at.mocode.frontend.features.device.initialization.domain.model.NetworkRole? = null
)
@@ -52,8 +52,25 @@ class DeviceInitializationViewModel(
}
fun setNetworkRole(role: NetworkRole) {
println("[DeviceInit] Netzwerk-Rolle gesetzt: $role")
updateSettings { it.copy(networkRole = role) }
if (uiState.value.settings.deviceName.isNotBlank() || uiState.value.settings.sharedKey.isNotBlank()) {
_uiState.update { it.copy(showRoleChangeWarning = true, pendingRole = role) }
} else {
println("[DeviceInit] Netzwerk-Rolle direkt gesetzt: $role")
updateSettings { it.copy(networkRole = role) }
}
}
fun confirmNetworkRoleChange() {
val role = uiState.value.pendingRole
println("[DeviceInit] Rollenwechsel bestätigt: $role")
if (role != null) {
updateSettings { it.copy(networkRole = role) }
}
_uiState.update { it.copy(showRoleChangeWarning = false, pendingRole = null) }
}
fun dismissRoleChangeWarning() {
_uiState.update { it.copy(showRoleChangeWarning = false, pendingRole = null) }
}
fun addExpectedClient(name: String, role: NetworkRole) {