import 'dart:async'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:spotify/spotify.dart'; import 'package:spotube/provider/history/state.dart'; import 'package:spotube/utils/persisted_state_notifier.dart'; class PlaybackHistoryState { final List items; const PlaybackHistoryState({this.items = const []}); factory PlaybackHistoryState.fromJson(Map json) { return PlaybackHistoryState( items: json["items"]?.map((json) => PlaybackHistoryBase.fromJson(json))); } Map toJson() { return { "items": items.map((s) => s.toJson()).toList(), }; } PlaybackHistoryState copyWith({ List? items, }) { return PlaybackHistoryState(items: items ?? this.items); } } class PlaybackHistoryNotifier extends PersistedStateNotifier { PlaybackHistoryNotifier() : super(const PlaybackHistoryState(), "playback_history"); @override FutureOr fromJson(Map json) => PlaybackHistoryState.fromJson(json); @override Map toJson() { return state.toJson(); } void addPlaylists(List playlists) { state = state.copyWith( items: [ ...state.items, for (final playlist in playlists) PlaybackHistoryPlaylist(date: DateTime.now(), playlist: playlist), ], ); } void addAlbums(List albums) { state = state.copyWith( items: [ ...state.items, for (final album in albums) PlaybackHistoryAlbum(date: DateTime.now(), album: album), ], ); } void addTracks(List tracks) { state = state.copyWith( items: [ ...state.items, for (final track in tracks) PlaybackHistoryTrack(date: DateTime.now(), track: track), ], ); } void clear() { state = state.copyWith(items: []); } } final playbackHistoryProvider = StateNotifierProvider( (ref) => PlaybackHistoryNotifier(), );