Feature: Login freiwillig - einmalige Modus-Wahl beim ersten Start

- Erster Start: Dialog 'Cloud (empfohlen)' oder 'Nur lokal' -> wird gespeichert
- Cloud gewaehlt: direkt Login-Dialog (Name + Passwort)
- Lokal gewaehlt: App nutzt nur lokale Musik, kein Login noetig
- Spaeter jederzeit im Cloud-Tab einloggbar
This commit is contained in:
Hermes (Server)
2026-07-31 15:35:34 +02:00
parent 19e4aac62e
commit f9b6e57606
+41
View File
@@ -51,6 +51,11 @@ class _MeloHomeState extends State<MeloHome> {
setState(() => _nutzer = n); setState(() => _nutzer = n);
_vm.setzeNutzer(n); _vm.setzeNutzer(n);
} }
// Erster Start? → einmalig Modus wählen (Cloud oder nur lokal) Login ist freiwillig
if (!p.containsKey('melo_modus')) {
await _zeigeModusWahl();
return;
}
// Login-Effekt beim App-Start: nur wenn ein Token vorhanden ist (eingeloggt) // Login-Effekt beim App-Start: nur wenn ein Token vorhanden ist (eingeloggt)
final ok = await CloudService().restoreLogin(); final ok = await CloudService().restoreLogin();
if (ok && mounted) { if (ok && mounted) {
@@ -62,6 +67,42 @@ class _MeloHomeState extends State<MeloHome> {
} }
} }
/// Einmalige Auswahl beim ersten App-Start: Cloud-Sync oder nur lokal.
Future<void> _zeigeModusWahl() async {
if (!mounted) return;
final cloud = await showDialog<bool>(
context: context,
barrierDismissible: false,
builder: (ctx) => AlertDialog(
backgroundColor: MeloTheme.dunkel1,
title: const Text('👋 Willkommen bei Melo!',
style: TextStyle(color: Colors.white, fontSize: 16)),
content: const Text(
'Wie möchtest du Melo nutzen?',
style: TextStyle(color: Colors.white, fontSize: 14),
),
actions: [
TextButton(
onPressed: () => Navigator.pop(ctx, false),
child: const Text('📱 Nur lokal',
style: TextStyle(color: Colors.white)),
),
TextButton(
onPressed: () => Navigator.pop(ctx, true),
child: const Text('☁️ Cloud (empfohlen)',
style: TextStyle(color: MeloTheme.rot, fontWeight: FontWeight.bold)),
),
],
),
);
final p = await SharedPreferences.getInstance();
await p.setString('melo_modus', cloud == true ? 'cloud' : 'lokal');
// Cloud gewählt → direkt zum Login-Dialog (Name + Passwort)
if (cloud == true && mounted) {
_nutzerWechseln();
}
}
void _zeigeProfil() { void _zeigeProfil() {
showDialog( showDialog(
context: context, context: context,