Feature: Login-Effekte pro Person (Akzentfarbe + Sound + Begruessung)

- UserEffekt: Baka = rot + Fanfare, Tinker = tuerkis + Chime, Standard-Ping
- MeloTheme: dynamische Akzentfarbe via ValueNotifier (Theme wechselt live)
- Ausloeser: App-Start (wenn Token vorhanden) + nach erfolgreichem Login
- Assets: 3 kurze WAV-Sounds (assets/sounds/)
- Web: /whoami-Endpoint (Caddy) + Willkommens-Banner auf baka-net.de
This commit is contained in:
Hermes (Server)
2026-07-31 15:34:04 +02:00
parent 9a880b0f21
commit 19e4aac62e
8 changed files with 113 additions and 14 deletions
+18 -1
View File
@@ -6,6 +6,8 @@ import '../viewmodels/melo_home_viewmodel.dart';
import '../models/song.dart';
import '../models/playlist.dart';
import '../utils/farb_theme.dart';
import '../utils/user_effekte.dart';
import '../services/cloud_service.dart';
import '../widgets/mini_player.dart';
import '../widgets/melo_header.dart';
import '../widgets/statistik_card.dart';
@@ -18,7 +20,6 @@ import 'cloud_screen.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:permission_handler/permission_handler.dart';
import '../widgets/cloud_einstellungen.dart';
import '../services/cloud_service.dart';
import '../config/app_config.dart';
class MeloHome extends StatefulWidget {
@@ -50,6 +51,15 @@ class _MeloHomeState extends State<MeloHome> {
setState(() => _nutzer = n);
_vm.setzeNutzer(n);
}
// Login-Effekt beim App-Start: nur wenn ein Token vorhanden ist (eingeloggt)
final ok = await CloudService().restoreLogin();
if (ok && mounted) {
UserEffekt.anwenden(_nutzer);
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(UserEffekt.fuer(_nutzer).begruessung),
duration: const Duration(seconds: 3),
));
}
}
void _zeigeProfil() {
@@ -153,6 +163,13 @@ class _MeloHomeState extends State<MeloHome> {
await p.setString('melo_nutzer', name);
if (mounted) setState(() => _nutzer = name);
_vm.setzeNutzer(name);
// Login-Effekt: Akzentfarbe + Sound + Begrüßung pro Person
UserEffekt.anwenden(name);
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(UserEffekt.fuer(name).begruessung),
duration: const Duration(seconds: 3)));
}
} else {
if (mounted) {
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(