fix(public): media images are objects ({id,url,sortOrder}) - handle both shapes in mergeMedia
This commit is contained in:
@@ -499,26 +499,35 @@ export class PublicService {
|
||||
/**
|
||||
* Merge the gallery `media` across details: primary images first,
|
||||
* secondary-only image URLs appended (URL-deduped). `primaryImageUrl`
|
||||
* stays the primary's.
|
||||
* stays the primary's. Image entries keep their original shape
|
||||
* (`{id,url,sortOrder}` objects or plain strings).
|
||||
*/
|
||||
private mergeMedia(
|
||||
primary: PublicGoodRow['originGood']['detail'],
|
||||
secondaries: NonNullable<PublicGoodRow['originGood']['detail']>[],
|
||||
): Record<string, unknown> | null {
|
||||
const toImages = (media: unknown): string[] => {
|
||||
const images = (media as { images?: unknown } | null)?.images;
|
||||
return Array.isArray(images) ? images.filter((u): u is string => typeof u === 'string') : [];
|
||||
const imageUrl = (img: unknown): string | null => {
|
||||
if (typeof img === 'string') return img;
|
||||
if (img && typeof img === 'object' && typeof (img as { url?: unknown }).url === 'string') {
|
||||
return (img as { url: string }).url;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
const primaryMedia = (primary?.media as Record<string, unknown> | null) ?? null;
|
||||
if (!primaryMedia && secondaries.length === 0) return null;
|
||||
const images = toImages(primaryMedia);
|
||||
const seen = new Set(images);
|
||||
const primaryImages = Array.isArray(primaryMedia?.images)
|
||||
? (primaryMedia!.images as unknown[])
|
||||
: null;
|
||||
if (!primaryImages && secondaries.length === 0) return null;
|
||||
const images: unknown[] = primaryImages ? [...primaryImages] : [];
|
||||
const seen = new Set(images.map(imageUrl).filter((u): u is string => Boolean(u)));
|
||||
for (const sec of secondaries) {
|
||||
for (const url of toImages(sec.media)) {
|
||||
if (!seen.has(url)) {
|
||||
seen.add(url);
|
||||
images.push(url);
|
||||
}
|
||||
const secMedia = sec.media as { images?: unknown } | null;
|
||||
if (!Array.isArray(secMedia?.images)) continue;
|
||||
for (const img of secMedia!.images as unknown[]) {
|
||||
const url = imageUrl(img);
|
||||
if (!url || seen.has(url)) continue;
|
||||
seen.add(url);
|
||||
images.push(img);
|
||||
}
|
||||
}
|
||||
if (images.length === 0) return null;
|
||||
|
||||
Reference in New Issue
Block a user