info_tren/lib/providers.dart

106 lines
3.5 KiB
Dart
Raw Permalink Normal View History

2022-11-10 06:26:10 +01:00
import 'dart:async';
2022-12-11 01:34:19 +01:00
import 'dart:developer';
2022-11-10 06:26:10 +01:00
2022-10-31 03:44:29 +01:00
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:info_tren/api/station_data.dart';
2023-07-24 06:55:16 +02:00
import 'package:info_tren/api/train_data.dart';
2022-10-31 03:44:29 +01:00
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';
2023-07-24 06:55:16 +02:00
import 'package:riverpod_annotation/riverpod_annotation.dart';
2022-10-31 03:44:29 +01:00
import 'package:shared_preferences/shared_preferences.dart';
2023-07-24 06:55:16 +02:00
part 'providers.g.dart';
2022-10-31 03:44:29 +01:00
final sharedPreferencesProvider = Provider<SharedPreferences>(
(_) => throw UnimplementedError('Please override in ProviderScope'),
);
2022-11-19 05:35:51 +01:00
class UiDesignNotifier extends StateNotifier<UiDesign> {
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;
2022-10-31 03:44:29 +01:00
}
2022-11-19 05:35:51 +01:00
void set(UiDesign? design) async {
if (design != null) {
await sharedPreferences.setString('uiDesign', design.name);
}
else {
await sharedPreferences.remove('uiDesign');
}
state = design ?? defaultUiDesign;
2022-10-31 03:44:29 +01:00
}
}
2022-11-19 05:35:51 +01:00
final uiDesignProvider = StateNotifierProvider<UiDesignNotifier, UiDesign>(
(ref) => UiDesignNotifier(
sharedPreferences: ref.watch(sharedPreferencesProvider),
),
2022-12-11 01:34:19 +01:00
dependencies: [sharedPreferencesProvider],
);
class UiTimeZoneNotifier extends StateNotifier<UiTimeZone> {
final SharedPreferences sharedPreferences;
UiTimeZoneNotifier({required this.sharedPreferences,}) : super(const RoUiTimeZone()) {
final stored = sharedPreferences.getString('uiTimeZone');
if (stored != null) {
try {
state = UiTimeZone.fromSerString(stored);
}
catch (e) {
log('Invalid UiTimeZone ser: $stored, error: $e', level: 1000);
}
}
}
void set(UiTimeZone? timeZone) async {
if (timeZone != null) {
await sharedPreferences.setString('uiTimeZone', timeZone.toSerString());
}
else {
await sharedPreferences.remove('uiTimeZone');
}
state = timeZone ?? const LocalUiTimeZone();
}
}
final uiTimeZoneProvider = StateNotifierProvider<UiTimeZoneNotifier, UiTimeZone>(
(ref) => UiTimeZoneNotifier(
sharedPreferences: ref.watch(sharedPreferencesProvider),
),
dependencies: [sharedPreferencesProvider],
2022-11-19 05:35:51 +01:00
);
2022-10-31 03:44:29 +01:00
final trainInfoArgumentsProvider = Provider<TrainInfoArguments>(
(_) => throw UnimplementedError('Please override in ProviderScope'),
);
2023-07-24 06:55:16 +02:00
final stationDataProvider = FutureProvider.family((ref, ViewStationArguments args) async {
final data = await getStationData(args.stationName, args.date);
2022-11-10 06:26:10 +01:00
final timer = Timer(const Duration(minutes: 2), () {
ref.invalidateSelf();
});
ref.onDispose(() {
timer.cancel();
});
return data;
});
2022-10-31 03:44:29 +01:00
final viewStationArgumentsProvider = Provider<ViewStationArguments>(
(_) => throw UnimplementedError('Please override in ProviderScope'),
);
final viewStationDataProvider = Provider((ref) {
final args = ref.watch(viewStationArgumentsProvider);
2023-07-24 06:55:16 +02:00
final data = ref.watch(stationDataProvider(args));
2022-10-31 03:44:29 +01:00
return data;
2022-11-10 06:26:10 +01:00
}, dependencies: [viewStationArgumentsProvider, stationDataProvider]);
2023-07-24 06:55:16 +02:00
@Riverpod(keepAlive: true)
Future<TrainData> trainInfo(TrainInfoRef ref, {required String trainNumber, DateTime? date}) => getTrain(trainNumber, date: date);