@tanstack/react-hotkeys
Version:
React adapter for TanStack Hotkeys
29 lines (26 loc) • 877 B
JavaScript
'use client';
import { useCallback, useRef, useSyncExternalStore } from "react";
//#region src/_useSelector.ts
/**
* Subscribes to a store and returns the selected value, re-rendering when it
* changes (by `Object.is`). The selector runs again only when the store's
* state or the selector itself changes.
*/
function useSelector(store, selector) {
const subscribe = useCallback((onChange) => store.subscribe(onChange).unsubscribe, [store]);
const memo = useRef(null);
const getSelection = () => {
const state = store.get();
const last = memo.current;
if (last && last.selector === selector && Object.is(last.state, state)) return last.selected;
memo.current = {
state,
selector,
selected: selector(state)
};
return memo.current.selected;
};
return useSyncExternalStore(subscribe, getSelection, getSelection);
}
//#endregion
export { useSelector };