import { heroSlides as fallbackHeroSlides, resolveNetworkImage, vehicleOptions as fallbackVehicleOptions, } from "@/content"; import type { AppData, PublicHomeCard, PublicSiteConfig, PublicVehicleService, VehicleOption, } from "./types"; function normalizeActiveItems(items: T[] | undefined) { return (items ?? []) .filter((item) => item.isActive !== false) .sort((left, right) => (left.sortOrder ?? 0) - (right.sortOrder ?? 0)); } export function normalizeHomeCards(items: PublicHomeCard[] | undefined, fallback: T[]): T[] { const activeItems = normalizeActiveItems(items).filter((item) => item.title?.trim()); if (!activeItems.length) return fallback; return activeItems.map((item, index) => { const fallbackItem = fallback[index] ?? fallback[0]; return { ...fallbackItem, id: item.id, title: item.title.trim(), description: item.description?.trim() || fallbackItem.description, image: resolveNetworkImage(item.image, fallbackItem.image), } as T; }); } export function normalizeSiteConfig(siteConfig: PublicSiteConfig, fallback: AppData): AppData { return { heroSlides: siteConfig.heroSlides?.length ? siteConfig.heroSlides.map((slide, index) => ({ ...slide, image: resolveNetworkImage( slide.image, fallback.heroSlides[index]?.image ?? fallback.heroSlides[0]?.image ?? "", ), id: slide.id, kicker: slide.kicker, title: slide.title, actionLabel: slide.actionLabel, targetType: slide.targetType, targetValue: slide.targetValue, })) : fallback.heroSlides, vehicleOptions: normalizeHomeCards(siteConfig.vehicleOptions, fallback.vehicleOptions), vehicleService: fallback.vehicleService, }; } const fallbackVehicleService: PublicVehicleService = { introTitle: "旅游出行专属用车服务", intro: "提交用车需求后由管家联系确认车型与服务安排。", serviceSections: [ { title: "旅游专属包车", description: "适配家庭出游、朋友结伴和小团体旅行,行程可按需求沟通调整。" }, { title: "多车型灵活选择", description: "按人数和行李情况匹配舒适轿车、SUV 或商务车。" }, ], advantages: ["专为旅游定制", "按人数和行李匹配", "管家快速跟进"], processSteps: [ { title: "提交需求", description: "填写日期、地点、人数和车型偏好。" }, { title: "管家联系", description: "沟通车辆和服务安排。" }, { title: "确认服务", description: "确认行程细节后按约定出行。" }, ], }; export const fallbackData: AppData = { heroSlides: fallbackHeroSlides, vehicleOptions: fallbackVehicleOptions.map((option) => ({ ...option })), vehicleService: fallbackVehicleService, }; export function getSubmitErrorMessage(error: unknown) { return error instanceof Error && error.message ? error.message : "提交失败,请稍后再试。"; } export function formatWan(value: number) { return Number.isFinite(value) ? value.toFixed(2).replace(/\.00$/, "") : "0"; }