UNPKG

@bemedev/app-react

Version:
1 lines 2.03 kB
{"version":3,"file":"useSelector.cjs","sources":["../src/useSelector.ts"],"sourcesContent":["import type {\n AnyMachine,\n ContextFrom,\n InterpreterFrom,\n} from '@bemedev/app-ts';\nimport useSyncExternalStoreWithSelector from '@bemedev/react-sync';\nimport { t } from '@bemedev/types';\nimport { dequal } from 'dequal';\nimport { useCallback, useRef } from 'react';\nimport type { State } from './types';\nimport { getSnapshot, type Compare_F } from './utils';\n\nexport const useSelector = <\n const M extends AnyMachine = AnyMachine,\n T = State<ContextFrom<M>>,\n>(\n service: InterpreterFrom<M>,\n selector: (emitted: State<ContextFrom<M>>) => T,\n compare: Compare_F = dequal,\n) => {\n type _State = State<ContextFrom<M>>;\n\n const initialStateCacheRef = useRef<_State>(t.any<_State>(undefined));\n\n type Listener = (state: _State) => void;\n\n const subscribe = useCallback(\n (listerner: Listener) => {\n const unsubscribe = service.subscribe(listerner as any);\n return unsubscribe;\n },\n [service],\n );\n\n const boundGetSnapshot = useCallback(() => {\n return getSnapshot<M>(service, initialStateCacheRef as any);\n }, [service]);\n\n const selectedSnapshot = useSyncExternalStoreWithSelector(\n subscribe,\n boundGetSnapshot,\n boundGetSnapshot,\n selector,\n compare,\n );\n\n return selectedSnapshot;\n};\n"],"names":["dequal","useRef","t","useCallback","getSnapshot"],"mappings":";;;;;;;;AAYO,MAAM,WAAW,GAAG,CAIzB,OAA2B,EAC3B,QAA+C,EAC/C,OAAA,GAAqBA,aAAM,KACzB;IAGF,MAAM,oBAAoB,GAAGC,YAAM,CAASC,OAAC,CAAC,GAAG,CAAS,SAAS,CAAC,CAAC;AAIrE,IAAA,MAAM,SAAS,GAAGC,iBAAW,CAC3B,CAAC,SAAmB,KAAI;QACtB,MAAM,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,SAAgB,CAAC;AACvD,QAAA,OAAO,WAAW;AACpB,KAAC,EACD,CAAC,OAAO,CAAC,CACV;AAED,IAAA,MAAM,gBAAgB,GAAGA,iBAAW,CAAC,MAAK;AACxC,QAAA,OAAOC,6BAAW,CAAI,OAAO,EAAE,oBAA2B,CAAC;AAC7D,KAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAEb,IAAA,MAAM,gBAAgB,GAAG,gCAAgC,CACvD,SAAS,EACT,gBAAgB,EAChB,gBAAgB,EAChB,QAAQ,EACR,OAAO,CACR;AAED,IAAA,OAAO,gBAAgB;AACzB;;;;"}