at main 85 lines 1.6 kB view raw
1import type { Post, SortMode } from './types.js'; 2 3export function createAppState() { 4 let handle = $state(''); 5 let posts: Post[] = $state([]); 6 let loading = $state(false); 7 let error: string | null = $state(null); 8 let progress = $state(0); 9 let sortMode: SortMode = $state('score'); 10 let topN = $state(10); 11 12 let sortedPosts = $derived.by(() => { 13 const sorted = [...posts]; 14 15 switch (sortMode) { 16 case 'score': 17 sorted.sort((a, b) => b.score - a.score); 18 break; 19 case 'likes': 20 sorted.sort((a, b) => b.likes - a.likes); 21 break; 22 case 'reposts': 23 sorted.sort((a, b) => b.reposts - a.reposts); 24 break; 25 case 'recency': 26 sorted.sort((a, b) => (b.createdAt > a.createdAt ? 1 : b.createdAt < a.createdAt ? -1 : 0)); 27 break; 28 } 29 30 return sorted; 31 }); 32 33 let displayPosts = $derived(sortedPosts.slice(0, topN)); 34 35 return { 36 get handle() { 37 return handle; 38 }, 39 set handle(value: string) { 40 handle = value; 41 }, 42 get posts() { 43 return posts; 44 }, 45 set posts(value: Post[]) { 46 posts = value; 47 }, 48 get loading() { 49 return loading; 50 }, 51 set loading(value: boolean) { 52 loading = value; 53 }, 54 get error() { 55 return error; 56 }, 57 set error(value: string | null) { 58 error = value; 59 }, 60 get progress() { 61 return progress; 62 }, 63 set progress(value: number) { 64 progress = value; 65 }, 66 get sortMode() { 67 return sortMode; 68 }, 69 set sortMode(value: SortMode) { 70 sortMode = value; 71 }, 72 get topN() { 73 return topN; 74 }, 75 set topN(value: number) { 76 topN = value; 77 }, 78 get sortedPosts() { 79 return sortedPosts; 80 }, 81 get displayPosts() { 82 return displayPosts; 83 } 84 }; 85}