import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../core/database/app_database.dart'; import '../data/places_repository.dart'; class PlacesState { final List pois; final List favorites; final bool isLoading; final String? error; const PlacesState({ this.pois = const [], this.favorites = const [], this.isLoading = false, this.error, }); PlacesState copyWith({ List? pois, List? favorites, bool? isLoading, String? error, bool clearError = false, }) { return PlacesState( pois: pois ?? this.pois, favorites: favorites ?? this.favorites, isLoading: isLoading ?? this.isLoading, error: clearError ? null : (error ?? this.error), ); } } class PlacesNotifier extends Notifier { late PlacesRepository _repository; @override PlacesState build() { _repository = ref.watch(placesRepositoryProvider); Future.microtask(_loadFavorites); return const PlacesState(); } Future _loadFavorites() async { final favorites = await _repository.getAllFavorites(); state = state.copyWith(favorites: favorites); } Future loadPoisInViewport({ required double minLon, required double minLat, required double maxLon, required double maxLat, String? category, }) async { state = state.copyWith(isLoading: true, clearError: true); try { final pois = await _repository.getPoisInBbox( minLon: minLon, minLat: minLat, maxLon: maxLon, maxLat: maxLat, category: category, ); state = state.copyWith(pois: pois, isLoading: false); } catch (e) { state = state.copyWith(isLoading: false, error: 'Could not load places.'); } } Future addToFavorites(PlaceData place) async { await _repository.addFavorite(place); await _loadFavorites(); } Future removeFromFavorites(int id) async { await _repository.removeFavorite(id); await _loadFavorites(); } } final placesProvider = NotifierProvider(PlacesNotifier.new);