Offline rediness
This commit is contained in:
@@ -175,19 +175,55 @@ final attendanceLogsProvider = StreamProvider<List<AttendanceLog>>((ref) {
|
||||
for (final params in pendingRaw) {
|
||||
final localId = params['localId'] as String;
|
||||
try {
|
||||
await client.rpc(
|
||||
final serverId = await client.rpc(
|
||||
'attendance_check_in',
|
||||
params: {
|
||||
'p_duty_id': params['p_duty_id'],
|
||||
'p_lat': params['p_lat'],
|
||||
'p_lng': params['p_lng'],
|
||||
},
|
||||
);
|
||||
) as String?;
|
||||
syncedLocalIds.add(localId);
|
||||
// Re-key any pending verification update from local UUID → server UUID
|
||||
// so the PATCH in the updates replay hits the real attendance_logs row.
|
||||
if (serverId != null) {
|
||||
final updates = ref.read(offlinePendingAttendanceUpdatesProvider);
|
||||
if (updates.containsKey(localId)) {
|
||||
final updated = Map<String, Map<String, dynamic>>.from(updates);
|
||||
updated[serverId] = updated.remove(localId)!;
|
||||
ref
|
||||
.read(offlinePendingAttendanceUpdatesProvider.notifier)
|
||||
.state = updated;
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
final msg = e.toString();
|
||||
if (msg.contains('23505') || msg.contains('duplicate key')) {
|
||||
syncedLocalIds.add(localId);
|
||||
// Duplicate key means the log already exists on the server.
|
||||
// Look up its real ID so any pending verification photo can be re-keyed.
|
||||
try {
|
||||
final existing = await client
|
||||
.from('attendance_logs')
|
||||
.select('id')
|
||||
.eq('duty_schedule_id', params['p_duty_id'] as String)
|
||||
.order('check_in_at', ascending: false)
|
||||
.limit(1)
|
||||
.maybeSingle();
|
||||
final serverId = existing?['id'] as String?;
|
||||
if (serverId != null) {
|
||||
final updates =
|
||||
ref.read(offlinePendingAttendanceUpdatesProvider);
|
||||
if (updates.containsKey(localId)) {
|
||||
final updated =
|
||||
Map<String, Map<String, dynamic>>.from(updates);
|
||||
updated[serverId] = updated.remove(localId)!;
|
||||
ref
|
||||
.read(offlinePendingAttendanceUpdatesProvider.notifier)
|
||||
.state = updated;
|
||||
}
|
||||
}
|
||||
} catch (_) {}
|
||||
} else {
|
||||
debugPrint(
|
||||
'[attendanceLogsProvider] failed to sync check-in localId=$localId: $e',
|
||||
|
||||
Reference in New Issue
Block a user