62 lines
1.8 KiB
TypeScript
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 };
|
|
}
|