diff options
| author | Adam Mathes <adam@adammathes.com> | 2026-02-15 17:44:55 -0800 |
|---|---|---|
| committer | Adam Mathes <adam@adammathes.com> | 2026-02-15 17:44:55 -0800 |
| commit | c652ac6a2cd23ef29f48465be09c2b674783e8e9 (patch) | |
| tree | c5c05a71a1d5b8155b05dad4a512b18ff7258f47 /frontend-vanilla/src/store.ts | |
| parent | 90c1a68d6478138f538094fc83e48da8ddd21fa0 (diff) | |
| download | neko-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.ts | 41 |
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(); |
