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
@@ -4,18 +4,22 @@ import 'package:flutter/foundation.dart';
import 'package:relationship_saver/features/sync/sync_coordinator.dart';
typedef SyncNowRunner = Future<SyncRunResult> Function();
typedef TriggerGate = Future<bool> Function();
/// Coordinates auto-triggered sync calls with cooldown and concurrency guards.
class SyncAutoTriggerController {
SyncAutoTriggerController({
required SyncNowRunner syncNow,
required DateTime Function() now,
TriggerGate? canTrigger,
this.minimumInterval = const Duration(minutes: 3),
}) : _syncNow = syncNow,
_now = now;
_now = now,
_canTrigger = canTrigger ?? _alwaysAllowed;
final SyncNowRunner _syncNow;
final DateTime Function() _now;
final TriggerGate _canTrigger;
final Duration minimumInterval;
bool _running = false;
@@ -45,6 +49,10 @@ class SyncAutoTriggerController {
return false;
}
if (!await _canTrigger()) {
return false;
}
_running = true;
_lastTriggeredAt = now;
try {
@@ -71,4 +79,6 @@ class SyncAutoTriggerController {
final int multiplier = 1 << cappedFailures;
return minimumInterval * multiplier;
}
static Future<bool> _alwaysAllowed() async => true;
}
@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:flutter/widgets.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:relationship_saver/core/config/app_config.dart';
import 'package:relationship_saver/core/network/reachability/network_reachability_provider.dart';
import 'package:relationship_saver/features/sync/sync_auto_trigger_controller.dart';
import 'package:relationship_saver/features/sync/sync_coordinator.dart';
@@ -31,6 +32,12 @@ class _SyncBackgroundRunnerState extends ConsumerState<SyncBackgroundRunner>
minimumInterval: Duration(
seconds: AppConfig.backgroundSyncIntervalSeconds,
),
canTrigger: () async {
if (AppConfig.useFakeBackend) {
return true;
}
return ref.read(networkReachabilityProvider).isReachable();
},
);
WidgetsBinding.instance.addObserver(this);
_configurePeriodicRunner();