import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../backend/backend.dart'; import '../../../core/utils/result.dart'; import 'favorites_state.dart'; final favoritesControllerProvider = AsyncNotifierProvider( FavoritesController.new, ); final favoriteKeysProvider = FutureProvider>((ref) async { final result = await ref.watch(favoriteServiceProvider).getFavorites(); return result.fold( onSuccess: (favorites) => favorites .map((favorite) => '${favorite.providerId}:${favorite.postId}') .toSet(), onError: (_) => {}, ); }); class FavoritesController extends AsyncNotifier { @override Future build() async => FavoritesState(posts: await _load()); Future remove(Post post) async { await ref .read(favoriteServiceProvider) .removeFavorite(post.id, post.providerId); ref.invalidate(favoriteKeysProvider); state = AsyncData(FavoritesState(posts: await _load())); } Future> _load() async { final result = await ref.read(favoriteServiceProvider).getFavoritePosts(); return result is Success> ? result.data : const []; } }