fix: no appropriate output when playlist is empty #201

This commit is contained in:
Kingkor Roy Tirtho 2022-09-26 13:14:55 +06:00
parent 9b3ef2ffa2
commit dbb81de763
3 changed files with 161 additions and 144 deletions

View File

@ -4,6 +4,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:queue/queue.dart'; import 'package:queue/queue.dart';
import 'package:spotify/spotify.dart'; import 'package:spotify/spotify.dart';
import 'package:spotube/components/Shared/DownloadConfirmationDialog.dart'; import 'package:spotube/components/Shared/DownloadConfirmationDialog.dart';
import 'package:spotube/components/Shared/NotFound.dart';
import 'package:spotube/components/Shared/TrackTile.dart'; import 'package:spotube/components/Shared/TrackTile.dart';
import 'package:spotube/hooks/useBreakpoints.dart'; import 'package:spotube/hooks/useBreakpoints.dart';
import 'package:spotube/provider/Downloader.dart'; import 'package:spotube/provider/Downloader.dart';
@ -50,7 +51,9 @@ class TracksTableView extends HookConsumerWidget {
[tracks], [tracks],
); );
final children = [ final children = tracks.isEmpty
? [const NotFound(vertical: true)]
: [
if (heading != null) heading!, if (heading != null) heading!,
Row( Row(
children: [ children: [
@ -160,10 +163,12 @@ class TracksTableView extends HookConsumerWidget {
}, },
onTap: () { onTap: () {
if (showCheck.value) { if (showCheck.value) {
final alreadyChecked = selected.value.contains(track.value.id); final alreadyChecked =
selected.value.contains(track.value.id);
if (alreadyChecked) { if (alreadyChecked) {
selected.value = selected.value = selected.value
selected.value.where((id) => id != track.value.id).toList(); .where((id) => id != track.value.id)
.toList();
} else { } else {
selected.value = [...selected.value, track.value.id!]; selected.value = [...selected.value, track.value.id!];
} }
@ -186,8 +191,9 @@ class TracksTableView extends HookConsumerWidget {
if (checked == true) { if (checked == true) {
selected.value = [...selected.value, track.value.id!]; selected.value = [...selected.value, track.value.id!];
} else { } else {
selected.value = selected.value = selected.value
selected.value.where((id) => id != track.value.id).toList(); .where((id) => id != track.value.id)
.toList();
} }
}, },
), ),
@ -195,6 +201,7 @@ class TracksTableView extends HookConsumerWidget {
}).toList(), }).toList(),
if (bottomSpace) const SizedBox(height: 70), if (bottomSpace) const SizedBox(height: 70),
]; ];
if (isSliver) { if (isSliver) {
return SliverList(delegate: SliverChildListDelegate(children)); return SliverList(delegate: SliverChildListDelegate(children));
} }

View File

@ -6,16 +6,16 @@ import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/platform.dart';
final _loggerFactory = _SpotubeLogger(); final _loggerFactory = SpotubeLogger();
_SpotubeLogger getLogger<T>(T owner) { SpotubeLogger getLogger<T>(T owner) {
_loggerFactory.owner = owner is String ? owner : owner.toString(); _loggerFactory.owner = owner is String ? owner : owner.toString();
return _loggerFactory; return _loggerFactory;
} }
class _SpotubeLogger extends Logger { class SpotubeLogger extends Logger {
String? owner; String? owner;
_SpotubeLogger([this.owner]) : super(filter: _SpotubeLogFilter()); SpotubeLogger([this.owner]) : super(filter: _SpotubeLogFilter());
@override @override
void log(Level level, message, [error, StackTrace? stackTrace]) async { void log(Level level, message, [error, StackTrace? stackTrace]) async {

View File

@ -1,6 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:spotube/models/Logger.dart';
import 'package:spotube/models/LyricsModels.dart'; import 'package:spotube/models/LyricsModels.dart';
import 'package:spotube/provider/Playback.dart'; import 'package:spotube/provider/Playback.dart';
import 'package:spotube/provider/SpotifyDI.dart'; import 'package:spotube/provider/SpotifyDI.dart';
@ -106,6 +107,7 @@ final currentUserSavedTracksQuery = FutureProvider<List<Track>>((ref) {
final playlistTracksQuery = FutureProvider.family<List<Track>, String>( final playlistTracksQuery = FutureProvider.family<List<Track>, String>(
(ref, id) { (ref, id) {
try {
final spotify = ref.watch(spotifyProvider); final spotify = ref.watch(spotifyProvider);
return id != "user-liked-tracks" return id != "user-liked-tracks"
? spotify.playlists.getTracksByPlaylistId(id).all().then( ? spotify.playlists.getTracksByPlaylistId(id).all().then(
@ -114,6 +116,14 @@ final playlistTracksQuery = FutureProvider.family<List<Track>, String>(
: spotify.tracks.me.saved.all().then( : spotify.tracks.me.saved.all().then(
(tracks) => tracks.map((e) => e.track!).toList(), (tracks) => tracks.map((e) => e.track!).toList(),
); );
} catch (e, stack) {
getLogger("playlistTracksQuery").e(
"Fetching playlist tracks",
e,
stack,
);
return [];
}
}, },
); );