mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00

* feat: add riverpod based favorite album provider * feat: add album is saved, new releases and tracks providers * feat: add artist related providers * feat: add all categories providers * feat: add lyrics provider * feat: add playlist related providers * feat: add search provider * feat: add view and spotify friends provider * feat: add playlist create and update and favorite handlers * feat: use providers in home screen * chore: fix dart lint issues * feat: use new providers for playlist and albums screen * feat: use providers in artist page * feat: use providers on library page * feat: use provider for playlist and album card and heart button * feat: use provider in search page * feat: use providers in generate playlist * feat: use provider in lyrics screen * feat: use provider for create playlist * feat: use provider in add track dialog * feat: use providers in remaining pages and remove fl_query * fix: remove direct access to provider.value * fix: glitching when loading * fix: user album loading next page indicator * feat: make many provider autoDispose after 5 minutes of no usage * fix: ignore episodes in tracks
91 lines
2.2 KiB
Dart
91 lines
2.2 KiB
Dart
part of '../spotify.dart';
|
|
|
|
typedef PlaylistInput = ({
|
|
String playlistName,
|
|
bool? public,
|
|
bool? collaborative,
|
|
String? description,
|
|
String? base64Image,
|
|
});
|
|
|
|
class PlaylistNotifier extends FamilyAsyncNotifier<Playlist, String> {
|
|
@override
|
|
FutureOr<Playlist> build(String arg) {
|
|
final spotify = ref.watch(spotifyProvider);
|
|
return spotify.playlists.get(arg);
|
|
}
|
|
|
|
Future<void> create(PlaylistInput input, [ValueChanged? onError]) async {
|
|
if (state is AsyncLoading) return;
|
|
state = const AsyncLoading();
|
|
|
|
final spotify = ref.read(spotifyProvider);
|
|
final me = ref.read(meProvider);
|
|
|
|
if (me.value == null) return;
|
|
|
|
state = await AsyncValue.guard(() async {
|
|
try {
|
|
final playlist = await spotify.playlists.createPlaylist(
|
|
me.value!.id!,
|
|
input.playlistName,
|
|
collaborative: input.collaborative,
|
|
description: input.description,
|
|
public: input.public,
|
|
);
|
|
|
|
if (input.base64Image != null) {
|
|
await spotify.playlists.updatePlaylistImage(
|
|
playlist.id!,
|
|
input.base64Image!,
|
|
);
|
|
}
|
|
|
|
return playlist;
|
|
} catch (e) {
|
|
onError?.call(e);
|
|
rethrow;
|
|
}
|
|
});
|
|
|
|
ref.invalidate(favoritePlaylistsProvider);
|
|
}
|
|
|
|
Future<void> modify(PlaylistInput input, [ValueChanged? onError]) async {
|
|
if (state.value == null) return;
|
|
|
|
final spotify = ref.read(spotifyProvider);
|
|
|
|
await update((state) async {
|
|
try {
|
|
await spotify.playlists.updatePlaylist(
|
|
state.id!,
|
|
input.playlistName,
|
|
collaborative: input.collaborative,
|
|
description: input.description,
|
|
public: input.public,
|
|
);
|
|
|
|
if (input.base64Image != null) {
|
|
await spotify.playlists.updatePlaylistImage(
|
|
state.id!,
|
|
input.base64Image!,
|
|
);
|
|
}
|
|
|
|
return spotify.playlists.get(state.id!);
|
|
} catch (e) {
|
|
onError?.call(e);
|
|
rethrow;
|
|
}
|
|
});
|
|
|
|
ref.invalidate(favoritePlaylistsProvider);
|
|
}
|
|
}
|
|
|
|
final playlistProvider =
|
|
AsyncNotifierProvider.family<PlaylistNotifier, Playlist, String>(
|
|
() => PlaylistNotifier(),
|
|
);
|