-
Notifications
You must be signed in to change notification settings - Fork 2.8k
/
getTopmostReportId.ts
48 lines (38 loc) · 1.65 KB
/
getTopmostReportId.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import type {NavigationState, PartialState} from '@react-navigation/native';
import NAVIGATORS from '@src/NAVIGATORS';
import SCREENS from '@src/SCREENS';
import type {RootStackParamList} from './types';
// This function is in a separate file than Navigation.ts to avoid cyclic dependency.
/**
* Find the last visited report screen in the navigation state and get the id of it.
*
* @param state - The react-navigation state
* @returns - It's possible that there is no report screen
*/
function getTopmostReportId(state: NavigationState | NavigationState<RootStackParamList> | PartialState<NavigationState>): string | undefined {
if (!state) {
return;
}
const topmostCentralPane = state.routes.filter((route) => route.name === NAVIGATORS.CENTRAL_PANE_NAVIGATOR).at(-1);
if (!topmostCentralPane) {
return;
}
const directReportParams = topmostCentralPane.params && 'params' in topmostCentralPane.params && topmostCentralPane?.params?.params;
const directReportIdParam = directReportParams && 'reportID' in directReportParams && directReportParams?.reportID;
if (!topmostCentralPane.state && !directReportIdParam) {
return;
}
if (directReportIdParam) {
return directReportIdParam;
}
const topmostReport = topmostCentralPane.state?.routes.filter((route) => route.name === SCREENS.REPORT).at(-1);
if (!topmostReport) {
return;
}
const topmostReportId = topmostReport.params && 'reportID' in topmostReport.params && topmostReport.params?.reportID;
if (typeof topmostReportId !== 'string') {
return;
}
return topmostReportId;
}
export default getTopmostReportId;