Initial local backup snapshot
This commit is contained in:
commit
acd9e14ba5
367 changed files with 118038 additions and 0 deletions
62
shared/socialLinks.ts
Normal file
62
shared/socialLinks.ts
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue