fix: correct bulk session delete endpoint + surface deleted count (#653)

* fix: correct bulk session delete endpoint + surface deleted count

- Fix Retrofit @POST path from 'api/sessions/delete' to 'api/sessions/bulk-delete'
- Change response type from Response<Unit> to Response<BulkDeleteResponse>
- Add BulkDeleteResponse model (ok, deleted) matching backend contract
- Surface backend 'deleted' count in toast message instead of using client-side count

Backend contract (web_server.py:10750):
  POST /api/sessions/bulk-delete
  Body: { "ids": [...], "delete_all": false }
  Response: { "ok": true, "deleted": <count> }

Fixes #651

* fix: replace client-side session list filter with full refresh after bulk delete

- Call loadSessions() + loadStats() after successful bulk delete instead of
  filtering sessions/searchResults locally via 'ids' — fixes state desync
  when backend deletes fewer sessions than requested (partial success) and
  is correct for delete_all=true where ids may be empty
- Show 'No sessions were deleted' toast when deletedCount == 0
- Extract toastMsg to separate val to satisfy ktlint lint rules

Addresses review findings: UI state desync, delete_all handling, hardcoded
pluralizing, and zero-deletion UX.

---------

Co-authored-by: M57 <Hy4ri@users.noreply.github.com>
This commit is contained in:
M57andM57 authored and GitHub committed 2026-07-21 12:43:06 +03:00
1 parent a62bc7e16c
commit e12a23befe
3 files changed
+19 -6

No files matched your search

@@ -401,17 +401,23 @@ class SessionsViewModel : ViewModel(), ToastHost {
}
when (result) {
is NetworkResult.Success -> {
val deletedCount = result.data.deleted
val toastMsg =
if (deletedCount > 0) {
"$deletedCount session(s) deleted"
} else {
"No sessions were deleted"
}
_uiState.update {
it.copy(
isDeletingBulk = false,
isSelecting = false,
selectedIds = emptySet(),
sessions = it.sessions.filter { s -> s.id !in ids },
searchResults = it.searchResults.filter { it.session_id !in ids },
total = (it.total - ids.size).coerceAtLeast(0),
toastMessage = "${ids.size} session(s) deleted",
toastMessage = toastMsg,
)
}
loadSessions()
loadStats()
}
is NetworkResult.Failure -> {