perf: evict archived/deleted photos from cache immediately

Remove archived/restored/deleted/approved UIDs from all cached photo-list
pages right after the API confirms, so the grid updates on the same tick
instead of waiting for a network round-trip. Also removes the 400ms
doneBulk animation delay (now unnecessary since tiles vanish instantly).
This commit is contained in:
2026-06-07 21:53:16 +02:00
parent 5da1022ed1
commit 1df16a6142
5 changed files with 41 additions and 3 deletions

View File

@@ -13,6 +13,7 @@
import { useQueryClient } from '@tanstack/svelte-query';
import { toast } from 'svelte-sonner';
import { batchArchive } from '$lib/services/photoprism';
import { evictFromCache } from '$lib/services/bulk';
import { startBulk, doneBulk, failBulk } from '$lib/stores/bulkAction.svelte';
import PhotoGrid from '$lib/components/timeline/PhotoGrid.svelte';
import { type ReviewGroup } from '$lib/services/adapters/review';
@@ -35,6 +36,7 @@
startBulk(`Archiving…`, uids);
try {
await batchArchive(uids);
evictFromCache(uids);
doneBulk(`Archived ${uids.length}`, uids);
toast.success(`Archived ${uids.length}`, { id: tid });
void qc.invalidateQueries({ queryKey: ['review-groups'] });

View File

@@ -14,6 +14,7 @@
} from '$lib/services/photoprism';
import { batchEdit } from '$lib/services/batch';
import { acceptDateAndKeep, cachedPhoto } from '$lib/services/photoActions';
import { evictFromCache } from '$lib/services/bulk';
import { suggestDateFromPath } from '$lib/utils/suggestDateFromPath';
import { photoNameAndDir } from '$lib/types/photoprism';
import {
@@ -129,7 +130,6 @@
const result = await fn();
if (bulk) {
doneBulk(bulk.doneLabel, bulk.ids);
await delay(400);
}
return result;
} catch (e) {
@@ -152,6 +152,7 @@
setDetail(p?.FileName ?? completedId);
}
});
evictFromCache(ids);
if (errors.length) {
toast.error(`Kept ${updated.length}; ${errors.length} failed`, { id: tid });
} else {
@@ -179,6 +180,7 @@
await withBusy(async () => {
try {
await batchArchive(ids);
evictFromCache(ids);
pushUndo(`Archived ${ids.length}`, async () => {
await batchRestore(ids);
void qc.invalidateQueries({ queryKey: ['photos'] });
@@ -204,6 +206,7 @@
await withBusy(async () => {
try {
await batchDelete(ids);
evictFromCache(ids);
focusAfter(ids);
clearSelection();
toast.success(`Deleted ${ids.length}`, { id: tid });
@@ -220,6 +223,7 @@
await withBusy(async () => {
try {
await batchRestore(ids);
evictFromCache(ids);
pushUndo(`Restored ${ids.length}`, async () => {
await batchArchive(ids);
void qc.invalidateQueries({ queryKey: ['photos'] });