ba885fd6ff
- 新增 ecommerceTemplateClient,通过应用 API 拉取模板清单(符合 AGENTS.md 数据走 API 规则) - EcommercePage 接入远程模板,按 categorySlug 映射到场景,补充 mediaType/sourceAssets - 移除硬编码 popularCommerceScenarioTemplates,改为远程模板为空时回退本地 - 补充 ecommerce-standalone.css 模板条样式 - .gitignore 忽略 ecommerce-template-manifest.* 运行时清单(属 API/OSS 数据,不入库)
59 lines
1.5 KiB
TypeScript
59 lines
1.5 KiB
TypeScript
import { serverRequest } from "./serverConnection";
|
|
|
|
export interface EcommerceTemplateAsset {
|
|
fileName?: string;
|
|
extension?: string;
|
|
sizeBytes?: number;
|
|
assetIndex?: number;
|
|
ossKey?: string;
|
|
url?: string;
|
|
}
|
|
|
|
export interface EcommerceTemplatePreview {
|
|
fileName?: string;
|
|
extension?: string;
|
|
sizeBytes?: number;
|
|
ossKey?: string;
|
|
url?: string;
|
|
}
|
|
|
|
export interface EcommerceTemplateManifestItem {
|
|
id: string;
|
|
category?: string;
|
|
categorySlug?: string;
|
|
templateName?: string;
|
|
templateSlug?: string;
|
|
preview?: EcommerceTemplatePreview;
|
|
prompt?: string;
|
|
assets?: EcommerceTemplateAsset[];
|
|
}
|
|
|
|
export interface EcommerceTemplateListResult {
|
|
version?: number;
|
|
ossPrefix?: string;
|
|
generatedAt?: string;
|
|
templates: EcommerceTemplateManifestItem[];
|
|
total: number;
|
|
}
|
|
|
|
export async function listEcommerceTemplates(category?: string): Promise<EcommerceTemplateListResult> {
|
|
const search = new URLSearchParams();
|
|
if (category) search.set("category", category);
|
|
const suffix = search.toString();
|
|
|
|
const response = await serverRequest<EcommerceTemplateListResult>(
|
|
`ai/ecommerce/templates${suffix ? `?${suffix}` : ""}`,
|
|
{
|
|
method: "GET",
|
|
maxRetries: 1,
|
|
fallbackMessage: "Failed to load ecommerce templates",
|
|
},
|
|
);
|
|
|
|
return {
|
|
...response,
|
|
templates: Array.isArray(response.templates) ? response.templates : [],
|
|
total: Number.isFinite(response.total) ? response.total : Array.isArray(response.templates) ? response.templates.length : 0,
|
|
};
|
|
}
|