Add movement artist filter modal and fix large-hall texture blanks

Clicking a movement opens ArtistFilterModal to choose artists before the gallery. Large halls no longer permanently blank frames when texture loads exceed the overlay deadline; fall back thumb to full to on-demand API.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Danila Khodjaef
2026-07-29 19:05:54 +03:00
co-authored by Cursor
parent ad1572b3aa
commit 0a5918c4dd
9 changed files with 589 additions and 23 deletions
+28
View File
@@ -5,6 +5,7 @@ import type {
Artist,
ArtistDetail,
MovementGalleryDetail,
ArtistSummary,
Painting,
PaintingDetail,
ArtistNavigation,
@@ -176,6 +177,30 @@ export function galleryImageUrl(
return null;
}
/** Ordered texture URL candidates for a hall frame (thumb → full → on-demand API). */
export function galleryImageUrlCandidates(
painting: {
id?: number;
thumbnail_path?: string | null;
image_path?: string | null;
image_cache_key?: number | null;
thumbnail_cache_key?: number | null;
},
sessionRevision?: number | null
): string[] {
const revision = paintingImageRevision(painting, sessionRevision);
const urls: string[] = [];
const push = (u: string | null | undefined) => {
if (u && !urls.includes(u)) urls.push(u);
};
if (painting.thumbnail_path) push(imageUrl(painting.thumbnail_path, revision));
if (painting.image_path) push(imageUrl(painting.image_path, revision));
if (painting.id != null) {
push(`/api/paintings/${painting.id}/image?size=thumb`);
}
return urls;
}
export function galleryImageUrlWithRevision(
painting: {
id?: number;
@@ -458,6 +483,9 @@ export const api = {
getMovementGallery: (id: number) => fetchJson<MovementGalleryDetail>(localizedPath(`${API}/movements/${id}/gallery`)),
getMovementArtistsSummary: (id: number) =>
fetchJson<ArtistSummary[]>(localizedPath(`${API}/movements/${id}/artists-summary`)),
getArtistNavigation: (id: number) =>
fetchJson<ArtistNavigation>(localizedPath(`${API}/artists/${id}/navigation`)),