react-tately
Version:
Minimal, powerful global state manager for React
26 lines (19 loc) • 654 B
text/typescript
import { useSyncExternalStore } from 'react';
type Listener = () => void;
export function createStore<T>(initialValue: T) {
let state = initialValue;
const listeners = new Set<Listener>();
const setState = (updater: (prev: T) => T) => {
state = updater(state);
listeners.forEach(listener => listener());
};
const subscribe = (listener: Listener) => {
listeners.add(listener);
return () => listeners.delete(listener);
};
const useStore = (): [T, typeof setState] => {
const snapshot = useSyncExternalStore(subscribe, () => state);
return [snapshot, setState];
};
return useStore;
}