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