124 lines
3.1 KiB
Dart
124 lines
3.1 KiB
Dart
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|
|
|
import 'api.dart';
|
|
import 'format.dart';
|
|
import 'models.dart';
|
|
|
|
final apiProvider = Provider<Api>((ref) => throw UnimplementedError());
|
|
|
|
final startDateProvider = Provider<DateTime>(
|
|
(ref) => throw UnimplementedError(),
|
|
);
|
|
|
|
class DataVersion extends Notifier<int> {
|
|
@override
|
|
int build() => 0;
|
|
void bump() => state++;
|
|
}
|
|
|
|
final dataVersionProvider = NotifierProvider<DataVersion, int>(DataVersion.new);
|
|
|
|
class SessionNotifier extends Notifier<AppUser?> {
|
|
SessionNotifier(this.initial);
|
|
final AppUser? initial;
|
|
|
|
@override
|
|
AppUser? build() {
|
|
final sub = ref.read(apiProvider).sessionEnded.listen((_) => _end());
|
|
ref.onDispose(sub.cancel);
|
|
return initial;
|
|
}
|
|
|
|
Future<void> login(String username, String password) async {
|
|
final api = ref.read(apiProvider);
|
|
final u = await api.login(username, password);
|
|
try {
|
|
ref.read(selectedDateProvider.notifier).set(await api.latestDrawDate());
|
|
} on ApiException {
|
|
// ignore: empty_catches
|
|
}
|
|
state = u;
|
|
}
|
|
|
|
Future<void> logout() async {
|
|
ref.read(apiProvider).logout();
|
|
_end();
|
|
}
|
|
|
|
void _end() {
|
|
state = null;
|
|
ref.invalidate(selectedDateProvider);
|
|
}
|
|
}
|
|
|
|
final sessionProvider = NotifierProvider<SessionNotifier, AppUser?>(
|
|
() => SessionNotifier(null),
|
|
);
|
|
|
|
class SelectedDate extends Notifier<DateTime> {
|
|
@override
|
|
DateTime build() => ref.read(startDateProvider);
|
|
void set(DateTime d) => state = dateOnly(d);
|
|
}
|
|
|
|
final selectedDateProvider = NotifierProvider<SelectedDate, DateTime>(
|
|
SelectedDate.new,
|
|
);
|
|
|
|
final resultsProvider = FutureProvider.family<DrawResults, DateTime>((ref, d) {
|
|
ref.watch(dataVersionProvider);
|
|
return ref.read(apiProvider).results(d);
|
|
});
|
|
|
|
final shopsProvider = FutureProvider.family<List<ShopDay>, DateTime>((ref, d) {
|
|
ref.watch(dataVersionProvider);
|
|
return ref.read(apiProvider).shops(d);
|
|
});
|
|
|
|
final shopDetailProvider = FutureProvider.family<ShopDetail, (int, DateTime)>((
|
|
ref,
|
|
k,
|
|
) {
|
|
ref.watch(dataVersionProvider);
|
|
return ref.read(apiProvider).shopDetail(k.$1, k.$2);
|
|
});
|
|
|
|
final ordersProvider = FutureProvider.family<List<Order>, DateTime>((ref, d) {
|
|
ref.watch(dataVersionProvider);
|
|
return ref.read(apiProvider).orders(d);
|
|
});
|
|
|
|
final orderProvider = FutureProvider.family<Order, int>((ref, id) {
|
|
ref.watch(dataVersionProvider);
|
|
return ref.read(apiProvider).order(id);
|
|
});
|
|
|
|
final monthProvider = FutureProvider.family<List<DrawInfo>, (int, int)>((
|
|
ref,
|
|
k,
|
|
) {
|
|
ref.watch(dataVersionProvider);
|
|
return ref.read(apiProvider).month(k.$1, k.$2);
|
|
});
|
|
|
|
final activeShopsProvider = FutureProvider<List<Shop>>((ref) {
|
|
ref.watch(dataVersionProvider);
|
|
return ref.read(apiProvider).activeShops();
|
|
});
|
|
|
|
final usersProvider = FutureProvider<List<AppUser>>((ref) {
|
|
ref.watch(dataVersionProvider);
|
|
return ref.read(apiProvider).users();
|
|
});
|
|
|
|
final userProvider = FutureProvider.family<AppUser, int>((ref, id) {
|
|
ref.watch(dataVersionProvider);
|
|
return ref.read(apiProvider).user(id);
|
|
});
|
|
|
|
Future<T> mutate<T>(WidgetRef ref, Future<T> Function() fn) async {
|
|
final r = await fn();
|
|
ref.read(dataVersionProvider.notifier).bump();
|
|
return r;
|
|
}
|