@runicjs/runic-react
Version:
Tools for working with Runic in React
23 lines (22 loc) • 825 B
JavaScript
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;
}