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:
@@ -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');
|
||||
|
||||
|
||||
Reference in New Issue
Block a user