Thread viewer for Bluesky
at master 56 lines 1.4 kB view raw
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}