aboutsummaryrefslogtreecommitdiffstats
path: root/frontend-vanilla/src/store.ts
diff options
context:
space:
mode:
authorAdam Mathes <adam@adammathes.com>2026-02-15 17:44:55 -0800
committerAdam Mathes <adam@adammathes.com>2026-02-15 17:44:55 -0800
commitc652ac6a2cd23ef29f48465be09c2b674783e8e9 (patch)
treec5c05a71a1d5b8155b05dad4a512b18ff7258f47 /frontend-vanilla/src/store.ts
parent90c1a68d6478138f538094fc83e48da8ddd21fa0 (diff)
downloadneko-c652ac6a2cd23ef29f48465be09c2b674783e8e9.tar.gz
neko-c652ac6a2cd23ef29f48465be09c2b674783e8e9.tar.bz2
neko-c652ac6a2cd23ef29f48465be09c2b674783e8e9.zip
Vanilla JS (v3): Implement 3-pane layout, item fetching, reading, and testing
Diffstat (limited to 'frontend-vanilla/src/store.ts')
-rw-r--r--frontend-vanilla/src/store.ts41
1 files changed, 41 insertions, 0 deletions
diff --git a/frontend-vanilla/src/store.ts b/frontend-vanilla/src/store.ts
new file mode 100644
index 0000000..d274c5d
--- /dev/null
+++ b/frontend-vanilla/src/store.ts
@@ -0,0 +1,41 @@
+import type { Feed, Item } from './types.ts';
+
+export type StoreEvent = 'feeds-updated' | 'items-updated' | 'active-feed-updated' | 'loading-state-changed';
+
+export class Store extends EventTarget {
+ feeds: Feed[] = [];
+ items: Item[] = [];
+ activeFeedId: number | null = null;
+ loading: boolean = false;
+
+ setFeeds(feeds: Feed[]) {
+ this.feeds = feeds;
+ this.emit('feeds-updated');
+ }
+
+ setItems(items: Item[]) {
+ this.items = items;
+ this.emit('items-updated');
+ }
+
+ setActiveFeed(id: number | null) {
+ this.activeFeedId = id;
+ this.emit('active-feed-updated');
+ }
+
+ setLoading(loading: boolean) {
+ this.loading = loading;
+ this.emit('loading-state-changed');
+ }
+
+ private emit(type: StoreEvent, detail?: any) {
+ this.dispatchEvent(new CustomEvent(type, { detail }));
+ }
+
+ // Helper to add typed listeners
+ on(type: StoreEvent, callback: (e: CustomEvent) => void) {
+ this.addEventListener(type, callback as EventListener);
+ }
+}
+
+export const store = new Store();