v2.31 — Login, Einstellungen & Cloud Sync Redesign
- Login-Screen im Melo-Design (Schwarz+Rot) mit Baka-Auth JWT
- AuthService fuer Token-Management ueber baka-net.de/auth
- Registrierungs-Modus + 'Ohne Login fortfahren'
- Navidrome-Credentials optional im Login aufklappbar
- SettingsScreen ersetzt AlertDialog
- BottomNav navigiert statt Dialog zu triggern
- Cloud Sync, Server verbinden, Diagnosedaten, App-Info, Abmelden
- CloudEinstellungen-Dialog entfernt, alles in CloudScreen konsolidiert
- Hardcode login('Baka','') entfernt → AuthService.benutzer
- Gradient-Statuskarte, animierte Segment-Intervall-Auswahl
- JWT Authorization statt Klartext-Passwort
- AppConfig: API-Key defaultValue entfernt (kein Fallback-Leak)
- Build crasht ohne --dart-define MELO_API_KEY
Build: split APK (arm64 19.6M, armeabi 17.1M, x86_64 21.1M)
This commit is contained in:
@@ -12,7 +12,6 @@ class SongTile extends StatelessWidget {
|
||||
final ValueChanged<Song> onPlay;
|
||||
final VoidCallback onMetadataChanged;
|
||||
final ValueChanged<Song>? onAddToPlaylist;
|
||||
final ValueChanged<Song>? onDelete;
|
||||
|
||||
const SongTile({
|
||||
super.key,
|
||||
@@ -22,7 +21,6 @@ class SongTile extends StatelessWidget {
|
||||
required this.onPlay,
|
||||
required this.onMetadataChanged,
|
||||
this.onAddToPlaylist,
|
||||
this.onDelete,
|
||||
});
|
||||
|
||||
@override
|
||||
@@ -64,19 +62,14 @@ class SongTile extends StatelessWidget {
|
||||
),
|
||||
InkWell(
|
||||
borderRadius: BorderRadius.circular(50),
|
||||
onTap: () {
|
||||
// Guard gegen null-ID (defensive)
|
||||
final id = song.id;
|
||||
if (id == null) return;
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (_) => TagAuswahlDialog(
|
||||
songId: id,
|
||||
songTitel: song.titel,
|
||||
onChanged: onMetadataChanged,
|
||||
),
|
||||
);
|
||||
},
|
||||
onTap: () => showDialog(
|
||||
context: context,
|
||||
builder: (_) => TagAuswahlDialog(
|
||||
songId: song.id!,
|
||||
songTitel: song.titel,
|
||||
onChanged: onMetadataChanged,
|
||||
),
|
||||
),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(6),
|
||||
child: const Icon(Icons.label_outline, size: 14, color: MeloTheme.textSekundaer),
|
||||
@@ -106,39 +99,6 @@ class SongTile extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
onTap: hatDatei ? () => onPlay(song) : null,
|
||||
onLongPress: onDelete != null ? () {
|
||||
showModalBottomSheet(
|
||||
context: context,
|
||||
backgroundColor: MeloTheme.dunkel1,
|
||||
builder: (ctx) => SafeArea(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
ListTile(
|
||||
leading: const Icon(Icons.edit, color: Colors.white),
|
||||
title: const Text('Bearbeiten', style: TextStyle(color: Colors.white)),
|
||||
onTap: () async {
|
||||
Navigator.pop(ctx);
|
||||
final geaendert = await showDialog<bool>(
|
||||
context: context,
|
||||
builder: (_) => MetadatenDialog(song: song),
|
||||
);
|
||||
if (geaendert == true) onMetadataChanged();
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
leading: const Icon(Icons.delete, color: Colors.red),
|
||||
title: const Text('Löschen', style: TextStyle(color: Colors.red)),
|
||||
onTap: () {
|
||||
Navigator.pop(ctx);
|
||||
onDelete!(song);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
} : null,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user