77 lines
2.1 KiB
Dart
77 lines
2.1 KiB
Dart
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/features/sync/sync_auto_trigger_controller.dart';
|
|
import 'package:relationship_saver/features/sync/sync_coordinator.dart';
|
|
|
|
/// Runs lightweight background sync triggers while authenticated.
|
|
class SyncBackgroundRunner extends ConsumerStatefulWidget {
|
|
const SyncBackgroundRunner({required this.child, super.key});
|
|
|
|
final Widget child;
|
|
|
|
@override
|
|
ConsumerState<SyncBackgroundRunner> createState() =>
|
|
_SyncBackgroundRunnerState();
|
|
}
|
|
|
|
class _SyncBackgroundRunnerState extends ConsumerState<SyncBackgroundRunner>
|
|
with WidgetsBindingObserver {
|
|
late final SyncAutoTriggerController _controller;
|
|
Timer? _periodicTimer;
|
|
|
|
@override
|
|
void initState() {
|
|
super.initState();
|
|
_controller = SyncAutoTriggerController(
|
|
syncNow: () => ref.read(syncCoordinatorProvider).syncNow(),
|
|
now: DateTime.now,
|
|
minimumInterval: Duration(
|
|
seconds: AppConfig.backgroundSyncIntervalSeconds,
|
|
),
|
|
);
|
|
WidgetsBinding.instance.addObserver(this);
|
|
_configurePeriodicRunner();
|
|
if (AppConfig.enableBackgroundSync) {
|
|
unawaited(_controller.trigger(ignoreCooldown: true));
|
|
}
|
|
}
|
|
|
|
@override
|
|
void didChangeAppLifecycleState(AppLifecycleState state) {
|
|
if (!AppConfig.enableBackgroundSync) {
|
|
return;
|
|
}
|
|
if (state == AppLifecycleState.resumed) {
|
|
unawaited(_controller.trigger(ignoreCooldown: true));
|
|
}
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
WidgetsBinding.instance.removeObserver(this);
|
|
_periodicTimer?.cancel();
|
|
super.dispose();
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) => widget.child;
|
|
|
|
void _configurePeriodicRunner() {
|
|
if (!AppConfig.enableBackgroundSync) {
|
|
return;
|
|
}
|
|
|
|
final int seconds = AppConfig.backgroundSyncIntervalSeconds;
|
|
if (seconds <= 0) {
|
|
return;
|
|
}
|
|
|
|
_periodicTimer = Timer.periodic(Duration(seconds: seconds), (_) {
|
|
unawaited(_controller.trigger());
|
|
});
|
|
}
|
|
}
|