export type VideoCanvasTutorialSupportConfig = { customerServiceUrl: string; officialAccountQrImageUrl: string; salesQrImageUrl: string; tutorialUrl: string; }; export type VideoCanvasTutorialSupportQrKind = "official" | "sales"; export const defaultVideoCanvasTutorialSupportConfig: VideoCanvasTutorialSupportConfig = { customerServiceUrl: "", officialAccountQrImageUrl: "", salesQrImageUrl: "", tutorialUrl: "https://resonate.feishu.cn/wiki/Loxfw6XHziYRk0kKzdjcFfp9nhb", }; function normalizeUrl(value: unknown, fallback: string) { const candidate = String(value || "").trim().slice(0, 2048); if (!candidate) return fallback; if (candidate.startsWith("/") && !candidate.startsWith("//")) return candidate; try { const url = new URL(candidate); return url.protocol === "http:" || url.protocol === "https:" ? candidate : fallback; } catch { return fallback; } } export function normalizeVideoCanvasTutorialSupportConfig( value: unknown, ): VideoCanvasTutorialSupportConfig { const incoming = value && typeof value === "object" && !Array.isArray(value) ? (value as Record) : {}; return { customerServiceUrl: normalizeUrl(incoming.customerServiceUrl, ""), officialAccountQrImageUrl: normalizeUrl( incoming.officialAccountQrImageUrl, "", ), salesQrImageUrl: normalizeUrl(incoming.salesQrImageUrl, ""), tutorialUrl: normalizeUrl( incoming.tutorialUrl, defaultVideoCanvasTutorialSupportConfig.tutorialUrl, ), }; } export function getVideoCanvasTutorialSupportQr( config: VideoCanvasTutorialSupportConfig, kind: VideoCanvasTutorialSupportQrKind, ) { return kind === "sales" ? { alt: "联系销售", url: config.salesQrImageUrl } : { alt: "关注公众号", url: config.officialAccountQrImageUrl }; }