UNPKG

@runicjs/runic-react

Version:

Tools for working with Runic in React

23 lines (22 loc) 825 B
import { useEffect, useState } from 'react'; import { defaultEqualityFn } from '../utils'; const getStates = (stores) => { return stores.map((store) => store.getState()); }; export default function useStores(stores, selector, equalityFn = defaultEqualityFn) { const [value, setValue] = useState(() => selector(getStates(stores))); useEffect(() => { const unsubscribes = stores.map((store) => store.subscribe(() => { setValue((last) => { const next = selector(getStates(stores)); if (equalityFn(last, next)) return last; return next; }); })); return () => { unsubscribes.forEach((unsubscribe) => unsubscribe()); }; }, [...stores, selector, equalityFn]); return value; }