import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../audio/player_providers.dart'; /// Overridden in main() once SharedPreferences has loaded. final sharedPrefsProvider = Provider( (ref) => throw UnimplementedError('sharedPrefsProvider must be overridden in main()'), ); /// Liked song ids, stored on the device. Synced to Supabase once sign-in is wired up. class LikedSongs extends Notifier> { static const _key = 'liked_track_ids'; @override Set build() => {...?ref.watch(sharedPrefsProvider).getStringList(_key)}; bool isLiked(String id) => state.contains(id); void toggle(String id) { state = state.contains(id) ? ({...state}..remove(id)) : {...state, id}; ref.read(sharedPrefsProvider).setStringList(_key, state.toList()); } } final likedSongsProvider = NotifierProvider>(LikedSongs.new); /// Most recent first, capped at 30. class RecentlyPlayed extends Notifier> { static const _key = 'recent_track_ids'; static const _max = 30; @override List build() { ref.listen(mediaItemProvider, (_, next) { final id = next.value?.id; if (id != null && (state.isEmpty || state.first != id)) _push(id); }); return ref.watch(sharedPrefsProvider).getStringList(_key) ?? const []; } void _push(String id) { state = [id, ...state.where((e) => e != id)].take(_max).toList(); ref.read(sharedPrefsProvider).setStringList(_key, state); } } final recentlyPlayedProvider = NotifierProvider>(RecentlyPlayed.new);