/** 商品无图时的占位(小程序端无本地兜底图时用空串由 UI 显示灰底) */ export const PRODUCT_IMAGE_FALLBACK = ''; export type ProductImageSource = { mainImageUrl?: string | null; carouselUrls?: string[] | null; detailImageUrls?: string[] | null; }; function uniqueUrls(urls: Array) { const seen = new Set(); const result: string[] = []; for (const url of urls) { if (!url || seen.has(url)) continue; seen.add(url); result.push(url); } return result; } export function getProductMainImage(source?: ProductImageSource | null): string { return source?.mainImageUrl ?? source?.carouselUrls?.[0] ?? PRODUCT_IMAGE_FALLBACK; } export function getProductImages(source?: ProductImageSource | null): string[] { const carousel = uniqueUrls(source?.carouselUrls ?? []); if (carousel.length > 0) return carousel; const main = source?.mainImageUrl; if (main) return [main]; return PRODUCT_IMAGE_FALLBACK ? [PRODUCT_IMAGE_FALLBACK] : []; } /** 详情页顶部轮播 */ export function getProductCarouselImages(source?: ProductImageSource | null): string[] { const carousel = uniqueUrls(source?.carouselUrls ?? []); if (carousel.length > 0) return carousel; return getProductImages(source); } /** 详情页图文长图 */ export function getProductDetailImages(source?: ProductImageSource | null): string[] { return uniqueUrls(source?.detailImageUrls ?? []); } export const FALLBACK_CITY_CODE = '410100';