-
-
Notifications
You must be signed in to change notification settings - Fork 643
Expand file tree
/
Copy pathTabsContainerItem.tsx
More file actions
85 lines (70 loc) · 2.46 KB
/
TabsContainerItem.tsx
File metadata and controls
85 lines (70 loc) · 2.46 KB
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import React from 'react';
import { Tabs } from "react-native-screens";
import type { TabRouteConfig } from './TabsContainer.types';
import type { TabsContainerItemProps } from './TabsContainerItem.types';
import { SafeAreaView, type SafeAreaViewProps } from 'react-native-screens/experimental';
import { Platform } from 'react-native';
import { TabsNavigationContext } from './contexts/TabsNavigationContext';
import { RNSLog } from 'react-native-screens/private';
export const TabsContainerItem = React.memo(TabsContainerItemImpl);
function TabsContainerItemImpl(props: TabsContainerItemProps) {
RNSLog.info(
`TabsContainerItem render: ${props.route.routeKey} ${props.isSelected ? '(selected)' : ''
} ${props.pendingForUpdate ? '(pending)' : ''}`,
);
const tabsNavigationContext = React.useMemo(() => {
return {
routeKey: props.route.routeKey,
routeOptions: { ...props.route.options },
setRouteOptions: props.navMethods.setRouteOptions,
selectTab: props.navMethods.selectTab,
isSelected: props.isSelected,
shouldRenderContents: props.isSelected || props.pendingForUpdate,
}
}, [props.route.routeKey, props.route.options, props.navMethods, props.isSelected, props.pendingForUpdate]);
const { safeAreaConfiguration, ...nativeOptions } = props.route.options ?? {};
const screenKey = props.route.routeKey;
return (
<Tabs.Screen
key={screenKey}
{...nativeOptions}
screenKey={screenKey}>
<TabsNavigationContext value={tabsNavigationContext}>
{getContent(props.Component, safeAreaConfiguration)}
</TabsNavigationContext>
</Tabs.Screen>
);
}
function getContent(
Component: TabRouteConfig['Component'],
safeAreaConfiguration: SafeAreaViewProps | undefined,
) {
const safeAreaConfigurationWithDefault = getSafeAreaViewEdges(
safeAreaConfiguration?.edges,
);
const anySAVEdgeSet = Object.values(safeAreaConfigurationWithDefault).some(
edge => edge === true,
);
if (anySAVEdgeSet) {
return (
<SafeAreaView {...safeAreaConfiguration}>
<Component />
</SafeAreaView>
);
}
return <Component />;
}
function getSafeAreaViewEdges(
edges?: SafeAreaViewProps['edges'],
): NonNullable<SafeAreaViewProps['edges']> {
let defaultEdges: SafeAreaViewProps['edges'];
switch (Platform.OS) {
case 'android':
defaultEdges = { bottom: true };
break;
default:
defaultEdges = {};
break;
}
return { ...defaultEdges, ...edges };
}