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 createState() => _SyncBackgroundRunnerState(); } class _SyncBackgroundRunnerState extends ConsumerState 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()); }); } }