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))
}
is WebSocketEvent.Connected -> {
pullSync(fullSync = false, silent = true)
pullSync(fullSync = false, isInitialConnect = true)
}
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 {
_uiState.update { it.copy(isSyncing = true) }
if (!silent) showActivity(SyncActivityMessage.ReceivingUpdate)
showActivity(
if (isInitialConnect) SyncActivityMessage.CheckingForChanges
else SyncActivityMessage.ReceivingUpdate
)
try {
val since = if (fullSync) null else settingsRepository.getStringOrNull(StringKey.SyncLastTimestamp)?.toLongOrNull()
val result = syncService.downloadInventory(since)
@ -452,7 +455,14 @@ internal class SettingsViewModel @Inject constructor(
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 ->
_uiState.update { it.copy(isSyncing = false) }

View file

@ -8,6 +8,14 @@ internal sealed interface SyncActivityMessage {
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 {
override val text = "Sende Änderung…"
}