This commit is contained in:
Forrest 2026-07-29 22:41:38 -04:00
parent 981b4836f9
commit ed910748cb
34 changed files with 2054 additions and 153 deletions

View file

@ -7,6 +7,7 @@ import '../state/providers.dart';
import '../subsonic/models.dart';
import '../theme/tokens.dart';
import '../widgets/hairline_panel.dart';
import '../widgets/toast.dart';
import 'add_to_playlist_sheet.dart';
/// Playlists list — server-backed with an offline mirror. Create from the app
@ -16,7 +17,7 @@ class PlaylistsScreen extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(playlistsProvider);
final playlists = ref.watch(realPlaylistsProvider);
final controller = ref.read(playlistsProvider.notifier);
final connected = ref.watch(subsonicClientProvider) != null;
@ -38,10 +39,9 @@ class PlaylistsScreen extends ConsumerWidget {
child: HairlinePanel(
title: 'Playlists',
active: true,
trailing:
state.playlists.isEmpty ? null : '(${state.playlists.length})',
trailing: playlists.isEmpty ? null : '(${playlists.length})',
padding: const EdgeInsets.symmetric(vertical: TimbreSpacing.md),
child: state.playlists.isEmpty
child: playlists.isEmpty
? Center(
child: Text(
connected
@ -53,9 +53,9 @@ class PlaylistsScreen extends ConsumerWidget {
)
: ListView.builder(
padding: EdgeInsets.zero,
itemCount: state.playlists.length,
itemCount: playlists.length,
itemBuilder: (context, i) {
final p = state.playlists[i];
final p = playlists[i];
return _PlaylistRow(
name: p.name,
subtitle: p.songCount != null
@ -233,11 +233,7 @@ class _PlaylistDetailScreenState extends ConsumerState<PlaylistDetailScreen> {
ref
.read(downloadManagerProvider.notifier)
.downloadAll(songs);
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text('Downloading playlist…'),
duration: Duration(seconds: 2)),
);
showToast(context, 'Downloading playlist…');
},
icon: const Icon(Icons.download),
),
@ -337,8 +333,10 @@ class _TrackRow extends StatelessWidget {
switch (v) {
case 'next':
onPlayNext();
showToast(context, 'Playing next', icon: Icons.check);
case 'queue':
onAddToQueue();
showToast(context, 'Added to queue', icon: Icons.check);
case 'remove':
onRemove?.call();
}