UNPKG

2.34 kBSource Map (JSON)View Raw
1{"version":3,"sources":["useNavigationState.tsx"],"names":["useNavigationState","selector","navigation","setResult","React","useState","getState","selectorRef","useRef","useEffect","current","unsubscribe","addListener","e","data","state"],"mappings":";;;;;;;AACA;;AAGA;;;;;;;;AAMA;AACA;AACA;AACA;AACA;AACe,SAASA,kBAAT,CACbC,QADa,EAEV;AACH,QAAMC,UAAU,GAAG,6BAAnB,CADG,CAGH;AACA;;AACA,QAAM,GAAGC,SAAH,IAAgBC,KAAK,CAACC,QAAN,CAAe,MAAMJ,QAAQ,CAACC,UAAU,CAACI,QAAX,EAAD,CAA7B,CAAtB,CALG,CAOH;;AACA,QAAMC,WAAW,GAAGH,KAAK,CAACI,MAAN,CAAaP,QAAb,CAApB;AAEAG,EAAAA,KAAK,CAACK,SAAN,CAAgB,MAAM;AACpBF,IAAAA,WAAW,CAACG,OAAZ,GAAsBT,QAAtB;AACD,GAFD;AAIAG,EAAAA,KAAK,CAACK,SAAN,CAAgB,MAAM;AACpB,UAAME,WAAW,GAAGT,UAAU,CAACU,WAAX,CAAuB,OAAvB,EAAiCC,CAAD,IAAO;AACzDV,MAAAA,SAAS,CAACI,WAAW,CAACG,OAAZ,CAAoBG,CAAC,CAACC,IAAF,CAAOC,KAA3B,CAAD,CAAT;AACD,KAFmB,CAApB;AAIA,WAAOJ,WAAP;AACD,GAND,EAMG,CAACT,UAAD,CANH;AAQA,SAAOD,QAAQ,CAACC,UAAU,CAACI,QAAX,EAAD,CAAf;AACD","sourcesContent":["import type { NavigationState, ParamListBase } from '@react-navigation/routers';\nimport * as React from 'react';\n\nimport type { NavigationProp } from './types';\nimport useNavigation from './useNavigation';\n\ntype Selector<ParamList extends ParamListBase, T> = (\n state: NavigationState<ParamList>\n) => T;\n\n/**\n * Hook to get a value from the current navigation state using a selector.\n *\n * @param selector Selector function to get a value from the state.\n */\nexport default function useNavigationState<ParamList extends ParamListBase, T>(\n selector: Selector<ParamList, T>\n): T {\n const navigation = useNavigation<NavigationProp<ParamList>>();\n\n // We don't care about the state value, we run the selector again at the end\n // The state is only to make sure that there's a re-render when we have a new value\n const [, setResult] = React.useState(() => selector(navigation.getState()));\n\n // We store the selector in a ref to avoid re-subscribing listeners every render\n const selectorRef = React.useRef(selector);\n\n React.useEffect(() => {\n selectorRef.current = selector;\n });\n\n React.useEffect(() => {\n const unsubscribe = navigation.addListener('state', (e) => {\n setResult(selectorRef.current(e.data.state));\n });\n\n return unsubscribe;\n }, [navigation]);\n\n return selector(navigation.getState());\n}\n"]}
\No newline at end of file