portail-associations/shared/socialLinks.ts

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;
}