Thread viewer for Bluesky
at master 58 lines 1.6 kB view raw
1import { URLError } from './api.js'; 2import { Post } from './models/posts.js'; 3 4export function getBaseLocation(): string { 5 return location.origin + location.pathname; 6} 7 8export function linkToHashtagPage(hashtag: string): string { 9 let url = new URL(getBaseLocation()); 10 url.searchParams.set('hash', hashtag); 11 return url.toString(); 12} 13 14export function linkToQuotesPage(postURL: string): string { 15 let url = new URL(getBaseLocation()); 16 url.searchParams.set('quotes', postURL); 17 return url.toString(); 18} 19 20export function linkToPostThread(post: Post): string { 21 return linkToPostById(post.author.handle, post.rkey); 22} 23 24export function linkToPostById(handle: string, postId: string): string { 25 let url = new URL(getBaseLocation()); 26 url.searchParams.set('author', handle); 27 url.searchParams.set('post', postId); 28 return url.toString(); 29} 30 31export function parseBlueskyPostURL(string: string): { user: string, post: string } { 32 let url: URL; 33 34 try { 35 url = new URL(string); 36 } catch (error) { 37 throw new URLError(`${error}`); 38 } 39 40 if (url.protocol != 'https:' && url.protocol != 'http:') { 41 throw new URLError('URL must start with http(s)://'); 42 } 43 44 let parts = url.pathname.split('/'); 45 46 if (parts.length < 5 || parts[1] != 'profile' || parts[3] != 'post') { 47 throw new URLError('This is not a valid thread URL'); 48 } 49 50 let user = parts[2]; 51 let post = parts[4]; 52 53 return { user, post }; 54} 55 56export function parseURLParams(urlQuery: string): Record<string, string> { 57 return Object.fromEntries(new URLSearchParams(urlQuery)); 58}