UNPKG

@tanstack/react-hotkeys

Version:

React adapter for TanStack Hotkeys

29 lines (26 loc) • 877 B
'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 };