diff --git a/lib/components/library/user_albums.dart b/lib/components/library/user_albums.dart index af36448f..997d4536 100644 --- a/lib/components/library/user_albums.dart +++ b/lib/components/library/user_albums.dart @@ -14,7 +14,6 @@ import 'package:spotube/provider/authentication_provider.dart'; import 'package:spotube/services/queries/queries.dart'; import 'package:spotube/utils/type_conversion_utils.dart'; -import 'package:tuple/tuple.dart'; class UserAlbums extends HookConsumerWidget { const UserAlbums({Key? key}) : super(key: key); @@ -36,13 +35,13 @@ class UserAlbums extends HookConsumerWidget { return albumsQuery.data?.toList() ?? []; } return albumsQuery.data - ?.map((e) => Tuple2( + ?.map((e) => ( weightedRatio(e.name!, searchText.value), e, )) - .sorted((a, b) => b.item1.compareTo(a.item1)) - .where((e) => e.item1 > 50) - .map((e) => e.item2) + .sorted((a, b) => b.$1.compareTo(a.$1)) + .where((e) => e.$1 > 50) + .map((e) => e.$2) .toList() ?? []; }, [albumsQuery.data, searchText.value]); diff --git a/lib/components/library/user_artists.dart b/lib/components/library/user_artists.dart index 7266e406..bd84fa92 100644 --- a/lib/components/library/user_artists.dart +++ b/lib/components/library/user_artists.dart @@ -10,7 +10,6 @@ import 'package:spotube/components/artist/artist_card.dart'; import 'package:spotube/extensions/context.dart'; import 'package:spotube/provider/authentication_provider.dart'; import 'package:spotube/services/queries/queries.dart'; -import 'package:tuple/tuple.dart'; class UserArtists extends HookConsumerWidget { const UserArtists({Key? key}) : super(key: key); @@ -31,13 +30,13 @@ class UserArtists extends HookConsumerWidget { return artists.toList(); } return artists - .map((e) => Tuple2( + .map((e) => ( weightedRatio(e.name!, searchText.value), e, )) - .sorted((a, b) => b.item1.compareTo(a.item1)) - .where((e) => e.item1 > 50) - .map((e) => e.item2) + .sorted((a, b) => b.$1.compareTo(a.$1)) + .where((e) => e.$1 > 50) + .map((e) => e.$2) .toList(); }, [artistQuery.data, searchText.value]); diff --git a/lib/components/library/user_local_tracks.dart b/lib/components/library/user_local_tracks.dart index b7d06ff0..cdaea5b6 100644 --- a/lib/components/library/user_local_tracks.dart +++ b/lib/components/library/user_local_tracks.dart @@ -29,7 +29,6 @@ import 'package:spotube/utils/primitive_utils.dart'; import 'package:spotube/utils/service_utils.dart'; import 'package:spotube/utils/type_conversion_utils.dart'; import 'package:flutter_rust_bridge/flutter_rust_bridge.dart' show FfiException; -import 'package:tuple/tuple.dart'; const supportedAudioTypes = [ "audio/webm", @@ -245,7 +244,7 @@ class UserLocalTracks extends HookConsumerWidget { return sortedTracks; } return sortedTracks - .map((e) => Tuple2( + .map((e) => ( weightedRatio( "${e.name} - ${TypeConversionUtils.artists_X_String(e.artists ?? [])}", searchText.value, @@ -254,10 +253,10 @@ class UserLocalTracks extends HookConsumerWidget { )) .toList() .sorted( - (a, b) => b.item1.compareTo(a.item1), + (a, b) => b.$1.compareTo(a.$1), ) - .where((e) => e.item1 > 50) - .map((e) => e.item2) + .where((e) => e.$1 > 50) + .map((e) => e.$2) .toList() .toList(); }, [searchText.value, sortedTracks]); diff --git a/lib/components/library/user_playlists.dart b/lib/components/library/user_playlists.dart index 3d23435d..9fb2a861 100644 --- a/lib/components/library/user_playlists.dart +++ b/lib/components/library/user_playlists.dart @@ -15,7 +15,6 @@ import 'package:spotube/hooks/use_breakpoint_value.dart'; import 'package:spotube/hooks/use_breakpoints.dart'; import 'package:spotube/provider/authentication_provider.dart'; import 'package:spotube/services/queries/queries.dart'; -import 'package:tuple/tuple.dart'; class UserPlaylists extends HookConsumerWidget { const UserPlaylists({Key? key}) : super(key: key); @@ -61,13 +60,10 @@ class UserPlaylists extends HookConsumerWidget { likedTracksPlaylist, ...?playlistsQuery.data, ] - .map((e) => Tuple2( - weightedRatio(e.name!, searchText.value), - e, - )) - .sorted((a, b) => b.item1.compareTo(a.item1)) - .where((e) => e.item1 > 50) - .map((e) => e.item2) + .map((e) => (weightedRatio(e.name!, searchText.value), e)) + .sorted((a, b) => b.$1.compareTo(a.$1)) + .where((e) => e.$1 > 50) + .map((e) => e.$2) .toList(); }, [playlistsQuery.data, searchText.value], diff --git a/lib/components/player/player_controls.dart b/lib/components/player/player_controls.dart index b9d2f381..50f73efa 100644 --- a/lib/components/player/player_controls.dart +++ b/lib/components/player/player_controls.dart @@ -107,11 +107,12 @@ class PlayerControls extends HookConsumerWidget { if (!compact) HookBuilder( builder: (context) { - final progressObj = useProgress(ref); - - final progressStatic = progressObj.item1; - final position = progressObj.item2; - final duration = progressObj.item3; + final ( + :bufferProgress, + :duration, + :position, + :progressStatic + ) = useProgress(ref); final totalMinutes = PrimitiveUtils.zeroPadNumStr( duration.inMinutes.remainder(60), @@ -144,7 +145,7 @@ class PlayerControls extends HookConsumerWidget { // there's an edge case for value being bigger // than total duration. Keeping it resolved value: progress.value.toDouble(), - secondaryTrackValue: progressObj.item4, + secondaryTrackValue: bufferProgress, onChanged: playlist.isFetching == true || buffering ? null : (v) { diff --git a/lib/components/player/player_overlay.dart b/lib/components/player/player_overlay.dart index f0339deb..7718e80f 100644 --- a/lib/components/player/player_overlay.dart +++ b/lib/components/player/player_overlay.dart @@ -24,7 +24,7 @@ class PlayerOverlay extends HookConsumerWidget { @override Widget build(BuildContext context, ref) { final canShow = ref.watch( - ProxyPlaylistNotifier.provider.select((s) => s != null), + ProxyPlaylistNotifier.provider.select((s) => s.active != null), ); final playlistNotifier = ref.watch(ProxyPlaylistNotifier.notifier); final playlist = ref.watch(ProxyPlaylistNotifier.provider); @@ -73,7 +73,10 @@ class PlayerOverlay extends HookConsumerWidget { // animated return TweenAnimationBuilder( duration: const Duration(milliseconds: 250), - tween: Tween(begin: 0, end: progress.item1), + tween: Tween( + begin: 0, + end: progress.progressStatic, + ), builder: (context, value, child) { return LinearProgressIndicator( value: value, diff --git a/lib/components/shared/track_table/track_collection_view.dart b/lib/components/shared/track_table/track_collection_view.dart index 125ad183..da657f42 100644 --- a/lib/components/shared/track_table/track_collection_view.dart +++ b/lib/components/shared/track_table/track_collection_view.dart @@ -22,7 +22,6 @@ import 'package:spotify/spotify.dart'; import 'package:spotube/provider/authentication_provider.dart'; import 'package:spotube/utils/platform.dart'; import 'package:spotube/utils/type_conversion_utils.dart'; -import 'package:tuple/tuple.dart'; class TrackCollectionView extends HookConsumerWidget { final logger = getLogger(TrackCollectionView); @@ -122,19 +121,10 @@ class TrackCollectionView extends HookConsumerWidget { return tracksSnapshot.data; } return tracksSnapshot.data - ?.map((e) => Tuple2( - weightedRatio( - "${e.name} - ${TypeConversionUtils.artists_X_String(e.artists ?? [])}", - searchText.value, - ), - e, - )) - .toList() - .sorted( - (a, b) => b.item1.compareTo(a.item1), - ) - .where((e) => e.item1 > 50) - .map((e) => e.item2) + ?.map((e) => (weightedRatio(e.name!, searchText.value), e)) + .sorted((a, b) => b.$1.compareTo(a.$1)) + .where((e) => e.$1 > 50) + .map((e) => e.$2) .toList(); }, [tracksSnapshot.data, searchText.value]); diff --git a/lib/extensions/list.dart b/lib/extensions/list.dart index b8ca784e..c9d502b0 100644 --- a/lib/extensions/list.dart +++ b/lib/extensions/list.dart @@ -1,5 +1,4 @@ import 'package:collection/collection.dart'; -import 'package:tuple/tuple.dart'; extension MultiSortListMap on List { /// [preference] - List of properties in which you want to sort the list @@ -48,7 +47,7 @@ extension MultiSortListMap on List { } } -extension MultiSortListTupleMap on List> { +extension MultiSortListTupleMap on List<(Map, V)> { /// [preference] - List of properties in which you want to sort the list /// i.e. /// ``` @@ -61,7 +60,7 @@ extension MultiSortListTupleMap on List> { /// ``` /// List criteria = [true. false]; /// ``` - List> sortByProperties( + List<(Map, V)> sortByProperties( List criteria, List preference) { if (preference.isEmpty || criteria.isEmpty || isEmpty) { return this; @@ -71,17 +70,17 @@ extension MultiSortListTupleMap on List> { return this; } - int compare(int i, Tuple2 a, Tuple2 b) { - if (a.item1[preference[i]] == b.item1[preference[i]]) { + int compare(int i, (Map, V) a, (Map, V) b) { + if (a.$1[preference[i]] == b.$1[preference[i]]) { return 0; - } else if (a.item1[preference[i]] > b.item1[preference[i]]) { + } else if (a.$1[preference[i]] > b.$1[preference[i]]) { return criteria[i] ? 1 : -1; } else { return criteria[i] ? -1 : 1; } } - int sortAll(Tuple2 a, Tuple2 b) { + int sortAll((Map, V) a, (Map, V) b) { int i = 0; int result = 0; while (i < preference.length) { diff --git a/lib/hooks/use_progress.dart b/lib/hooks/use_progress.dart index b1d07a85..9764d0b2 100644 --- a/lib/hooks/use_progress.dart +++ b/lib/hooks/use_progress.dart @@ -2,9 +2,13 @@ import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotube/provider/proxy_playlist/proxy_playlist_provider.dart'; import 'package:spotube/services/audio_player/audio_player.dart'; -import 'package:tuple/tuple.dart'; -Tuple4 useProgress(WidgetRef ref) { +({ + double progressStatic, + Duration position, + Duration duration, + double bufferProgress +}) useProgress(WidgetRef ref) { ref.watch(ProxyPlaylistNotifier.provider); final bufferProgress = @@ -25,11 +29,12 @@ Tuple4 useProgress(WidgetRef ref) { final sliderMax = duration.inSeconds; final sliderValue = position.inSeconds; - return Tuple4( - sliderMax == 0 || sliderValue > sliderMax ? 0 : sliderValue / sliderMax, - position, - duration, - sliderMax == 0 || bufferProgress > sliderMax + return ( + progressStatic: + sliderMax == 0 || sliderValue > sliderMax ? 0 : sliderValue / sliderMax, + position: position, + duration: duration, + bufferProgress: sliderMax == 0 || bufferProgress > sliderMax ? 0 : bufferProgress / sliderMax, ); diff --git a/lib/pages/settings/blacklist.dart b/lib/pages/settings/blacklist.dart index ed78a5e1..97947150 100644 --- a/lib/pages/settings/blacklist.dart +++ b/lib/pages/settings/blacklist.dart @@ -7,7 +7,6 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotube/collections/spotube_icons.dart'; import 'package:spotube/components/shared/page_window_title_bar.dart'; import 'package:spotube/provider/blacklist_provider.dart'; -import 'package:tuple/tuple.dart'; class BlackListPage extends HookConsumerWidget { const BlackListPage({Key? key}) : super(key: key); @@ -23,13 +22,15 @@ class BlackListPage extends HookConsumerWidget { return blacklist; } return blacklist - .map((e) => Tuple2( - weightedRatio("${e.name} ${e.type.name}", searchText.value), - e, - )) - .sorted((a, b) => b.item1.compareTo(a.item1)) - .where((e) => e.item1 > 50) - .map((e) => e.item2) + .map( + (e) => ( + weightedRatio("${e.name} ${e.type.name}", searchText.value), + e, + ), + ) + .sorted((a, b) => b.$1.compareTo(a.$1)) + .where((e) => e.$1 > 50) + .map((e) => e.$2) .toList(); }, [blacklist, searchText.value],