top poasts
highlights.waow.tech
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}