type LinkType = | { type: "profile"; id: string } | { type: "navigate"; path: string; navigation_type?: null } | { type: "navigate"; path: string; navigation_type: "channel"; channel_id: string; } | { type: "external"; href: string; url: URL } | { type: "none" }; const ALLOWED_ORIGINS = [ location.hostname, "app.revolt.chat", "nightly.revolt.chat", "local.revolt.chat", ]; const CHANNEL_PATH_RE = /^\/server\/[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}\/channel\/[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}$/; export function determineLink(href?: string): LinkType { let internal, url: URL | null = null; if (href) { try { url = new URL(href, location.href); if (ALLOWED_ORIGINS.includes(url.hostname)) { const path = url.pathname; if (path.startsWith("/@")) { const id = path.substr(2); if (/[0123456789ABCDEFGHJKMNPQRSTVWXYZ]{26}/.test(id)) { return { type: "profile", id }; } } else { if (CHANNEL_PATH_RE.test(path)) { return { type: "navigate", path, navigation_type: "channel", channel_id: path.slice(43), }; } return { type: "navigate", path }; } internal = true; } } catch (err) {} if (!internal && url) { if (url.protocol !== "javascript") { return { type: "external", href, url }; } } } return { type: "none" }; }