@bemedev/app-react
Version:
Use app-ts inside react
1 lines • 1.64 kB
Source Map (JSON)
{"version":3,"file":"useSelector.cjs","names":["getSnapshot"],"sources":["../src/useSelector.ts"],"sourcesContent":["import type {\n AnyMachine,\n InterpreterFrom,\n StateFrom,\n} from '@bemedev/app-ts';\nimport { useSync } from '@bemedev/react-sync';\nimport { dequal } from 'dequal';\nimport { useCallback, useRef } from 'react';\nimport { getSnapshot, type Compare_F } from './utils';\n\nexport const useSelector = <\n const M extends AnyMachine = AnyMachine,\n T = StateFrom<M>,\n>(\n service: InterpreterFrom<M>,\n selector: (emitted: StateFrom<M>) => T,\n compare: Compare_F = dequal,\n) => {\n type _State = StateFrom<M>;\n\n const initialStateCacheRef = useRef<_State>(\n undefined as unknown as _State,\n );\n\n type Listener = (state: _State) => void;\n\n const subscribe = useCallback(\n (listerner: Listener) => {\n const subscriber = service.subscribe(listerner);\n return () => subscriber.unsubscribe();\n },\n [service],\n );\n\n const boundGetSnapshot = useCallback(() => {\n return getSnapshot<M>(service, initialStateCacheRef as any);\n }, [service]);\n\n const selectedSnapshot = useSync(\n subscribe,\n boundGetSnapshot,\n boundGetSnapshot,\n selector,\n compare,\n );\n\n return selectedSnapshot;\n};\n"],"mappings":";;;;;;;AAUA,MAAa,eAIX,SACA,UACA,UAAqB,OAAA,WAClB;CAGH,MAAM,wBAAA,GAAA,MAAA,QACJ,KAAA,EACD;CAID,MAAM,aAAA,GAAA,MAAA,cACH,cAAwB;EACvB,MAAM,aAAa,QAAQ,UAAU,UAAU;AAC/C,eAAa,WAAW,aAAa;IAEvC,CAAC,QAAQ,CACV;CAED,MAAM,oBAAA,GAAA,MAAA,mBAAqC;AACzC,SAAOA,0BAAAA,YAAe,SAAS,qBAA4B;IAC1D,CAAC,QAAQ,CAAC;AAUb,SAAA,GAAA,oBAAA,SAPE,WACA,kBACA,kBACA,UACA,QACD"}