Offline rediness
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../brick/cache_warmer.dart';
|
||||
import 'attendance_provider.dart';
|
||||
|
||||
class OfflineReadinessState {
|
||||
final bool hasWarmedOnce;
|
||||
final Map<String, int> cacheCounts;
|
||||
final int pendingCheckIns;
|
||||
final int pendingUpdates;
|
||||
final int pendingPhotos;
|
||||
|
||||
const OfflineReadinessState({
|
||||
required this.hasWarmedOnce,
|
||||
required this.cacheCounts,
|
||||
required this.pendingCheckIns,
|
||||
required this.pendingUpdates,
|
||||
required this.pendingPhotos,
|
||||
});
|
||||
|
||||
bool get isReady {
|
||||
if (!hasWarmedOnce) return false;
|
||||
const critical = ['tasks', 'profiles', 'duty_schedules', 'attendance_logs'];
|
||||
return critical.every((t) => (cacheCounts[t] ?? -1) >= 0);
|
||||
}
|
||||
|
||||
int get totalPending => pendingCheckIns + pendingUpdates;
|
||||
}
|
||||
|
||||
final offlineReadinessProvider =
|
||||
FutureProvider.autoDispose<OfflineReadinessState>((ref) async {
|
||||
final counts = await CacheWarmer.readCacheCounts();
|
||||
final pendingCheckIns = ref.watch(offlinePendingCheckInsProvider).length;
|
||||
final pendingUpdatesMap = ref.watch(offlinePendingAttendanceUpdatesProvider);
|
||||
final pendingUpdates = pendingUpdatesMap.length;
|
||||
final pendingPhotos = pendingUpdatesMap.values
|
||||
.where((f) => f.containsKey('_local_photo_path'))
|
||||
.length;
|
||||
|
||||
return OfflineReadinessState(
|
||||
hasWarmedOnce: CacheWarmer.hasWarmedOnce,
|
||||
cacheCounts: counts,
|
||||
pendingCheckIns: pendingCheckIns,
|
||||
pendingUpdates: pendingUpdates,
|
||||
pendingPhotos: pendingPhotos,
|
||||
);
|
||||
});
|
||||
Reference in New Issue
Block a user