From 67b4d934a4dfb566ce2743129b45a26b665b056b Mon Sep 17 00:00:00 2001 From: Onie Date: Sun, 18 Oct 2026 17:39:38 +0700 Subject: [PATCH] Offline queue: retry kirim setelah refresh/poll sukses + verifikasi server reachable + log gagal sinkron + izin INTERNET/ACCESS_NETWORK_STATE Android --- android/app/src/main/AndroidManifest.xml | 4 ++++ lib/services/offline_queue_service.dart | 20 ++++++++++++++++++++ lib/state/app_state.dart | 2 ++ 3 files changed, 26 insertions(+) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index f792ede..4507cd4 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,8 @@ + + + + diff --git a/lib/services/offline_queue_service.dart b/lib/services/offline_queue_service.dart index 645ac5f..503573f 100644 --- a/lib/services/offline_queue_service.dart +++ b/lib/services/offline_queue_service.dart @@ -60,6 +60,25 @@ class OfflineQueueService { _updateConnectionStatus(result); } + /// Coba kirim antrean sekarang. Dipanggil setiap refresh/poll sukses + /// (server terbukti reachable), bukan hanya saat event connectivity berubah. + Future retryNow() async { + await _checkConnection(); + if (!_isOnline || _queue.isEmpty || _syncing) return; + // Verifikasi server benar-benar bisa dijangkau (radio nyala belum tentu + // berarti Supabase reachable, misal sinyal buruk). + try { + await _supabase.from('products').select('id').limit(1).timeout( + const Duration(seconds: 5), + onTimeout: () => throw TimeoutException('Ping server timeout'), + ); + } catch (e) { + debugPrint('OfflineQueue skip sync: server tidak terjangkau: $e'); + return; + } + await _processQueue(); + } + void _updateConnectionStatus(List result) { _isOnline = result.any((r) => r != ConnectivityResult.none); if (_isOnline && _queue.isNotEmpty) { @@ -86,6 +105,7 @@ class OfflineQueueService { _queue.removeAt(0); await _saveQueue(); } catch (e) { + debugPrint('OfflineQueue gagal sinkron item ${item['sale']?['id']}: $e'); _syncing = false; return; } diff --git a/lib/state/app_state.dart b/lib/state/app_state.dart index f6b83f0..be5e8ea 100644 --- a/lib/state/app_state.dart +++ b/lib/state/app_state.dart @@ -224,6 +224,8 @@ class AppState extends ChangeNotifier { await _loadProducts(); await _loadSales(); dataReady = true; + // Server terbukti reachable → coba kirim antrean transaksi offline. + await _offlineQueue.retryNow(); } catch (e) { productsError ??= e.toString(); if (retries > 0) {