83 lines
2.6 KiB
Dart
83 lines
2.6 KiB
Dart
import 'dart:async';
|
||
import 'package:flutter/material.dart';
|
||
import 'package:just_audio/just_audio.dart';
|
||
import 'package:shared_preferences/shared_preferences.dart';
|
||
import 'farb_theme.dart';
|
||
|
||
/// Login-Effekte: Pro Person eigener Akzent, Willkommens-Sound und Begrüßung.
|
||
/// Wird nach erfolgreichem Login und beim App-Start (wenn Token vorhanden) ausgelöst.
|
||
class UserEffekt {
|
||
final Color akzent;
|
||
final String begruessung;
|
||
final String soundAsset;
|
||
|
||
const UserEffekt(this.akzent, this.begruessung, this.soundAsset);
|
||
|
||
/// Baka = königlich-rot + Fanfare 👑
|
||
static const baka = UserEffekt(
|
||
Color(0xFFCC0000),
|
||
'Willkommen zurück, Baka! 👑',
|
||
'assets/sounds/baka_fanfare.wav',
|
||
);
|
||
|
||
/// Tinker = türkis + heller Chime 🐱
|
||
static const tinker = UserEffekt(
|
||
Color(0xFF00B8A9),
|
||
'Tinker ist da! 🐱✨',
|
||
'assets/sounds/tinker_chime.wav',
|
||
);
|
||
|
||
static const standard = UserEffekt(
|
||
Color(0xFFCC0000),
|
||
'Willkommen! 🎵',
|
||
'assets/sounds/willkommen_ping.wav',
|
||
);
|
||
|
||
static UserEffekt fuer(String? user) {
|
||
final u = (user ?? '').toLowerCase().trim();
|
||
if (u == 'baka' || u == 'dustin') return baka;
|
||
if (u == 'tinker') return tinker;
|
||
return standard;
|
||
}
|
||
|
||
/// Key der per-User-Akzentfarbe in den SharedPreferences.
|
||
static String akzentKey(String? user) =>
|
||
'akzent_farbe_${(user ?? '').toLowerCase().trim()}';
|
||
|
||
/// '#RRGGBB' (oder 'RRGGBB') → Color; null bei ungültigem Format.
|
||
static Color? farbeAusHex(String? hex) {
|
||
if (hex == null) return null;
|
||
final h = hex.replaceFirst('#', '').trim();
|
||
if (h.length != 6) return null;
|
||
final v = int.tryParse(h, radix: 16);
|
||
if (v == null) return null;
|
||
return Color(0xFF000000 | v);
|
||
}
|
||
|
||
/// Setzt die Akzentfarbe (Thema wechselt live) und spielt den Sound ab.
|
||
/// Die in den Einstellungen gespeicherte Akzentfarbe
|
||
/// (`akzent_farbe_<user>`, F4) hat Vorrang vor der Standard-Farbe des Users.
|
||
static Future<void> anwenden(String? user) async {
|
||
var farbe = fuer(user).akzent;
|
||
try {
|
||
final p = await SharedPreferences.getInstance();
|
||
farbe = farbeAusHex(p.getString(akzentKey(user))) ?? farbe;
|
||
} catch (_) {
|
||
// Prefs-Fehler ignorieren — Standard-Akzent bleibt
|
||
}
|
||
MeloTheme.akzent = farbe;
|
||
try {
|
||
final p = AudioPlayer();
|
||
await p.setAsset(fuer(user).soundAsset);
|
||
unawaited(p.play());
|
||
// Player nach dem Abspielen sauber freigeben (kein Memory-Leak)
|
||
Future.delayed(const Duration(seconds: 4), () {
|
||
if (p.playing) p.stop();
|
||
p.dispose();
|
||
});
|
||
} catch (_) {
|
||
// Sound-Fehler ignorieren – Akzent bleibt trotzdem aktiv
|
||
}
|
||
}
|
||
}
|