Skip to content

Commit 42d284f

Browse files
committed
refactor: query and mutation jobs as separate abstract class
1 parent 7c25e1c commit 42d284f

33 files changed

+437
-363
lines changed

lib/collections/routes.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import 'package:flutter/widgets.dart';
22
import 'package:go_router/go_router.dart';
33
import 'package:spotify/spotify.dart' hide Search;
4+
import 'package:spotube/utils/platform.dart';
5+
import 'package:spotube/components/shared/spotube_page_route.dart';
46
import 'package:spotube/pages/album/album.dart';
57
import 'package:spotube/pages/artist/artist.dart';
68
import 'package:spotube/pages/genre/genres.dart';
@@ -12,9 +14,7 @@ import 'package:spotube/pages/player/player.dart';
1214
import 'package:spotube/pages/playlist/playlist.dart';
1315
import 'package:spotube/pages/root/root_app.dart';
1416
import 'package:spotube/pages/search/search.dart';
15-
import 'package:spotube/components/shared/spotube_page_route.dart';
1617
import 'package:spotube/pages/settings/settings.dart';
17-
import 'package:spotube/utils/platform.dart';
1818
import 'package:spotube/pages/mobile_login/mobile_login.dart';
1919

2020
final rootNavigatorKey = GlobalKey<NavigatorState>();

lib/components/artist/artist_album_list.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart'
99
import 'package:spotube/components/shared/waypoint.dart';
1010
import 'package:spotube/models/logger.dart';
1111
import 'package:spotube/provider/spotify_provider.dart';
12-
import 'package:spotube/provider/SpotifyRequests.dart';
12+
import 'package:spotube/services/queries/queries.dart';
1313

1414
class ArtistAlbumList extends HookConsumerWidget {
1515
final String artistId;
@@ -24,7 +24,7 @@ class ArtistAlbumList extends HookConsumerWidget {
2424
Widget build(BuildContext context, ref) {
2525
final scrollController = useScrollController();
2626
final albumsQuery = useInfiniteQuery(
27-
job: artistAlbumsQueryJob(artistId),
27+
job: Queries.artist.albumsOf(artistId),
2828
externalData: ref.watch(spotifyProvider),
2929
);
3030

lib/components/genre/category_card.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import 'package:spotube/components/shared/waypoint.dart';
1010
import 'package:spotube/components/playlist/playlist_card.dart';
1111
import 'package:spotube/models/logger.dart';
1212
import 'package:spotube/provider/spotify_provider.dart';
13-
import 'package:spotube/provider/SpotifyRequests.dart';
13+
import 'package:spotube/services/queries/queries.dart';
1414

1515
class CategoryCard extends HookConsumerWidget {
1616
final Category category;
@@ -28,7 +28,7 @@ class CategoryCard extends HookConsumerWidget {
2828
final scrollController = useScrollController();
2929
final spotify = ref.watch(spotifyProvider);
3030
final playlistQuery = useInfiniteQuery(
31-
job: categoryPlaylistsQueryJob(category.id!),
31+
job: Queries.category.playlistsOf(category.id!),
3232
externalData: spotify,
3333
);
3434
final hasNextPage = playlistQuery.pages.isEmpty

lib/components/library/user_albums.dart

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import 'package:spotube/components/shared/shimmers/shimmer_playbutton_card.dart'
77
import 'package:spotube/components/shared/fallbacks/anonymous_fallback.dart';
88
import 'package:spotube/provider/auth_provider.dart';
99
import 'package:spotube/provider/spotify_provider.dart';
10-
import 'package:spotube/provider/SpotifyRequests.dart';
10+
import 'package:spotube/services/queries/queries.dart';
11+
1112
import 'package:spotube/utils/type_conversion_utils.dart';
1213

1314
class UserAlbums extends HookConsumerWidget {
@@ -20,7 +21,7 @@ class UserAlbums extends HookConsumerWidget {
2021
return const AnonymousFallback();
2122
}
2223
final albumsQuery = useQuery(
23-
job: currentUserAlbumsQueryJob,
24+
job: Queries.album.ofMine,
2425
externalData: ref.watch(spotifyProvider),
2526
);
2627

lib/components/library/user_artists.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:spotube/components/shared/waypoint.dart';
99
import 'package:spotube/components/artist/artist_card.dart';
1010
import 'package:spotube/provider/auth_provider.dart';
1111
import 'package:spotube/provider/spotify_provider.dart';
12-
import 'package:spotube/provider/SpotifyRequests.dart';
12+
import 'package:spotube/services/queries/queries.dart';
1313

1414
class UserArtists extends HookConsumerWidget {
1515
const UserArtists({Key? key}) : super(key: key);
@@ -21,7 +21,7 @@ class UserArtists extends HookConsumerWidget {
2121
return const AnonymousFallback();
2222
}
2323
final artistQuery = useInfiniteQuery(
24-
job: currentUserFollowingArtistsQueryJob,
24+
job: Queries.artist.followedByMe,
2525
externalData: ref.watch(spotifyProvider),
2626
);
2727

lib/components/library/user_playlists.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import 'package:spotube/components/playlist/playlist_card.dart';
99
import 'package:spotube/components/playlist/playlist_create_dialog.dart';
1010
import 'package:spotube/provider/auth_provider.dart';
1111
import 'package:spotube/provider/spotify_provider.dart';
12-
import 'package:spotube/provider/SpotifyRequests.dart';
12+
import 'package:spotube/services/queries/queries.dart';
1313

1414
class UserPlaylists extends HookConsumerWidget {
1515
const UserPlaylists({Key? key}) : super(key: key);
@@ -22,7 +22,7 @@ class UserPlaylists extends HookConsumerWidget {
2222
}
2323

2424
final playlistsQuery = useQuery(
25-
job: currentUserPlaylistsQueryJob,
25+
job: Queries.playlist.ofMine,
2626
externalData: ref.watch(spotifyProvider),
2727
);
2828
Image image = Image();

lib/components/playlist/playlist_create_dialog.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
55
import 'package:platform_ui/platform_ui.dart';
66
import 'package:spotube/components/root/sidebar.dart';
77
import 'package:spotube/provider/spotify_provider.dart';
8-
import 'package:spotube/provider/SpotifyRequests.dart';
8+
import 'package:spotube/services/queries/queries.dart';
99

1010
class PlaylistCreateDialog extends HookConsumerWidget {
1111
const PlaylistCreateDialog({Key? key}) : super(key: key);
@@ -44,7 +44,7 @@ class PlaylistCreateDialog extends HookConsumerWidget {
4444
)
4545
.then((_) {
4646
QueryBowl.of(context).refetchQueries([
47-
currentUserPlaylistsQueryJob.queryKey,
47+
Queries.playlist.ofMine.queryKey,
4848
]);
4949
Navigator.pop(context);
5050
});

lib/components/root/bottom_player.dart

+5-5
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:flutter/gestures.dart';
33
import 'package:flutter_hooks/flutter_hooks.dart';
44
import 'package:hooks_riverpod/hooks_riverpod.dart';
55
import 'package:macos_ui/macos_ui.dart';
6-
import 'package:fluent_ui/fluent_ui.dart' as FluentUI;
6+
import 'package:fluent_ui/fluent_ui.dart' as fluent_ui;
77
import 'package:platform_ui/platform_ui.dart';
88
import 'package:spotube/components/player/player_actions.dart';
99
import 'package:spotube/components/player/player_overlay.dart';
@@ -17,10 +17,10 @@ import 'package:flutter/material.dart';
1717
import 'package:spotube/provider/user_preferences_provider.dart';
1818
import 'package:spotube/utils/type_conversion_utils.dart';
1919

20-
class Player extends HookConsumerWidget {
21-
Player({Key? key}) : super(key: key);
20+
class BottomPlayer extends HookConsumerWidget {
21+
BottomPlayer({Key? key}) : super(key: key);
2222

23-
final logger = getLogger(Player);
23+
final logger = getLogger(BottomPlayer);
2424
@override
2525
Widget build(BuildContext context, ref) {
2626
Playback playback = ref.watch(playbackProvider);
@@ -59,7 +59,7 @@ class Player extends HookConsumerWidget {
5959
? Colors.grey[800]
6060
: Colors.blueGrey[50],
6161
linux: Theme.of(context).backgroundColor,
62-
windows: FluentUI.FluentTheme.maybeOf(context)?.micaBackgroundColor,
62+
windows: fluent_ui.FluentTheme.maybeOf(context)?.micaBackgroundColor,
6363
),
6464
);
6565

lib/components/root/sidebar.dart

+6-5
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ import 'package:spotube/hooks/use_breakpoints.dart';
1212
import 'package:spotube/provider/auth_provider.dart';
1313
import 'package:spotube/provider/downloader_provider.dart';
1414
import 'package:spotube/provider/spotify_provider.dart';
15-
import 'package:spotube/provider/SpotifyRequests.dart';
15+
1616
import 'package:spotube/provider/user_preferences_provider.dart';
17+
import 'package:spotube/services/queries/queries.dart';
1718
import 'package:spotube/utils/platform.dart';
1819
import 'package:spotube/utils/type_conversion_utils.dart';
19-
import 'package:fluent_ui/fluent_ui.dart' as FluentUI;
20+
import 'package:fluent_ui/fluent_ui.dart' as fluent_ui;
2021

2122
final sidebarExtendedStateProvider = StateProvider<bool?>((ref) => null);
2223

@@ -153,8 +154,8 @@ class Sidebar extends HookConsumerWidget {
153154
],
154155
),
155156
windowsFooterItems: [
156-
FluentUI.PaneItemAction(
157-
icon: const FluentUI.Icon(FluentUI.FluentIcons.settings),
157+
fluent_ui.PaneItemAction(
158+
icon: const fluent_ui.Icon(fluent_ui.FluentIcons.settings),
158159
onTap: () => goToSettings(context),
159160
),
160161
],
@@ -180,7 +181,7 @@ class SidebarFooter extends HookConsumerWidget {
180181
child: HookBuilder(
181182
builder: (context) {
182183
final me = useQuery(
183-
job: currentUserQueryJob,
184+
job: Queries.user.me,
184185
externalData: ref.watch(spotifyProvider),
185186
);
186187
final data = me.data;

lib/components/shared/dialogs/playlist_add_track_dialog.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
55
import 'package:platform_ui/platform_ui.dart';
66
import 'package:spotify/spotify.dart';
77
import 'package:spotube/provider/spotify_provider.dart';
8-
import 'package:spotube/provider/SpotifyRequests.dart';
8+
import 'package:spotube/services/queries/queries.dart';
99

1010
class PlaylistAddTrackDialog extends HookConsumerWidget {
1111
final List<Track> tracks;
@@ -18,11 +18,11 @@ class PlaylistAddTrackDialog extends HookConsumerWidget {
1818
Widget build(BuildContext context, ref) {
1919
final spotify = ref.watch(spotifyProvider);
2020
final userPlaylists = useQuery(
21-
job: currentUserPlaylistsQueryJob,
21+
job: Queries.playlist.ofMine,
2222
externalData: spotify,
2323
);
2424
final me = useQuery(
25-
job: currentUserQueryJob,
25+
job: Queries.user.me,
2626
externalData: spotify,
2727
);
2828
final filteredPlaylists = userPlaylists.data?.where(

lib/components/shared/heart_button.dart

+21-16
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import 'package:spotify/spotify.dart';
88
import 'package:spotube/hooks/use_palette_color.dart';
99
import 'package:spotube/provider/auth_provider.dart';
1010
import 'package:spotube/provider/spotify_provider.dart';
11-
import 'package:spotube/provider/SpotifyRequests.dart';
11+
import 'package:spotube/services/mutations/mutations.dart';
12+
import 'package:spotube/services/queries/queries.dart';
13+
1214
import 'package:spotube/utils/type_conversion_utils.dart';
1315
import 'package:tuple/tuple.dart';
1416

@@ -49,11 +51,11 @@ class HeartButton extends ConsumerWidget {
4951

5052
Tuple3<bool, Mutation<bool, Tuple2<SpotifyApi, bool>>, Query<User, SpotifyApi>>
5153
useTrackToggleLike(Track track, WidgetRef ref) {
52-
final me = useQuery(
53-
job: currentUserQueryJob, externalData: ref.watch(spotifyProvider));
54+
final me =
55+
useQuery(job: Queries.user.me, externalData: ref.watch(spotifyProvider));
5456

5557
final savedTracks = useQuery(
56-
job: playlistTracksQueryJob("user-liked-tracks"),
58+
job: Queries.playlist.tracksOf("user-liked-tracks"),
5759
externalData: ref.watch(spotifyProvider),
5860
);
5961

@@ -63,7 +65,7 @@ Tuple3<bool, Mutation<bool, Tuple2<SpotifyApi, bool>>, Query<User, SpotifyApi>>
6365
final mounted = useIsMounted();
6466

6567
final toggleTrackLike = useMutation<bool, Tuple2<SpotifyApi, bool>>(
66-
job: toggleFavoriteTrackMutationJob(track.id!),
68+
job: Mutations.track.toggleFavorite(track.id!),
6769
onMutate: (variable) {
6870
savedTracks.setQueryData(
6971
(oldData) {
@@ -117,7 +119,7 @@ class TrackHeartButton extends HookConsumerWidget {
117119
@override
118120
Widget build(BuildContext context, ref) {
119121
final savedTracks = useQuery(
120-
job: playlistTracksQueryJob("user-liked-tracks"),
122+
job: Queries.playlist.tracksOf("user-liked-tracks"),
121123
externalData: ref.watch(spotifyProvider),
122124
);
123125
final toggler = useTrackToggleLike(track, ref);
@@ -150,22 +152,23 @@ class PlaylistHeartButton extends HookConsumerWidget {
150152
@override
151153
Widget build(BuildContext context, ref) {
152154
final me = useQuery(
153-
job: currentUserQueryJob,
155+
job: Queries.user.me,
154156
externalData: ref.watch(spotifyProvider),
155157
);
156158

157-
final job = playlistIsFollowedQueryJob("${playlist.id}:${me.data?.id}");
159+
final job =
160+
Queries.playlist.doesUserFollow("${playlist.id}:${me.data?.id}");
158161
final isLikedQuery = useQuery(
159162
job: job,
160163
externalData: ref.watch(spotifyProvider),
161164
);
162165

163166
final togglePlaylistLike = useMutation<bool, Tuple2<SpotifyApi, bool>>(
164-
job: toggleFavoritePlaylistMutationJob(playlist.id!),
167+
job: Mutations.playlist.toggleFavorite(playlist.id!),
165168
onData: (payload, variables, queryContext) {
166169
isLikedQuery.refetch();
167170
QueryBowl.of(context)
168-
.getQuery(currentUserPlaylistsQueryJob.queryKey)
171+
.getQuery(Queries.playlist.ofMine.queryKey)
169172
?.refetch();
170173
},
171174
);
@@ -182,8 +185,9 @@ class PlaylistHeartButton extends HookConsumerWidget {
182185
titleImage,
183186
).dominantColor;
184187

185-
if (me.isLoading || !me.hasData)
188+
if (me.isLoading || !me.hasData) {
186189
return const PlatformCircularProgressIndicator();
190+
}
187191

188192
return HeartButton(
189193
isLiked: isLikedQuery.data ?? false,
@@ -217,28 +221,29 @@ class AlbumHeartButton extends HookConsumerWidget {
217221
Widget build(BuildContext context, ref) {
218222
final spotify = ref.watch(spotifyProvider);
219223
final me = useQuery(
220-
job: currentUserQueryJob,
224+
job: Queries.user.me,
221225
externalData: spotify,
222226
);
223227

224228
final albumIsSaved = useQuery(
225-
job: albumIsSavedForCurrentUserQueryJob(album.id!),
229+
job: Queries.album.isSavedForMe(album.id!),
226230
externalData: spotify,
227231
);
228232
final isLiked = albumIsSaved.data ?? false;
229233

230234
final toggleAlbumLike = useMutation<bool, Tuple2<SpotifyApi, bool>>(
231-
job: toggleFavoriteAlbumMutationJob(album.id!),
235+
job: Mutations.album.toggleFavorite(album.id!),
232236
onData: (payload, variables, queryContext) {
233237
albumIsSaved.refetch();
234238
QueryBowl.of(context)
235-
.getQuery(currentUserAlbumsQueryJob.queryKey)
239+
.getQuery(Queries.album.ofMine.queryKey)
236240
?.refetch();
237241
},
238242
);
239243

240-
if (me.isLoading || !me.hasData)
244+
if (me.isLoading || !me.hasData) {
241245
return const PlatformCircularProgressIndicator();
246+
}
242247

243248
return HeartButton(
244249
isLiked: isLiked,

lib/components/shared/track_table/track_tile.dart

+5-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ import 'package:spotube/models/logger.dart';
1616
import 'package:spotube/provider/auth_provider.dart';
1717
import 'package:spotube/provider/playback_provider.dart';
1818
import 'package:spotube/provider/spotify_provider.dart';
19-
import 'package:spotube/provider/SpotifyRequests.dart';
19+
import 'package:spotube/services/mutations/mutations.dart';
20+
import 'package:spotube/services/queries/queries.dart';
21+
2022
import 'package:spotube/utils/type_conversion_utils.dart';
2123
import 'package:tuple/tuple.dart';
2224

@@ -63,12 +65,12 @@ class TrackTile extends HookConsumerWidget {
6365
final spotify = ref.watch(spotifyProvider);
6466
final removingTrack = useState<String?>(null);
6567
final removeTrack = useMutation<bool, Tuple2<SpotifyApi, String>>(
66-
job: removeTrackFromPlaylistMutationJob(playlistId ?? ""),
68+
job: Mutations.playlist.removeTrackOf(playlistId ?? ""),
6769
onData: (payload, variables, ctx) {
6870
if (playlistId == null || !payload) return;
6971
QueryBowl.of(context)
7072
.getQuery(
71-
playlistTracksQueryJob(playlistId!).queryKey,
73+
Queries.playlist.tracksOf(playlistId!).queryKey,
7274
)
7375
?.refetch();
7476
},

lib/pages/album/album.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ import 'package:spotube/components/shared/heart_button.dart';
88
import 'package:spotube/components/shared/track_table/track_collection_view.dart';
99
import 'package:spotube/components/shared/track_table/tracks_table_view.dart';
1010
import 'package:spotube/hooks/use_breakpoints.dart';
11+
import 'package:spotube/services/queries/queries.dart';
1112
import 'package:spotube/utils/service_utils.dart';
1213
import 'package:spotube/utils/type_conversion_utils.dart';
1314
import 'package:spotube/models/current_playlist.dart';
1415
import 'package:spotube/provider/playback_provider.dart';
1516
import 'package:spotube/provider/spotify_provider.dart';
16-
import 'package:spotube/provider/SpotifyRequests.dart';
1717

1818
class AlbumPage extends HookConsumerWidget {
1919
final AlbumSimple album;
@@ -56,7 +56,7 @@ class AlbumPage extends HookConsumerWidget {
5656
final SpotifyApi spotify = ref.watch(spotifyProvider);
5757

5858
final tracksSnapshot = useQuery(
59-
job: albumTracksQueryJob(album.id!),
59+
job: Queries.album.tracksOf(album.id!),
6060
externalData: spotify,
6161
);
6262

0 commit comments

Comments
 (0)