97 lines
2.6 KiB
Dart
97 lines
2.6 KiB
Dart
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<MapConfig>((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<AppMapType> {
|
|
static const String _prefKey = 'selected_map_provider_type';
|
|
|
|
MapProviderTypeNotifier() : super(AppMapType.awsMaps) {
|
|
_loadFromPrefs();
|
|
}
|
|
|
|
Future<void> _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<void> setMapProviderType(AppMapType type) async {
|
|
state = type;
|
|
try {
|
|
final prefs = await SharedPreferences.getInstance();
|
|
await prefs.setString(_prefKey, type.name);
|
|
} catch (_) {}
|
|
}
|
|
}
|
|
|
|
|
|
final mapProviderTypeNotifierProvider =
|
|
StateNotifierProvider<MapProviderTypeNotifier, AppMapType>((ref) {
|
|
return MapProviderTypeNotifier();
|
|
});
|
|
|
|
final openStreetMapProviderInstance = Provider<OpenStreetMapProvider>((ref) {
|
|
return OpenStreetMapProvider();
|
|
});
|
|
|
|
final googleMapProviderInstance = Provider<GoogleMapProvider>((ref) {
|
|
return GoogleMapProvider();
|
|
});
|
|
|
|
final awsMapProviderInstance = Provider<AwsMapProvider>((ref) {
|
|
return AwsMapProvider();
|
|
});
|
|
|
|
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);
|
|
case AppMapType.awsMaps:
|
|
return ref.watch(awsMapProviderInstance);
|
|
}
|
|
});
|
|
|
|
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();
|
|
});
|