feat: add all categories providers

This commit is contained in:
Kingkor Roy Tirtho 2024-03-13 19:59:50 +06:00
parent 78b7759f10
commit 54b32459a8
4 changed files with 98 additions and 0 deletions

View File

@ -0,0 +1,20 @@
part of '../spotify.dart';
final categoriesProvider = FutureProvider(
(ref) async {
final spotify = ref.watch(spotifyProvider);
final market = ref
.watch(userPreferencesProvider.select((s) => s.recommendationMarket));
final locale = ref.watch(userPreferencesProvider.select((s) => s.locale));
final categories = await spotify.categories
.list(
country: market,
locale: Intl.canonicalizedLocale(
locale.toString(),
),
)
.all();
return categories.toList()..shuffle();
},
);

View File

@ -0,0 +1,6 @@
part of '../spotify.dart';
final categoryGenresProvider = FutureProvider<List<String>>((ref) async {
final customSpotify = ref.watch(customSpotifyEndpointProvider);
return await customSpotify.listGenreSeeds();
});

View File

@ -0,0 +1,65 @@
part of '../spotify.dart';
class CategoryPlaylistsState extends PaginatedState<PlaylistSimple> {
CategoryPlaylistsState({
required super.items,
required super.offset,
required super.limit,
required super.hasMore,
});
@override
CategoryPlaylistsState copyWith({
List<PlaylistSimple>? items,
int? offset,
int? limit,
bool? hasMore,
}) {
return CategoryPlaylistsState(
items: items ?? this.items,
offset: offset ?? this.offset,
limit: limit ?? this.limit,
hasMore: hasMore ?? this.hasMore,
);
}
}
class CategoryPlaylistsNotifier extends FamilyPaginatedAsyncNotifier<
PlaylistSimple, CategoryPlaylistsState, String> {
CategoryPlaylistsNotifier() : super();
@override
fetch(arg, offset, limit) async {
final preferences = ref.read(userPreferencesProvider);
final playlists = await Pages<PlaylistSimple?>(
spotify,
"v1/browse/categories/$arg/playlists?country=${preferences.recommendationMarket.name}&locale=${preferences.locale}",
(json) => json == null ? null : PlaylistSimple.fromJson(json),
'playlists',
(json) => PlaylistsFeatured.fromJson(json),
).getPage(offset, limit);
return playlists.items?.whereNotNull().toList() ?? [];
}
@override
build(arg) async {
ref.watch(spotifyProvider);
ref.watch(userPreferencesProvider.select((s) => s.locale));
ref.watch(userPreferencesProvider.select((s) => s.recommendationMarket));
final playlists = await fetch(arg, 0, 8);
return CategoryPlaylistsState(
items: playlists,
offset: 0,
limit: 8,
hasMore: playlists.length == 8,
);
}
}
final categoryPlaylistsProvider = AsyncNotifierProviderFamily<
CategoryPlaylistsNotifier, CategoryPlaylistsState, String>(
() => CategoryPlaylistsNotifier(),
);

View File

@ -1,9 +1,12 @@
library spotify;
import 'package:collection/collection.dart';
import 'package:intl/intl.dart';
import 'package:spotify/spotify.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
// ignore: depend_on_referenced_packages, implementation_imports
import 'package:riverpod/src/async_notifier.dart';
import 'package:spotube/provider/custom_spotify_endpoint_provider.dart';
import 'package:spotube/provider/spotify_provider.dart';
import 'package:spotube/provider/user_preferences/user_preferences_provider.dart';
@ -18,6 +21,10 @@ part 'artist/following.dart';
part 'artist/top_tracks.dart';
part 'artist/albums.dart';
part 'category/genres.dart';
part 'category/categories.dart';
part 'category/playlists.dart';
part 'utils/mixin.dart';
part 'utils/state.dart';
part 'utils/provider.dart';