srs/lib/core/providers.dart
Aswin Biju 125f4d3e86
All checks were successful
deploy / deploy (push) Successful in 5m18s
feat: loading skeletons, pull-to-refresh and reload bar on list screens
2026-11-05 08:04:55 +05:30

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;
}