62 lines
2.1 KiB
TypeScript
62 lines
2.1 KiB
TypeScript
export function normalizeSocialUrl(value: string | null | undefined) {
|
|
const trimmed = (value || "").trim();
|
|
if (!trimmed) return "";
|
|
return trimmed;
|
|
}
|
|
|
|
function parseSocialUrl(value: string | null | undefined) {
|
|
const trimmed = normalizeSocialUrl(value);
|
|
if (!trimmed) return null;
|
|
|
|
try {
|
|
return new URL(trimmed);
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function isAllowedSocialHostname(hostname: string, allowed: string[]) {
|
|
return allowed.some((domain) => hostname === domain || hostname === `www.${domain}`);
|
|
}
|
|
|
|
export function isValidFacebookUrl(value: string | null | undefined) {
|
|
const url = parseSocialUrl(value);
|
|
if (!value || !String(value).trim()) return true;
|
|
if (!url) return false;
|
|
return url.protocol === "https:" && isAllowedSocialHostname(url.hostname.toLowerCase(), ["facebook.com", "fb.com"]);
|
|
}
|
|
|
|
export function isValidInstagramUrl(value: string | null | undefined) {
|
|
const url = parseSocialUrl(value);
|
|
if (!value || !String(value).trim()) return true;
|
|
if (!url) return false;
|
|
return url.protocol === "https:" && isAllowedSocialHostname(url.hostname.toLowerCase(), ["instagram.com"]);
|
|
}
|
|
|
|
export function getFacebookEmbedUrl(value: string | null | undefined) {
|
|
const trimmed = normalizeSocialUrl(value);
|
|
if (!isValidFacebookUrl(trimmed)) return null;
|
|
const url = new URL(trimmed);
|
|
const embedUrl = new URL("https://www.facebook.com/plugins/page.php");
|
|
embedUrl.searchParams.set("href", url.toString());
|
|
embedUrl.searchParams.set("tabs", "timeline");
|
|
embedUrl.searchParams.set("width", "500");
|
|
embedUrl.searchParams.set("height", "380");
|
|
embedUrl.searchParams.set("small_header", "true");
|
|
embedUrl.searchParams.set("adapt_container_width", "true");
|
|
embedUrl.searchParams.set("hide_cover", "false");
|
|
embedUrl.searchParams.set("show_facepile", "false");
|
|
return embedUrl.toString();
|
|
}
|
|
|
|
export function getSocialHandle(value: string | null | undefined) {
|
|
const url = parseSocialUrl(value);
|
|
if (!url) return null;
|
|
|
|
const handle = url.pathname
|
|
.split("/")
|
|
.map((part) => part.trim())
|
|
.filter(Boolean)[0];
|
|
|
|
return handle ? `@${handle}` : null;
|
|
}
|