MotorSignal-App/lib/services/alerts/road_alert_providers.dart

120 lines
3.7 KiB
Dart

import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'road_alert_models.dart';
import 'road_alert_provider_interface.dart';
import 'tomtom_road_alert_provider.dart';
import 'local_road_alert_provider.dart';
final tomtomProviderInstance = Provider<TomTomRoadAlertProvider>((ref) {
return TomTomRoadAlertProvider();
});
final localProviderInstance = Provider<LocalRoadAlertProvider>((ref) {
return LocalRoadAlertProvider();
});
// Master Enable
class RoadAlertsEnabledNotifier extends StateNotifier<bool> {
static const _key = 'road_alerts_enabled';
RoadAlertsEnabledNotifier() : super(true) {
_load();
}
Future<void> _load() async {
final prefs = await SharedPreferences.getInstance();
state = prefs.getBool(_key) ?? true;
}
Future<void> setEnabled(bool enabled) async {
state = enabled;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool(_key, enabled);
}
}
final roadAlertsEnabledProvider =
StateNotifierProvider<RoadAlertsEnabledNotifier, bool>((ref) {
return RoadAlertsEnabledNotifier();
});
// Audio Alerts Toggle
class AudioAlertsEnabledNotifier extends StateNotifier<bool> {
static const _key = 'audio_alerts_enabled';
AudioAlertsEnabledNotifier() : super(true) {
_load();
}
Future<void> _load() async {
final prefs = await SharedPreferences.getInstance();
state = prefs.getBool(_key) ?? true;
}
Future<void> setEnabled(bool enabled) async {
state = enabled;
final prefs = await SharedPreferences.getInstance();
await prefs.setBool(_key, enabled);
}
}
final audioAlertsEnabledProvider =
StateNotifierProvider<AudioAlertsEnabledNotifier, bool>((ref) {
return AudioAlertsEnabledNotifier();
});
// Alert Radius in Meters (500ft = 152.4m, 1000ft = 304.8m, 0.25mi = 402.3m, 0.5mi = 804.7m, 1mi = 1609.3m)
class AlertRadiusMetersNotifier extends StateNotifier<double> {
static const _key = 'alert_radius_meters';
AlertRadiusMetersNotifier() : super(804.7) {
_load();
}
Future<void> _load() async {
final prefs = await SharedPreferences.getInstance();
state = prefs.getDouble(_key) ?? 804.7;
}
Future<void> setRadius(double radiusMeters) async {
state = radiusMeters;
final prefs = await SharedPreferences.getInstance();
await prefs.setDouble(_key, radiusMeters);
}
}
final alertRadiusMetersProvider =
StateNotifierProvider<AlertRadiusMetersNotifier, double>((ref) {
return AlertRadiusMetersNotifier();
});
// TomTom API Key
class TomTomApiKeyNotifier extends StateNotifier<String> {
static const _key = 'tomtom_api_key';
TomTomApiKeyNotifier() : super('') {
_load();
}
Future<void> _load() async {
final prefs = await SharedPreferences.getInstance();
state = prefs.getString(_key) ?? '';
}
Future<void> setApiKey(String apiKey) async {
state = apiKey.trim();
final prefs = await SharedPreferences.getInstance();
await prefs.setString(_key, state);
}
}
final tomtomApiKeyProvider =
StateNotifierProvider<TomTomApiKeyNotifier, String>((ref) {
return TomTomApiKeyNotifier();
});
// TomTom Connection Status
final tomtomStatusProvider = StateProvider<RoadAlertProviderStatus>((ref) {
final key = ref.watch(tomtomApiKeyProvider);
if (key.isEmpty) {
return RoadAlertProviderStatus.notConfigured;
}
return RoadAlertProviderStatus.configured;
});
// Active Providers List
final activeRoadAlertProviders = Provider<List<RoadAlertProvider>>((ref) {
final tomtomKey = ref.watch(tomtomApiKeyProvider);
final list = <RoadAlertProvider>[];
if (tomtomKey.isNotEmpty) {
list.add(ref.watch(tomtomProviderInstance));
}
// Include demo local provider as fallback/demo
list.add(ref.watch(localProviderInstance));
return list;
});