Thread viewer for Bluesky
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}