fix(mobile): run one more sync round when a request arrives mid sync (#30478)

* fix(mobile): run one more sync round when a request arrives mid sync

* fix(mobile): only queue the extra sync round when the caller asks for it

* fix(mobile): skip the queued sync round when the sync fails

* clear the sync task in whenComplete and gate the queued round on the result

* simplify the queued flag gate
This commit is contained in:
Santo Shakil 2026-08-04 20:59:19 +06:00 committed by GitHub
parent 79d485c759
commit 7121e0a75c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 11 additions and 3 deletions

View file

@ -28,6 +28,7 @@ class BackgroundSyncManager {
final SyncErrorCallback? onCloudIdSyncError;
Cancelable<bool?>? _syncTask;
bool _syncQueued = false;
Cancelable<void>? _syncWebsocketTask;
Cancelable<void>? _cloudIdSyncTask;
Cancelable<void>? _deviceAlbumSyncTask;
@ -50,6 +51,7 @@ class BackgroundSyncManager {
});
Future<void> cancel() async {
_syncQueued = false;
final tasks = [
_syncTask,
_syncWebsocketTask,
@ -133,8 +135,9 @@ class BackgroundSyncManager {
});
}
Future<bool> syncRemote() {
Future<bool> syncRemote({bool enqueue = false}) {
if (_syncTask != null) {
_syncQueued |= enqueue;
return _syncTask!.future.then((result) => result ?? false).catchError((_) => false);
}
@ -148,15 +151,20 @@ class BackgroundSyncManager {
.then((result) {
final success = result ?? false;
onRemoteSyncComplete?.call(success);
_syncQueued &= success;
return success;
})
.catchError((error) {
onRemoteSyncError?.call(error.toString());
_syncTask = null;
_syncQueued = false;
return false;
})
.whenComplete(() {
_syncTask = null;
if (_syncQueued) {
_syncQueued = false;
unawaited(syncRemote());
}
});
}

View file

@ -187,7 +187,7 @@ class WebsocketNotifier extends StateNotifier<WebsocketState> {
}
void _handleRemoteChange(dynamic _) {
unawaited(_ref.read(backgroundSyncProvider).syncRemote());
unawaited(_ref.read(backgroundSyncProvider).syncRemote(enqueue: true));
}
void _handleSyncAssetEditReadyV2(dynamic data) {