Gate auto sync with network reachability checks

This commit is contained in:
Rijad Zuzo
2026-02-15 23:31:34 +01:00
parent 54321e8b64
commit 04d269ae10
10 changed files with 145 additions and 2 deletions
@@ -0,0 +1,13 @@
import 'package:relationship_saver/core/network/reachability/network_reachability_stub.dart'
if (dart.library.html) 'package:relationship_saver/core/network/reachability/network_reachability_web.dart'
if (dart.library.io) 'package:relationship_saver/core/network/reachability/network_reachability_io.dart';
/// Runtime network reachability probe.
abstract class NetworkReachability {
/// Returns `true` when network looks reachable.
Future<bool> isReachable({Duration timeout = const Duration(seconds: 2)});
}
/// Returns platform implementation for network reachability probing.
NetworkReachability createNetworkReachability() =>
createPlatformNetworkReachability();
@@ -0,0 +1,25 @@
import 'dart:async';
import 'dart:io';
import 'package:relationship_saver/core/network/reachability/network_reachability.dart';
class IoNetworkReachability implements NetworkReachability {
@override
Future<bool> isReachable({
Duration timeout = const Duration(seconds: 2),
}) async {
try {
final List<InternetAddress> result = await InternetAddress.lookup(
'example.com',
).timeout(timeout);
return result.isNotEmpty && result.first.rawAddress.isNotEmpty;
} on SocketException {
return false;
} on TimeoutException {
return false;
}
}
}
NetworkReachability createPlatformNetworkReachability() =>
IoNetworkReachability();
@@ -0,0 +1,8 @@
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:relationship_saver/core/network/reachability/network_reachability.dart';
/// Provides runtime reachability implementation used for sync triggers.
final Provider<NetworkReachability> networkReachabilityProvider =
Provider<NetworkReachability>((Ref ref) {
return createNetworkReachability();
});
@@ -0,0 +1,13 @@
import 'package:relationship_saver/core/network/reachability/network_reachability.dart';
class StubNetworkReachability implements NetworkReachability {
@override
Future<bool> isReachable({
Duration timeout = const Duration(seconds: 2),
}) async {
return true;
}
}
NetworkReachability createPlatformNetworkReachability() =>
StubNetworkReachability();
@@ -0,0 +1,14 @@
import 'package:relationship_saver/core/network/reachability/network_reachability.dart';
class WebNetworkReachability implements NetworkReachability {
@override
Future<bool> isReachable({
Duration timeout = const Duration(seconds: 2),
}) async {
// Web environments vary in available probes; keep optimistic fallback.
return true;
}
}
NetworkReachability createPlatformNetworkReachability() =>
WebNetworkReachability();