Thread viewer for Bluesky
1import { accountAPI } from '../api.js';
2import { Post, parseFeedPost } from '../models/posts.js';
3import { feedPostTime } from '../utils.js';
4
5export class TimelineSearch {
6 timelinePosts: json[];
7 abortController?: AbortController;
8
9 constructor() {
10 this.timelinePosts = [];
11 }
12
13 async fetchTimeline(requestedDays: number, onProgress: (progress: number) => void) {
14 let startTime = new Date().getTime();
15 this.abortController = new AbortController();
16
17 let timeline = await accountAPI.loadHomeTimeline(requestedDays, {
18 abortSignal: this.abortController.signal,
19 onPageLoad: (data) => {
20 let progress = this.calculateProgress(data, startTime);
21 if (progress) {
22 onProgress(progress);
23 }
24 }
25 });
26
27 this.timelinePosts = timeline;
28 }
29
30 calculateProgress(dataPage: json[], startTime: number) {
31 let last = dataPage.at(-1);
32
33 if (!last) { return null; }
34
35 let lastDate = feedPostTime(last);
36 let daysBack = (startTime - lastDate) / 86400 / 1000;
37 return daysBack;
38 }
39
40 searchPosts(query: string): Post[] {
41 if (query.length == 0) {
42 return [];
43 }
44
45 let matching = this.timelinePosts
46 .filter(x => x.post.record.text.toLowerCase().includes(query))
47 .map(x => parseFeedPost(x));
48
49 return matching;
50 }
51
52 abortFetch() {
53 this.abortController?.abort();
54 delete this.abortController;
55 }
56}