48 lines
1.5 KiB
Dart
48 lines
1.5 KiB
Dart
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,
|
|
);
|
|
});
|