fix: Differenzierte Sync-Aktivitätsmeldungen

- Neues SyncActivityMessage.CheckingForChanges 'Prüfe auf Änderungen…'
  wird beim initialen Catch-up nach Connect angezeigt (statt dem
  irreführenden 'Empfange Inventar-Update…')
- Neues SyncActivityMessage.NoChanges 'Keine Änderungen'
  wird angezeigt wenn der initiale Sync keine Daten zurückliefert
- Echter Server-Push (InventoryUpdated/FullSyncRequired) zeigt weiterhin
  'Empfange Inventar-Update…' → jede echte Kommunikation bleibt sichtbar
This commit is contained in:
Jens Reinemann 2026-05-17 20:27:49 +02:00
parent aafb9ddd64
commit fdc016c786
2 changed files with 22 additions and 4 deletions

View file

@ -92,7 +92,7 @@ internal class SettingsViewModel @Inject constructor(
showActivity(SyncActivityMessage.Error(event.message)) showActivity(SyncActivityMessage.Error(event.message))
} }
is WebSocketEvent.Connected -> { is WebSocketEvent.Connected -> {
pullSync(fullSync = false, silent = true) pullSync(fullSync = false, isInitialConnect = true)
} }
else -> {} else -> {}
} }
@ -432,10 +432,13 @@ internal class SettingsViewModel @Inject constructor(
} }
} }
fun pullSync(fullSync: Boolean = false, silent: Boolean = false) { fun pullSync(fullSync: Boolean = false, isInitialConnect: Boolean = false) {
viewModelScope.launch { viewModelScope.launch {
_uiState.update { it.copy(isSyncing = true) } _uiState.update { it.copy(isSyncing = true) }
if (!silent) showActivity(SyncActivityMessage.ReceivingUpdate) showActivity(
if (isInitialConnect) SyncActivityMessage.CheckingForChanges
else SyncActivityMessage.ReceivingUpdate
)
try { try {
val since = if (fullSync) null else settingsRepository.getStringOrNull(StringKey.SyncLastTimestamp)?.toLongOrNull() val since = if (fullSync) null else settingsRepository.getStringOrNull(StringKey.SyncLastTimestamp)?.toLongOrNull()
val result = syncService.downloadInventory(since) val result = syncService.downloadInventory(since)
@ -452,7 +455,14 @@ internal class SettingsViewModel @Inject constructor(
lastSyncTime = formatTimestamp(now) lastSyncTime = formatTimestamp(now)
) )
} }
showActivity(SyncActivityMessage.InventorySynced) val hasChanges = inventoryDto.items.isNotEmpty()
|| inventoryDto.deletedItemIds.isNotEmpty()
|| inventoryDto.categories.isNotEmpty()
|| inventoryDto.locations.isNotEmpty()
showActivity(
if (isInitialConnect && !hasChanges) SyncActivityMessage.NoChanges
else SyncActivityMessage.InventorySynced
)
}, },
onFailure = { e -> onFailure = { e ->
_uiState.update { it.copy(isSyncing = false) } _uiState.update { it.copy(isSyncing = false) }

View file

@ -8,6 +8,14 @@ internal sealed interface SyncActivityMessage {
override val text = "Empfange Inventar-Update…" override val text = "Empfange Inventar-Update…"
} }
data object CheckingForChanges : SyncActivityMessage {
override val text = "Prüfe auf Änderungen…"
}
data object NoChanges : SyncActivityMessage {
override val text = "Keine Änderungen"
}
data object SendingChange : SyncActivityMessage { data object SendingChange : SyncActivityMessage {
override val text = "Sende Änderung…" override val text = "Sende Änderung…"
} }