aves_mio22/lib/remote.ok/remote_sync_bus.dart.ok
2026-04-18 20:05:02 +02:00

104 lines
2.5 KiB
Text

// lib/remote/remote_sync_bus.dart
import 'package:flutter/foundation.dart';
enum RemoteSyncState {
disabled,
syncing,
upToDate,
timeout,
networkError,
badGateway,
serverError,
serverDown,
}
class RemoteSyncProgress {
final int done;
final int total;
final bool showOverlay;
const RemoteSyncProgress({
required this.done,
required this.total,
this.showOverlay = false,
});
}
class RemoteSyncBus {
RemoteSyncBus._();
static final RemoteSyncBus instance = RemoteSyncBus._();
final ValueNotifier<RemoteSyncState> stateNotifier =
ValueNotifier(RemoteSyncState.disabled);
final ValueNotifier<RemoteSyncProgress?> progressNotifier =
ValueNotifier(null);
int _opId = 0;
int nextOp() => ++_opId;
bool _isStale(int opId) => opId != _opId;
void setDisabled() {
_opId++;
stateNotifier.value = RemoteSyncState.disabled;
progressNotifier.value = null;
}
int start({required int total, required bool showOverlay}) {
final opId = nextOp();
stateNotifier.value = RemoteSyncState.syncing;
progressNotifier.value = RemoteSyncProgress(
done: 0,
total: total,
showOverlay: showOverlay,
);
return opId;
}
void update({required int opId, required int done, required int total}) {
if (_isStale(opId)) return;
final cur = progressNotifier.value;
progressNotifier.value = RemoteSyncProgress(
done: done,
total: total,
showOverlay: cur?.showOverlay ?? false,
);
}
void finishUpToDate({required int opId}) {
if (_isStale(opId)) return;
stateNotifier.value = RemoteSyncState.upToDate;
progressNotifier.value = null;
}
void failTimeout({required int opId}) {
if (_isStale(opId)) return;
stateNotifier.value = RemoteSyncState.timeout;
progressNotifier.value = null;
}
void failNetwork({required int opId}) {
if (_isStale(opId)) return;
stateNotifier.value = RemoteSyncState.networkError;
progressNotifier.value = null;
}
void failBadGateway({required int opId}) {
if (_isStale(opId)) return;
stateNotifier.value = RemoteSyncState.badGateway;
progressNotifier.value = null;
}
void failServerError({required int opId}) {
if (_isStale(opId)) return;
stateNotifier.value = RemoteSyncState.serverError;
progressNotifier.value = null;
}
void failServerDown({required int opId}) {
if (_isStale(opId)) return;
stateNotifier.value = RemoteSyncState.serverDown;
progressNotifier.value = null;
}
}