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
+22 -7
View File
@@ -1,7 +1,9 @@
import 'package:flutter/material.dart';
import 'package:audio_service/audio_service.dart';
import 'database/db_helper.dart';
import 'services/favoriten_service.dart';
import 'services/melo_logger.dart';
import 'services/audio_handler.dart';
import 'utils/farb_theme.dart';
import 'screens/home_screen.dart';
@@ -9,12 +11,21 @@ void main() async {
WidgetsFlutterBinding.ensureInitialized();
// Logger startet sofort zeichnet ALLES auf
MeloLogger().init('2.7');
MeloLogger().init('2.38');
try {
await DbHelper().db;
await FavoritenService().init();
MeloLogger().zustand('start_ok', {'db': 'ok'});
// Hintergrund-Audio-Service starten
await AudioService.init(
builder: () => MeloAudioHandler(),
config: const AudioServiceConfig(
androidNotificationChannelId: 'de.baka.melo.audio',
androidNotificationChannelName: 'Melo Wiedergabe',
androidNotificationOngoing: true,
),
);
MeloLogger().zustand('start_ok', {'db': 'ok', 'audio': 'ok'});
} catch (e, stack) {
MeloLogger().fehler('App-Start', e, stack);
}
@@ -27,11 +38,15 @@ class MeloApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Melo',
debugShowCheckedModeBanner: false,
theme: MeloTheme.theme,
home: const Scaffold(body: MeloHome()),
// Reagiert live auf Akzent-Änderungen (Login-Effekt pro Person)
return ValueListenableBuilder<Color>(
valueListenable: MeloTheme.akzentNotifier,
builder: (context, akzent, _) => MaterialApp(
title: 'Melo',
debugShowCheckedModeBanner: false,
theme: MeloTheme.theme,
home: const Scaffold(body: MeloHome()),
),
);
}
}