Thread viewer for Bluesky

small fix on posting stats page

+28 -21
+3 -1
src/components/PostingStatsTable.svelte
··· 1 1 <script lang="ts"> 2 2 import { type PostingStatsResult } from "../services/posting_stats"; 3 3 4 - interface Props extends PostingStatsResult { 4 + export interface TableOptions { 5 5 showReposts?: boolean, 6 6 showPercentages?: boolean, 7 7 showTotal?: boolean 8 8 }; 9 + 10 + type Props = PostingStatsResult & TableOptions; 9 11 10 12 let { users, sums, daysBack, showReposts = true, showPercentages = true, showTotal = true }: Props = $props(); 11 13
+25 -20
src/pages/PostingStatsPage.svelte
··· 1 1 <script lang="ts"> 2 2 import UserAutocomplete, { type AutocompleteUser } from '../components/UserAutocomplete.svelte'; 3 - import PostingStatsTable from '../components/PostingStatsTable.svelte'; 3 + import PostingStatsTable, { type TableOptions } from '../components/PostingStatsTable.svelte'; 4 4 import { accountAPI } from '../api.js'; 5 5 import { PostingStats, type PostingStatsResult } from '../services/posting_stats.js'; 6 6 import { numberOfDays } from '../utils.js'; ··· 10 10 { id: 'list', title: 'List feed' }, 11 11 { id: 'users', title: 'Selected users' }, 12 12 { id: 'you', title: 'Your profile' } 13 - ] 13 + ] as const; 14 14 15 15 let lists: json[] = $state([]); 16 16 17 17 let timeRangeDays = $state(7); 18 - let selectedTab = $state(tabs[0].id); 18 + let selectedTab: typeof tabs[number]['id'] = $state(tabs[0].id); 19 19 let selectedUsers: AutocompleteUser[] = $state([]); 20 20 let selectedList: string | undefined = $state(); 21 21 ··· 24 24 let progress: number | undefined = $state(); 25 25 let scanInfo = $state(); 26 26 27 - let tableOptions = $state({}); 27 + let tableOptions: TableOptions = $state({}); 28 28 let results: PostingStatsResult | null = $state(null); 29 29 30 30 let scanner = new PostingStats((p) => { progress = Math.max(progress || 0, p) }); ··· 78 78 progress = 0; 79 79 scanInProgress = true; 80 80 81 - // TODO 82 - // let now = new Date().getTime(); 83 - // 84 - // if (now - startTime < 100) { 85 - // // artificial UI delay in case scan finishes immediately 86 - // await new Promise(resolve => setTimeout(resolve, 100)); 87 - // } 81 + let startTime = new Date().getTime(); 82 + let data: PostingStatsResult | null; 83 + let options: TableOptions; 88 84 89 85 if (selectedTab == 'home') { 90 - tableOptions = {}; 91 - results = await scanner.scanHomeTimeline(requestedDays); 86 + options = {}; 87 + data = await scanner.scanHomeTimeline(requestedDays); 92 88 } else if (selectedTab == 'list') { 93 - tableOptions = { showReposts: false }; 94 - results = await scanner.scanListTimeline(selectedList!, requestedDays); 89 + options = { showReposts: false }; 90 + data = await scanner.scanListTimeline(selectedList!, requestedDays); 95 91 } else if (selectedTab == 'users') { 96 - results = await scanner.scanUserTimelines(selectedUsers, requestedDays); 97 - tableOptions = { showTotal: false, showPercentages: false }; 98 - } else if (selectedTab == 'you') { 99 - results = await scanner.scanYourTimeline(requestedDays); 100 - tableOptions = { showTotal: false, showPercentages: false }; 92 + options = { showTotal: false, showPercentages: false }; 93 + data = await scanner.scanUserTimelines(selectedUsers, requestedDays); 94 + } else { // selectedTab == 'you' 95 + options = { showTotal: false, showPercentages: false }; 96 + data = await scanner.scanYourTimeline(requestedDays); 101 97 } 102 98 99 + let now = new Date().getTime(); 100 + 101 + if (now - startTime < 150) { 102 + // artificial UI delay in case scan finishes immediately 103 + await new Promise(resolve => setTimeout(resolve, 150)); 104 + } 105 + 106 + tableOptions = options; 107 + results = data; 103 108 scanInProgress = false; 104 109 } 105 110 </script>