Files
WonderQ-Project/WonderQ-MiniAPP/src/pages/home/components/homeExperienceData.ts
duanshuwen cda8069630 docs: 清理过时文档,新增首页API契约并更新相关内容
- 删除backend-plan.md、backend-api-service.md等多份过时项目文档
- 新增home-api.md规范首页三类内容的Admin API补充契约
- 更新docs/README.md的文档清单与展示格式
- 优化integration-workflow.md、admin-api-requirements.md等文档的表格与内容
- 为WonderQ-MiniAPP的homeExperienceData.ts新增API适配类型与归一化函数
2026-08-18 20:00:25 +08:00

79 lines
2.3 KiB
TypeScript

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,
};
});
}