import { get, set } from '@wener/utils'; import { createStore, type StoreApi } from 'zustand'; import { immer } from 'zustand/middleware/immer'; import type { ModuleStore } from './types'; export class DynamicStore implements ModuleStore { constructor( readonly store: StoreApi = createStore( immer(() => { return {}; }), ), ) {} get value() { return this.store.getState(); } add(type: string, payload: any) { this.store.setState((s: any) => { let last = get(s, type, []); if (!Array.isArray(last)) { last = [last]; } Array.isArray(payload) ? last.push(...payload) : last.push(payload); set(s, type, last, false); }); } collect(type: string): any { let found = get(this.value, type) ?? []; if (!Array.isArray(found)) { found = [found]; } return found; } set(key: string, value: any, { merge }: { merge?: boolean } = {}) { this.store.setState((s: any) => { set(s, key, value, merge); }); } get(key: string): any { return get(this.value, key); } as() { return this as any; } }