@wener/console
Version:
Base console UI toolkit
52 lines (44 loc) • 1.14 kB
text/typescript
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<any> = 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;
}
}