import 'package:flutter/material.dart'; import '../services/navidrome_service.dart'; import 'theme.dart'; /// Herz für einen Titel, der nur am Server liegt. /// /// Solche Titel haben keine Zeile in der Bibliothek und damit keine UUID — /// das gewöhnliche [FavoriteButton] muss sie deshalb ablehnen. Der Server /// führt aber eine eigene Favoritenliste (`star`/`unstar`), und die ist /// genau der richtige Ort dafür: von dort holt sie auch der /// Favoriten-Abgleich in den Einstellungen. /// /// Der Zustand wird bewusst nur lokal gehalten und nicht vom Server /// nachgeladen: für ein einzelnes Herz wäre eine eigene Abfrage bei jedem /// Titelwechsel zu teuer, und die Antwort träfe ohnehin erst nach dem /// nächsten Tippen ein. class ServerFavoriteButton extends StatefulWidget { const ServerFavoriteButton({ super.key, required this.navidromeId, required this.navidrome, }); final String navidromeId; final NavidromeService navidrome; @override State createState() => _ServerFavoriteButtonState(); } class _ServerFavoriteButtonState extends State { bool? _favorit; bool _laeuft = false; Future _umschalten() async { if (_laeuft) return; final neu = !(_favorit ?? false); setState(() => _laeuft = true); final messenger = ScaffoldMessenger.of(context); final ok = neu ? await widget.navidrome.setFavorite(widget.navidromeId) : await widget.navidrome.removeFavorite(widget.navidromeId); if (!mounted) return; setState(() { _laeuft = false; // Nur bei Erfolg umschalten — sonst zeigte das Herz einen Zustand, den // der Server nicht kennt. if (ok) _favorit = neu; }); if (!ok) { messenger.showSnackBar( const SnackBar(content: Text('Der Server hat es nicht übernommen')), ); } } @override Widget build(BuildContext context) { final favorit = _favorit ?? false; return IconButton( tooltip: favorit ? 'Favorit am Server entfernen' : 'Am Server zu Favoriten hinzufügen', icon: Icon( favorit ? Icons.favorite : Icons.favorite_border, color: favorit ? MeloTheme.red : MeloTheme.text2, ), onPressed: _laeuft ? null : _umschalten, ); } }