import 'dart:async'; import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:info_tren/api/station_data.dart'; import 'package:info_tren/models.dart'; import 'package:info_tren/pages/station_arrdep_page/view_station/view_station.dart'; import 'package:info_tren/pages/train_info_page/view_train/train_info.dart'; import 'package:info_tren/utils/default_ui_design.dart'; import 'package:info_tren/utils/iterable_extensions.dart'; import 'package:shared_preferences/shared_preferences.dart'; final sharedPreferencesProvider = Provider( (_) => throw UnimplementedError('Please override in ProviderScope'), ); class UiDesignNotifier extends StateNotifier { final SharedPreferences sharedPreferences; UiDesignNotifier({required this.sharedPreferences,}) : super(UiDesign.MATERIAL) { final stored = sharedPreferences.getString('uiDesign'); final design = UiDesign.values.where((element) => element.name == stored).firstOrNull ?? defaultUiDesign; state = design; } void set(UiDesign? design) async { if (design != null) { await sharedPreferences.setString('uiDesign', design.name); } else { await sharedPreferences.remove('uiDesign'); } state = design ?? defaultUiDesign; } } final uiDesignProvider = StateNotifierProvider( (ref) => UiDesignNotifier( sharedPreferences: ref.watch(sharedPreferencesProvider), ), ); final trainInfoArgumentsProvider = Provider( (_) => throw UnimplementedError('Please override in ProviderScope'), ); final stationDataProvider = FutureProvider.family((ref, String stationName) async { final data = await getStationData(stationName); final timer = Timer(const Duration(minutes: 2), () { ref.invalidateSelf(); }); ref.onDispose(() { timer.cancel(); }); return data; }); final viewStationArgumentsProvider = Provider( (_) => throw UnimplementedError('Please override in ProviderScope'), ); final viewStationDataProvider = Provider((ref) { final args = ref.watch(viewStationArgumentsProvider); final data = ref.watch(stationDataProvider(args.stationName)); return data; }, dependencies: [viewStationArgumentsProvider, stationDataProvider]);