ai-chatbot/lib/video-canvas/tutorial-support.ts

62 lines
1.8 KiB
TypeScript

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<string, unknown>)
: {};
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 };
}