Skip to content

Commit

Permalink
fix: collection currently playing state persist on restart
Browse files Browse the repository at this point in the history
  • Loading branch information
KRTirtho committed Jun 20, 2023
1 parent 9251121 commit 1c89e3e
Show file tree
Hide file tree
Showing 7 changed files with 46 additions and 11 deletions.
8 changes: 4 additions & 4 deletions lib/components/album/album_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,9 @@ class AlbumCard extends HookConsumerWidget {
useStream(audioPlayer.playingStream).data ?? audioPlayer.isPlaying;
final playlistNotifier = ref.watch(ProxyPlaylistNotifier.notifier);
final queryClient = useQueryClient();
final query = queryClient
.getQuery<List<TrackSimple>, dynamic>("album-tracks/${album.id}");
bool isPlaylistPlaying = useMemoized(
() => playlist.containsTracks(query?.data ?? album.tracks ?? []),
[playlistNotifier, query?.data, album.tracks],
() => playlist.containsCollection(album.id!),
[playlist, album.id],
);
final int marginH =
useBreakpointValue(xs: 10, sm: 10, md: 15, lg: 20, xl: 20, xxl: 20);
Expand Down Expand Up @@ -89,6 +87,7 @@ class AlbumCard extends HookConsumerWidget {
[],
autoPlay: true,
);
playlistNotifier.addCollection(album.id!);
} finally {
updating.value = false;
}
Expand Down Expand Up @@ -118,6 +117,7 @@ class AlbumCard extends HookConsumerWidget {

if (fetchedTracks == null || fetchedTracks.isEmpty) return;
playlistNotifier.addTracks(fetchedTracks);
playlistNotifier.addCollection(album.id!);
if (context.mounted) {
final snackbar = SnackBar(
content: Text("Added ${album.tracks?.length} tracks to queue"),
Expand Down
9 changes: 4 additions & 5 deletions lib/components/playlist/playlist_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,10 @@ class PlaylistCard extends HookConsumerWidget {
final playing =
useStream(audioPlayer.playingStream).data ?? audioPlayer.isPlaying;
final queryBowl = QueryClient.of(context);
final query = queryBowl.getQuery<List<Track>, dynamic>(
"playlist-tracks/${playlist.id}",
);
final tracks = useState<List<TrackSimple>?>(null);
bool isPlaylistPlaying = useMemoized(
() => playlistQueue.containsTracks(tracks.value ?? query?.data ?? []),
[playlistNotifier, tracks.value, query?.data],
() => playlistQueue.containsCollection(playlist.id!),
[playlistQueue, playlist.id],
);

final updating = useState(false);
Expand Down Expand Up @@ -72,6 +69,7 @@ class PlaylistCard extends HookConsumerWidget {
if (fetchedTracks.isEmpty) return;

await playlistNotifier.load(fetchedTracks, autoPlay: true);
playlistNotifier.addCollection(playlist.id!);
tracks.value = fetchedTracks;
} finally {
updating.value = false;
Expand All @@ -90,6 +88,7 @@ class PlaylistCard extends HookConsumerWidget {
if (fetchedTracks.isEmpty) return;

playlistNotifier.addTracks(fetchedTracks);
playlistNotifier.addCollection(playlist.id!);
tracks.value = fetchedTracks;
if (context.mounted) {
final snackbar = SnackBar(
Expand Down
7 changes: 6 additions & 1 deletion lib/components/shared/track_table/tracks_table_view.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:fuzzywuzzy/fuzzywuzzy.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
Expand Down Expand Up @@ -219,13 +218,19 @@ class TracksTableView extends HookConsumerWidget {
case "play-next":
{
playback.addTracksAtFirst(selectedTracks);
if (playlistId != null) {
playback.addCollection(playlistId!);
}
selected.value = [];
showCheck.value = false;
break;
}
case "add-to-queue":
{
playback.addTracks(selectedTracks);
if (playlistId != null) {
playback.addCollection(playlistId!);
}
selected.value = [];
showCheck.value = false;
break;
Expand Down
2 changes: 2 additions & 0 deletions lib/pages/album/album.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class AlbumPage extends HookConsumerWidget {
sortedTracks,
initialIndex: sortedTracks.indexWhere((s) => s.id == currentTrack?.id),
);
playback.addCollection(album.id!);
} else if (isPlaylistPlaying &&
currentTrack.id != null &&
currentTrack.id != playlist.activeTrack?.id) {
Expand Down Expand Up @@ -101,6 +102,7 @@ class AlbumPage extends HookConsumerWidget {
TypeConversionUtils.simpleTrack_X_Track(track, album))
.toList(),
);
playback.addCollection(album.id!);
}
},
onShare: () {
Expand Down
2 changes: 2 additions & 0 deletions lib/pages/playlist/playlist.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class PlaylistView extends HookConsumerWidget {
initialIndex: sortedTracks.indexWhere((s) => s.id == currentTrack?.id),
autoPlay: true,
);
playback.addCollection(playlist.id!);
} else if (isPlaylistPlaying &&
currentTrack.id != null &&
currentTrack.id != proxyPlaylist.activeTrack?.id) {
Expand Down Expand Up @@ -97,6 +98,7 @@ class PlaylistView extends HookConsumerWidget {
onAddToQueue: () {
if (tracksSnapshot.hasData && !isPlaylistPlaying) {
playlistNotifier.addTracks(tracksSnapshot.data!);
playlistNotifier.addCollection(playlist.id!);
}
},
bottomSpace: mediaQuery.mdAndDown,
Expand Down
14 changes: 13 additions & 1 deletion lib/provider/proxy_playlist/proxy_playlist.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,20 @@ import 'package:spotube/models/spotube_track.dart';

class ProxyPlaylist {
final Set<Track> tracks;
final Set<String> collections;
final int? active;

ProxyPlaylist(this.tracks, [this.active]);
ProxyPlaylist(this.tracks, [this.active, this.collections = const {}]);

factory ProxyPlaylist.fromJson(Map<String, dynamic> json) {
return ProxyPlaylist(
List.castFrom<dynamic, Map<String, dynamic>>(
json['tracks'] ?? <Map<String, dynamic>>[],
).map(_makeAppropriateTrack).toSet(),
json['active'] as int?,
json['collections'] == null
? {}
: (json['collections'] as List).toSet().cast<String>(),
);
}

Expand All @@ -26,6 +31,10 @@ class ProxyPlaylist {
activeTrack is! SpotubeTrack &&
activeTrack is! LocalTrack;

bool containsCollection(String collection) {
return collections.contains(collection);
}

bool containsTrack(TrackSimple track) {
return tracks.firstWhereOrNull((element) => element.id == track.id) != null;
}
Expand Down Expand Up @@ -57,16 +66,19 @@ class ProxyPlaylist {
return {
'tracks': tracks.map(_makeAppropriateTrackJson).toList(),
'active': active,
'collections': collections.toList(),
};
}

ProxyPlaylist copyWith({
Set<Track>? tracks,
int? active,
Set<String>? collections,
}) {
return ProxyPlaylist(
tracks ?? this.tracks,
active ?? this.active,
collections ?? this.collections,
);
}
}
15 changes: 15 additions & 0 deletions lib/provider/proxy_playlist/proxy_playlist_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,19 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
}
}

void addCollection(String collectionId) {
state = state.copyWith(collections: {
...state.collections,
collectionId,
});
}

void removeCollection(String collectionId) {
state = state.copyWith(collections: {
...state.collections..remove(collectionId),
});
}

// TODO: Safely Remove playing tracks

Future<void> removeTrack(String trackId) async {
Expand Down Expand Up @@ -224,6 +237,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
state = state.copyWith(
tracks: tracks.toSet(),
active: initialIndex,
collections: {},
);
await notificationService.addTrack(indexTrack);
} else {
Expand All @@ -236,6 +250,7 @@ class ProxyPlaylistNotifier extends PersistedStateNotifier<ProxyPlaylist>
state = state.copyWith(
tracks: mergeTracks([addableTrack], tracks),
active: initialIndex,
collections: {},
);
await notificationService.addTrack(addableTrack);
await storeTrack(
Expand Down

0 comments on commit 1c89e3e

Please sign in to comment.