maps/mobile/lib/features/places/providers/places_provider.dart
2026-03-31 21:01:08 +02:00

83 lines
2.1 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../core/database/app_database.dart';
import '../data/places_repository.dart';
class PlacesState {
final List<PlaceData> pois;
final List<Favorite> favorites;
final bool isLoading;
final String? error;
const PlacesState({
this.pois = const [],
this.favorites = const [],
this.isLoading = false,
this.error,
});
PlacesState copyWith({
List<PlaceData>? pois,
List<Favorite>? 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<PlacesState> {
late PlacesRepository _repository;
@override
PlacesState build() {
_repository = ref.watch(placesRepositoryProvider);
Future.microtask(_loadFavorites);
return const PlacesState();
}
Future<void> _loadFavorites() async {
final favorites = await _repository.getAllFavorites();
state = state.copyWith(favorites: favorites);
}
Future<void> 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<void> addToFavorites(PlaceData place) async {
await _repository.addFavorite(place);
await _loadFavorites();
}
Future<void> removeFromFavorites(int id) async {
await _repository.removeFavorite(id);
await _loadFavorites();
}
}
final placesProvider =
NotifierProvider<PlacesNotifier, PlacesState>(PlacesNotifier.new);