68 lines
1.5 KiB
Dart
68 lines
1.5 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
import 'mothership_chat_client.dart';
|
|
|
|
class ChatSyncScheduler with WidgetsBindingObserver {
|
|
ChatSyncScheduler({Duration? interval}) : _interval = interval ?? const Duration(seconds: 10);
|
|
|
|
final Duration _interval;
|
|
final MothershipChatClient _chatClient = MothershipChatClient();
|
|
|
|
Timer? _timer;
|
|
bool _started = false;
|
|
bool _syncing = false;
|
|
bool _appActive = true;
|
|
|
|
void start() {
|
|
if (_started) return;
|
|
_started = true;
|
|
final binding = WidgetsBinding.instance;
|
|
binding.addObserver(this);
|
|
_appActive = _isActiveState(binding.lifecycleState);
|
|
if (_appActive) {
|
|
_scheduleImmediate();
|
|
}
|
|
}
|
|
|
|
void stop() {
|
|
if (!_started) return;
|
|
WidgetsBinding.instance.removeObserver(this);
|
|
_timer?.cancel();
|
|
_timer = null;
|
|
_started = false;
|
|
}
|
|
|
|
void dispose() => stop();
|
|
|
|
void _scheduleImmediate() {
|
|
_timer?.cancel();
|
|
_runSync();
|
|
_timer = Timer.periodic(_interval, (_) => _runSync());
|
|
}
|
|
|
|
void _runSync() {
|
|
if (!_appActive || _syncing) return;
|
|
_syncing = true;
|
|
unawaited(_chatClient.sync().whenComplete(() {
|
|
_syncing = false;
|
|
}));
|
|
}
|
|
|
|
bool _isActiveState(AppLifecycleState? state) {
|
|
return state == null || state == AppLifecycleState.resumed;
|
|
}
|
|
|
|
@override
|
|
void didChangeAppLifecycleState(AppLifecycleState state) {
|
|
_appActive = _isActiveState(state);
|
|
if (!_started) return;
|
|
if (_appActive) {
|
|
_scheduleImmediate();
|
|
} else {
|
|
_timer?.cancel();
|
|
_timer = null;
|
|
}
|
|
}
|
|
}
|