fix(photos): faster large-album loading and album cover lifecycle
Large albums opened slowly and flickered; the default album cover was also lost in the media-objects refactor. Large-album loading: - quantize signed object URLs within a window and send Cache-Control so previews are reused instead of re-fetched - publish photo.updated (not photo.created) when variants are ready, so clients update in place without reordering the grid - worker concurrency + newest-first variant priority; raise default batch Album cover: - first uploaded photo becomes the cover when none is set - clear the cover when the cover photo is trashed or moved out - "set as album cover" in the photo context menu and actions panel OpenSpec changes: fix-large-album-load, fix-album-cover
This commit is contained in:
@@ -29,6 +29,7 @@
|
||||
let uploader = $state<{ pick: () => void; upload: (files: FileList | File[]) => void }>();
|
||||
|
||||
let canUpload = $derived(['owner', 'admin', 'editor', 'member'].includes(role));
|
||||
let canEdit = $derived(role === 'owner' || role === 'admin');
|
||||
|
||||
async function loadAlbum() {
|
||||
const data = await api<{ album: Album; role: string }>(`/albums/${albumId}`);
|
||||
@@ -100,6 +101,8 @@
|
||||
break;
|
||||
}
|
||||
case 'photo.updated': {
|
||||
// Variant readiness updates a photo already in the grid; never
|
||||
// insert an unseen photo here, or the grid would reflow.
|
||||
const photo = data as unknown as Photo;
|
||||
photos = photos.map((p) => (p.id === photo.id ? photo : p));
|
||||
break;
|
||||
@@ -221,6 +224,15 @@
|
||||
}
|
||||
]
|
||||
: []),
|
||||
...(canEdit
|
||||
? [
|
||||
{
|
||||
label: 'Установить как обложку альбома',
|
||||
icon: 'wallpaper' as const,
|
||||
run: () => albums.setCover(albumId, photo.id)
|
||||
}
|
||||
]
|
||||
: []),
|
||||
{
|
||||
label: 'Переместить',
|
||||
icon: 'arrow_back',
|
||||
|
||||
Reference in New Issue
Block a user