48 lines
1.4 KiB
TypeScript
48 lines
1.4 KiB
TypeScript
/** 商品无图时的占位图 */
|
|
export const PRODUCT_IMAGE_FALLBACK = '/images/1.png';
|
|
|
|
export type ProductImageSource = {
|
|
mainImageUrl?: string | null;
|
|
carouselUrls?: string[] | null;
|
|
detailImageUrls?: string[] | null;
|
|
};
|
|
|
|
function uniqueUrls(urls: Array<string | null | undefined>) {
|
|
const seen = new Set<string>();
|
|
const result: string[] = [];
|
|
for (const url of urls) {
|
|
if (!url || seen.has(url)) continue;
|
|
seen.add(url);
|
|
result.push(url);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/** 首页/列表轮播图:优先 CAROUSEL,否则封面 */
|
|
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];
|
|
}
|
|
|
|
/** 单张主图:封面优先 */
|
|
export function getProductMainImage(source?: ProductImageSource | null): string {
|
|
return source?.mainImageUrl ?? source?.carouselUrls?.[0] ?? 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 ?? []);
|
|
}
|