v2.47 — Cloud-Verbindung beim App-Start + Live-Status-Anzeige (Verbinde→Verbunden)

## CloudService
- CloudStatus-Enum (verbinde/verbunden/fehler), CloudService extends ChangeNotifier
- verbinde(): Login+Status beim App-Start, setzt Status, notifyListeners
- Getter status/statusText/istVerbunden/verbindungGestartet
- Bestehende Methoden behalten — nur status() → statusDaten() umbenannt (Namenskonflikt mit neuem status-Getter)

## Home-Screen
- _cloud.verbinde() in initState (feuern-und-vergessen) — Verbindung steht beim App-Start, nicht erst beim Tab-Öffnen

## Cloud-Screen
- initState verbindet nicht mehr selbst — zeigt Service-Status via ListenableBuilder
- Status wechselt live: 'Verbinde...' (gelb) → 'Verbunden' (grün) / 'Keine Verbindung' (rot)
- Serverdaten (Playlists/Favoriten/Zähler) laden automatisch, sobald Service verbunden
- Refresh-Button re-verbindet + lädt Zähler neu
- Fallback: ungestarteter Service (Einstellungen-Screen) wird beim Öffnen gestartet
This commit is contained in:
Dustin
2026-08-03 03:08:45 +02:00
parent 20ef788178
commit 319b765d08
4 changed files with 169 additions and 83 deletions
+55 -2
View File
@@ -1,10 +1,14 @@
import 'dart:convert';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import '../config/app_config.dart';
import '../services/auth_service.dart';
import '../services/melo_logger.dart';
/// Verbindungsstatus der Cloud
enum CloudStatus { verbinde, verbunden, fehler }
/// Cloud-Sync Service für Melo Registry (v3 — vollständiges Sync-System)
/// Authentifizierung via Baka-Auth JWT-Token
///
@@ -16,11 +20,59 @@ import '../services/melo_logger.dart';
/// 3. Lokale Änderungen werden danach per `syncAll()` hochgeladen.
/// Merge-Strategie wird NICHT unterstützt (kein 3-Way-Merge) — es gewinnt immer
/// der jüngste Timestamp.
class CloudService {
class CloudService extends ChangeNotifier {
static final http.Client _client = http.Client();
static String get _base => AppConfig.cloudUrl;
CloudStatus _status = CloudStatus.verbinde;
bool _verbindungGestartet = false;
/// Aktueller Verbindungsstatus der Cloud
CloudStatus get status => _status;
/// Ob die Cloud-Verbindung steht
bool get istVerbunden => _status == CloudStatus.verbunden;
/// Ob bereits ein Verbindungsversuch gestartet wurde (auch wenn er läuft)
bool get verbindungGestartet => _verbindungGestartet;
/// Anzeigetext für den Verbindungsstatus
String get statusText {
switch (_status) {
case CloudStatus.verbinde:
return 'Verbinde...';
case CloudStatus.verbunden:
return 'Verbunden';
case CloudStatus.fehler:
return 'Keine Verbindung';
}
}
/// Stellt die Cloud-Verbindung her (Login + Status-Check) und benachrichtigt
/// Listener über den neuen Status. Wird beim App-Start aufgerufen
/// (feuern-und-vergessen — blockiert nicht).
Future<void> verbinde() async {
_verbindungGestartet = true;
final user = AuthService().benutzer;
_status = CloudStatus.verbinde;
notifyListeners();
if (user.isEmpty) {
_status = CloudStatus.fehler;
notifyListeners();
return;
}
final ok = await login(user);
if (!ok) {
_status = CloudStatus.fehler;
notifyListeners();
return;
}
final st = await statusDaten();
_status = st != null ? CloudStatus.verbunden : CloudStatus.fehler;
notifyListeners();
}
/// Login mit Baka-Auth Token wird aus AuthService bezogen
Future<bool> login(String user) async {
try {
@@ -48,7 +100,8 @@ class CloudService {
'Content-Type': 'application/json',
};
Future<Map?> status() => _get('/api/v1/cloud/status');
/// Server-Status abrufen (Song-Zähler etc.)
Future<Map?> statusDaten() => _get('/api/v1/cloud/status');
Future<Map?> syncStatus() => _get('/api/v1/cloud/sync-status');