1 | import type { NavigationState, ParamListBase } from '@react-navigation/routers';
|
2 | import * as React from 'react';
|
3 |
|
4 | import type { NavigationProp } from './types';
|
5 | import useNavigation from './useNavigation';
|
6 |
|
7 | type Selector<ParamList extends ParamListBase, T> = (
|
8 | state: NavigationState<ParamList>
|
9 | ) => T;
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 | export default function useNavigationState<ParamList extends ParamListBase, T>(
|
17 | selector: Selector<ParamList, T>
|
18 | ): T {
|
19 | const navigation = useNavigation<NavigationProp<ParamList>>();
|
20 |
|
21 |
|
22 |
|
23 | const [, setResult] = React.useState(() => selector(navigation.getState()));
|
24 |
|
25 |
|
26 | const selectorRef = React.useRef(selector);
|
27 |
|
28 | React.useEffect(() => {
|
29 | selectorRef.current = selector;
|
30 | });
|
31 |
|
32 | React.useEffect(() => {
|
33 | const unsubscribe = navigation.addListener('state', (e) => {
|
34 | setResult(selectorRef.current(e.data.state));
|
35 | });
|
36 |
|
37 | return unsubscribe;
|
38 | }, [navigation]);
|
39 |
|
40 | return selector(navigation.getState());
|
41 | }
|