diff --git a/lib/main.dart b/lib/main.dart index 7731c8e..18246fb 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -13,6 +13,7 @@ import 'services/melo_logger.dart'; import 'services/audio_handler.dart'; import 'services/musik_scanner.dart'; import 'services/sync_service.dart'; +import 'services/navidrome_service.dart'; import 'utils/farb_theme.dart'; import 'utils/user_effekte.dart'; import 'screens/home_screen.dart'; @@ -124,8 +125,8 @@ void main() async { MeloLogger().fehler('App-Start', e, stack); } - // Auth initialisieren (Token aus SharedPreferences laden + online validieren) - await AuthService().initialisieren(); + // Navidrome-Credentials laden (nicht mehr Baka-Auth — Server gelöscht) + // Die App zeigt LoginScreen, wenn keine Credentials existieren // Favoriten-Toggle → Server-Push (Feuer-und-Vergessen, deterministisch via // `set` statt Toggle — verhindert Doppel-Toggle). Songs ohne cloud_id @@ -206,10 +207,23 @@ class MeloApp extends StatefulWidget { } class _MeloAppState extends State { + late Future _checkNavidromeCredentials; + + @override + void initState() { + super.initState(); + // Prüfe, ob Navidrome-Credentials gespeichert sind + _checkNavidromeCredentials = _hasNavidromeLogin(); + } + + Future _hasNavidromeLogin() async { + final nav = NavidromeService(); + await nav.ladeGespeicherteZugangsdaten(); + return nav.istVerbunden; + } + @override Widget build(BuildContext context) { - final auth = AuthService(); - // ValueListenableBuilder: Akzentfarbe (per User, in Einstellungen wählbar) // wechselt das komplette Theme live — kein App-Neustart nötig. return ValueListenableBuilder( @@ -218,9 +232,22 @@ class _MeloAppState extends State { title: 'Melo', debugShowCheckedModeBanner: false, theme: MeloTheme.theme, - home: auth.istEingeloggt - ? const Scaffold(body: MeloHome()) - : const LoginScreen(), + home: FutureBuilder( + future: _checkNavidromeCredentials, + builder: (context, snapshot) { + if (snapshot.connectionState != ConnectionState.done) { + return const Scaffold( + backgroundColor: MeloTheme.schwarz, + body: Center( + child: CircularProgressIndicator(color: MeloTheme.rot), + ), + ); + } + return Scaffold( + body: snapshot.data == true ? const MeloHome() : const LoginScreen(), + ); + }, + ), ), ); } diff --git a/lib/screens/login_screen.dart b/lib/screens/login_screen.dart index 22f6125..3be5c36 100644 --- a/lib/screens/login_screen.dart +++ b/lib/screens/login_screen.dart @@ -65,17 +65,18 @@ class _LoginScreenState extends State } setState(() => _ladt = true); - _setzeStatus('Verbinde mit Baka-Auth...'); + _setzeStatus('Verbinde mit Navidrome...'); - final result = await _auth.login(user, pass); + final nav = NavidromeService(); + nav.setCredentials(AppConfig.navidromeUrl, user, pass); + final ok = await nav.ping(); if (!mounted) return; - if (result.erfolg) { + if (ok) { _setzeStatus('✅ Login erfolgreich!', ok: true); await UserEffekt.anwenden(user); - await NavidromeService().speichereZugangsdaten( - AppConfig.navidromeUrl, user, pass); + await nav.speichereZugangsdaten(AppConfig.navidromeUrl, user, pass); await Future.delayed(const Duration(milliseconds: 600)); if (mounted) { Navigator.of(context).pushReplacement( @@ -83,7 +84,7 @@ class _LoginScreenState extends State ); } } else { - _setzeStatus('❌ ${result.fehler ?? "Login fehlgeschlagen"}'); + _setzeStatus('❌ Keine Verbindung zum Musikserver'); setState(() => _ladt = false); } } @@ -146,7 +147,7 @@ class _LoginScreenState extends State ), const SizedBox(height: 4), const Text( - 'Mit deinem Baka-Account', + 'Mit deinem Navidrome-Account', style: TextStyle(color: MeloTheme.textSekundaer, fontSize: 13), ), const SizedBox(height: 24),