feat(ui): Online-Dienste-Banner + bollwerk.online in Settings #132

Open
opened 2026-05-19 19:44:06 +00:00 by jreinemann-euris · 0 comments
jreinemann-euris commented 2026-05-19 19:44:06 +00:00 (Migrated from github.com)

Motivation

Nutzer öffnen die Seiten Nachrichten und Ressourcen, ohne einen Server-Account zu haben. Derzeit gibt es keinen Hinweis, dass diese Features eine Server-Anmeldung benötigen. Gleichzeitig soll der Abschnitt „Server-Synchronisierung" in den Einstellungen auf bollwerk.online umbenannt werden – und die Server-URL-Eingabe aus der UI entfernt werden, da der Server immer https://bollwerk.online ist.


Scope

Drei Teilaufgaben in einem Feature-Ticket:

  1. Online-Dienste-Banner auf Nachrichten- und Ressourcen-Screen
  2. Umbenennung „Server-Synchronisierung" → „bollwerk.online" in den Einstellungen
  3. Server-URL-Feld auskommentieren (UI weg, Implementierung bleibt)

Acceptance Criteria

1 · Banner auf Nachrichten + Ressourcen

  • Wenn isLoggedIn == false, zeigt UserListScreen einen Info-Banner:
    • Text: „Online Dienste nicht vorhanden ohne Server Anmeldung"
    • Button: „Zu den Einstellungen" → navigiert zu Screen.Settings
  • Gleicher Banner auf ResourceListScreen (mit identischem Text + Button)
  • Banner ist nicht sichtbar wenn der User eingeloggt ist
  • Navigation zu Settings erfolgt über den onNavigateToSettings: () -> Unit Parameter, der in MainScreen auf navController.navigate(Screen.Settings) gemappt wird

2 · Umbenennung in SettingsScreen

  • Abschnittstitel Text("Server-Synchronisierung")Text("bollwerk.online")

3 · Server-URL-Feld auskommentieren

  • Das OutlinedTextField für die Server-URL (uiState.serverUrl) und der zugehörige Reset-TextButton werden in der UI auskommentiert (Kotlin-Kommentar /* ... */)
  • Die onServerUrlChanged- und resetServerUrl-Methoden im ViewModel bleiben erhalten (nur UI-Zeilen auskommentieren)
  • Ein einzeiliger Kommentar erklärt warum: // Server-URL ist fest bollwerk.online – Änderung durch User deaktiviert

Implementation Notes

isLoggedIn in Nachrichten/Ressourcen-ViewModels

  • UserListViewModel und ResourceListViewModel existieren bereits. Dort jeweils ein isLoggedIn: StateFlow<Boolean> ergänzen, das SettingsRepository.observeString(StringKey.AuthAccessToken).map { it.isNotBlank() } beobachtet.
  • Alternativ: direkt als State in den Screens via eigenem ViewModel oder über einen shared AuthViewModel – einfachste Variante ist direkt im jeweiligen Screen-ViewModel.

Navigation-Callback

// ResourceListScreen.kt / UserListScreen.kt – Signatur erweitern:
@Composable
internal fun ResourceListScreen(
    onResourceClick: (String) -> Unit,
    onNavigateToSettings: () -> Unit,   // NEU
    viewModel: ResourceListViewModel = hiltViewModel()
)

In MainScreen.kt den Callback verdrahten:

composable<Screen.Resources> {
    ResourceListScreen(
        onResourceClick = { ... },
        onNavigateToSettings = { navController.navigate(Screen.Settings) }
    )
}

Banner-Composable (Vorschlag)

if (!isLoggedIn) {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp),
        colors = CardDefaults.cardColors(
            containerColor = MaterialTheme.colorScheme.surfaceVariant
        )
    ) {
        Column(
            modifier = Modifier.padding(16.dp),
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Text(
                text = "Online Dienste nicht vorhanden ohne Server Anmeldung",
                style = MaterialTheme.typography.bodyMedium,
                textAlign = TextAlign.Center
            )
            Spacer(modifier = Modifier.height(8.dp))
            Button(onClick = onNavigateToSettings) {
                Text("Zu den Einstellungen")
            }
        }
    }
}

Dateien

Datei Änderung
UserListScreen.kt Banner + onNavigateToSettings-Parameter
UserListViewModel.kt isLoggedIn: StateFlow<Boolean> ergänzen
ResourceListScreen.kt Banner + onNavigateToSettings-Parameter
ResourceListViewModel.kt isLoggedIn: StateFlow<Boolean> ergänzen
SettingsScreen.kt Umbenennung + Server-URL-Feld auskommentieren
MainScreen.kt onNavigateToSettings-Callbacks verdrahten
## Motivation Nutzer öffnen die Seiten **Nachrichten** und **Ressourcen**, ohne einen Server-Account zu haben. Derzeit gibt es keinen Hinweis, dass diese Features eine Server-Anmeldung benötigen. Gleichzeitig soll der Abschnitt „Server-Synchronisierung" in den Einstellungen auf **bollwerk.online** umbenannt werden – und die Server-URL-Eingabe aus der UI entfernt werden, da der Server immer `https://bollwerk.online` ist. --- ## Scope Drei Teilaufgaben in einem Feature-Ticket: 1. **Online-Dienste-Banner** auf Nachrichten- und Ressourcen-Screen 2. **Umbenennung** „Server-Synchronisierung" → „bollwerk.online" in den Einstellungen 3. **Server-URL-Feld auskommentieren** (UI weg, Implementierung bleibt) --- ## Acceptance Criteria ### 1 · Banner auf Nachrichten + Ressourcen - [ ] Wenn `isLoggedIn == false`, zeigt **UserListScreen** einen Info-Banner: - Text: „Online Dienste nicht vorhanden ohne Server Anmeldung" - Button: „Zu den Einstellungen" → navigiert zu `Screen.Settings` - [ ] Gleicher Banner auf **ResourceListScreen** (mit identischem Text + Button) - [ ] Banner ist **nicht** sichtbar wenn der User eingeloggt ist - [ ] Navigation zu Settings erfolgt über den `onNavigateToSettings: () -> Unit` Parameter, der in `MainScreen` auf `navController.navigate(Screen.Settings)` gemappt wird ### 2 · Umbenennung in SettingsScreen - [ ] Abschnittstitel `Text("Server-Synchronisierung")` → `Text("bollwerk.online")` ### 3 · Server-URL-Feld auskommentieren - [ ] Das `OutlinedTextField` für die Server-URL (`uiState.serverUrl`) und der zugehörige Reset-`TextButton` werden **in der UI auskommentiert** (Kotlin-Kommentar `/* ... */`) - [ ] Die `onServerUrlChanged`- und `resetServerUrl`-Methoden im ViewModel **bleiben erhalten** (nur UI-Zeilen auskommentieren) - [ ] Ein einzeiliger Kommentar erklärt warum: `// Server-URL ist fest bollwerk.online – Änderung durch User deaktiviert` --- ## Implementation Notes ### isLoggedIn in Nachrichten/Ressourcen-ViewModels - `UserListViewModel` und `ResourceListViewModel` existieren bereits. Dort jeweils ein `isLoggedIn: StateFlow<Boolean>` ergänzen, das `SettingsRepository.observeString(StringKey.AuthAccessToken).map { it.isNotBlank() }` beobachtet. - Alternativ: direkt als `State` in den Screens via eigenem `ViewModel` oder über einen shared `AuthViewModel` – einfachste Variante ist direkt im jeweiligen Screen-ViewModel. ### Navigation-Callback ```kotlin // ResourceListScreen.kt / UserListScreen.kt – Signatur erweitern: @Composable internal fun ResourceListScreen( onResourceClick: (String) -> Unit, onNavigateToSettings: () -> Unit, // NEU viewModel: ResourceListViewModel = hiltViewModel() ) ``` In `MainScreen.kt` den Callback verdrahten: ```kotlin composable<Screen.Resources> { ResourceListScreen( onResourceClick = { ... }, onNavigateToSettings = { navController.navigate(Screen.Settings) } ) } ``` ### Banner-Composable (Vorschlag) ```kotlin if (!isLoggedIn) { Card( modifier = Modifier .fillMaxWidth() .padding(16.dp), colors = CardDefaults.cardColors( containerColor = MaterialTheme.colorScheme.surfaceVariant ) ) { Column( modifier = Modifier.padding(16.dp), horizontalAlignment = Alignment.CenterHorizontally ) { Text( text = "Online Dienste nicht vorhanden ohne Server Anmeldung", style = MaterialTheme.typography.bodyMedium, textAlign = TextAlign.Center ) Spacer(modifier = Modifier.height(8.dp)) Button(onClick = onNavigateToSettings) { Text("Zu den Einstellungen") } } } } ``` ### Dateien | Datei | Änderung | |---|---| | `UserListScreen.kt` | Banner + `onNavigateToSettings`-Parameter | | `UserListViewModel.kt` | `isLoggedIn: StateFlow<Boolean>` ergänzen | | `ResourceListScreen.kt` | Banner + `onNavigateToSettings`-Parameter | | `ResourceListViewModel.kt` | `isLoggedIn: StateFlow<Boolean>` ergänzen | | `SettingsScreen.kt` | Umbenennung + Server-URL-Feld auskommentieren | | `MainScreen.kt` | `onNavigateToSettings`-Callbacks verdrahten |
bollwerkadmin added the
status:todo
label 2026-05-19 20:37:20 +00:00
Sign in to join this conversation.
No description provided.