MotorSignal-App/lib/services/map/map_providers.dart

80 lines
2.1 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'map_provider_interface.dart';
import 'open_street_map_provider.dart';
import 'google_map_provider.dart';
final mapConfigProvider = Provider<MapConfig>((ref) {
return const MapConfig();
});
class MapProviderTypeNotifier extends StateNotifier<AppMapType> {
static const String _prefKey = 'selected_map_provider_type';
MapProviderTypeNotifier() : super(AppMapType.openStreetMap) {
_loadFromPrefs();
}
Future<void> _loadFromPrefs() async {
final prefs = await SharedPreferences.getInstance();
final savedVal = prefs.getString(_prefKey);
if (savedVal != null) {
if (savedVal == 'googleMaps') {
state = AppMapType.googleMaps;
} else {
state = AppMapType.openStreetMap;
}
}
}
Future<void> setMapProviderType(AppMapType type) async {
state = type;
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_prefKey, type.name);
}
}
final mapProviderTypeNotifierProvider =
StateNotifierProvider<MapProviderTypeNotifier, AppMapType>((ref) {
return MapProviderTypeNotifier();
});
final openStreetMapProviderInstance = Provider<OpenStreetMapProvider>((ref) {
return OpenStreetMapProvider();
});
final googleMapProviderInstance = Provider<GoogleMapProvider>((ref) {
return GoogleMapProvider();
});
final activeMapProvider = Provider<AppMapProvider>((ref) {
final type = ref.watch(mapProviderTypeNotifierProvider);
switch (type) {
case AppMapType.openStreetMap:
return ref.watch(openStreetMapProviderInstance);
case AppMapType.googleMaps:
return ref.watch(googleMapProviderInstance);
}
});
class MapFollowNotifier extends StateNotifier<bool> {
MapFollowNotifier() : super(true);
void setFollow(bool follow) {
state = follow;
}
void userInteracted() {
state = false;
}
void recenter() {
state = true;
}
}
final mapFollowStateProvider =
StateNotifierProvider<MapFollowNotifier, bool>((ref) {
return MapFollowNotifier();
});