- 删除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适配类型与归一化函数
79 lines
2.3 KiB
TypeScript
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,
|
|
};
|
|
});
|
|
}
|