spotube/lib/provider/spotify/playlist/playlist.dart
Kingkor Roy Tirtho 6673e5a8a8
feat: improved caching based on riverpod (#1343)
* 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
2024-03-20 23:38:39 +06:00

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(),
);