export type HomeExperience = { id: string; badge: string; category: string; title: string; englishTitle: string; image: string; demandKeyword: string; }; export type HomeExperienceApiItem = { id?: string | null; badge?: string | null; category?: string | null; title?: string | null; englishTitle?: string | null; image?: string | null; demandKeyword?: string | null; isActive?: boolean | null; sortOrder?: number | null; }; export type HomeExperiences = HomeExperienceApiItem[]; export const homeExperienceMocks: HomeExperience[] = [ { id: "waterfall-descent", badge: "玩过推荐", category: "瀑降体验", title: "悬崖瀑降", englishTitle: "WATERFALL DESCENT", image: "https://genk.mediacdn.vn/139269124445442048/2024/4/27/10-23-sinkhole-1714189653945948438879.jpg", demandKeyword: "悬崖瀑降", }, { id: "cave-exploration", badge: "玩过推荐", category: "地心探险", title: "森林&探洞", englishTitle: "CAVE EXPLORATION", image: "https://www.zurnal24.si/media/img/5e/d5/9526a56dba168aa136f3.jpeg", demandKeyword: "地心探险", }, ]; export const homeExperienceFallback = homeExperienceMocks; export function normalizeHomeExperiences( items: HomeExperiences | null | undefined, ): HomeExperience[] { const fallback = homeExperienceFallback.map((item) => ({ ...item })); const activeItems = (items ?? []) .map((item, index) => ({ item, index })) .filter(({ item }) => item.isActive !== false && Boolean(item.title?.trim())) .sort( (left, right) => (left.item.sortOrder ?? left.index) - (right.item.sortOrder ?? right.index), ); if (activeItems.length === 0) { return fallback; } return activeItems.map(({ item }, index) => { const fallbackItem = homeExperienceFallback[index] ?? homeExperienceFallback[0]; const title = item.title?.trim() || fallbackItem.title; return { id: item.id?.trim() || fallbackItem.id, badge: item.badge?.trim() || fallbackItem.badge, category: item.category?.trim() || fallbackItem.category, title, englishTitle: item.englishTitle?.trim() || fallbackItem.englishTitle, image: item.image?.trim() || fallbackItem.image, demandKeyword: item.demandKeyword?.trim() || title, }; }); }