Skip to content

Commit 5c538ba

Browse files
committed
fix: platform specific setup
1 parent 2c31a79 commit 5c538ba

File tree

2 files changed

+51
-46
lines changed

2 files changed

+51
-46
lines changed

apps/showcase/app/_layout.tsx

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { DeprecatedUi } from '@rnr/reusables';
55
import { Stack } from 'expo-router';
66
import { StatusBar } from 'expo-status-bar';
77
import * as React from 'react';
8-
import { Platform } from 'react-native';
8+
import { Appearance, Platform } from 'react-native';
99
import { GestureHandlerRootView } from 'react-native-gesture-handler';
1010
import { ThemeToggle } from '~/components/ThemeToggle';
1111
import { Text } from '~/components/ui/text';
@@ -34,28 +34,16 @@ export const unstable_settings = {
3434
initialRouteName: '(tabs)',
3535
};
3636

37-
export default function RootLayout() {
38-
const hasMounted = React.useRef(false);
39-
const { colorScheme, isDarkColorScheme } = useColorScheme();
40-
const [isColorSchemeLoaded, setIsColorSchemeLoaded] = React.useState(false);
41-
42-
useIsomorphicLayoutEffect(() => {
43-
if (hasMounted.current) {
44-
return;
45-
}
37+
const usePlatformSpecificSetup = Platform.select({
38+
web: useSetWebBackgroundClassName,
39+
android: useSetAndroidNavigationBar,
40+
default: noop,
41+
});
4642

47-
if (Platform.OS === 'web') {
48-
// Adds the background color to the html element to prevent white background on overscroll.
49-
document.documentElement.classList.add('bg-background');
50-
}
51-
setAndroidNavigationBar(colorScheme);
52-
setIsColorSchemeLoaded(true);
53-
hasMounted.current = true;
54-
}, []);
43+
export default function RootLayout() {
44+
const { isDarkColorScheme } = useColorScheme();
5545

56-
if (!isColorSchemeLoaded) {
57-
return null;
58-
}
46+
usePlatformSpecificSetup();
5947

6048
return (
6149
<ThemeProvider value={isDarkColorScheme ? DARK_THEME : LIGHT_THEME}>
@@ -95,9 +83,6 @@ export default function RootLayout() {
9583
);
9684
}
9785

98-
const useIsomorphicLayoutEffect =
99-
Platform.OS === 'web' && typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;
100-
10186
function toOptions(name: string) {
10287
const title = name
10388
.split('-')
@@ -109,3 +94,21 @@ function toOptions(name: string) {
10994
.join(' ');
11095
return title;
11196
}
97+
98+
const useIsomorphicLayoutEffect =
99+
Platform.OS === 'web' && typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;
100+
101+
function useSetWebBackgroundClassName() {
102+
useIsomorphicLayoutEffect(() => {
103+
// Adds the background color to the html element to prevent white background on overscroll.
104+
document.documentElement.classList.add('bg-background');
105+
}, []);
106+
}
107+
108+
function useSetAndroidNavigationBar() {
109+
React.useLayoutEffect(() => {
110+
setAndroidNavigationBar(Appearance.getColorScheme() ?? 'light');
111+
}, []);
112+
}
113+
114+
function noop() {}

packages/templates/starter-base/app/_layout.tsx

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { DarkTheme, DefaultTheme, Theme, ThemeProvider } from '@react-navigation
44
import { Stack } from 'expo-router';
55
import { StatusBar } from 'expo-status-bar';
66
import * as React from 'react';
7-
import { Platform } from 'react-native';
7+
import { Appearance, Platform, View } from 'react-native';
88
import { NAV_THEME } from '~/lib/constants';
99
import { useColorScheme } from '~/lib/useColorScheme';
1010
import { PortalHost } from '@rn-primitives/portal';
@@ -25,28 +25,15 @@ export {
2525
ErrorBoundary,
2626
} from 'expo-router';
2727

28-
export default function RootLayout() {
29-
const hasMounted = React.useRef(false);
30-
const { colorScheme, isDarkColorScheme } = useColorScheme();
31-
const [isColorSchemeLoaded, setIsColorSchemeLoaded] = React.useState(false);
32-
33-
useIsomorphicLayoutEffect(() => {
34-
if (hasMounted.current) {
35-
return;
36-
}
28+
const usePlatformSpecificSetup = Platform.select({
29+
web: useSetWebBackgroundClassName,
30+
android: useSetAndroidNavigationBar,
31+
default: noop,
32+
});
3733

38-
if (Platform.OS === 'web') {
39-
// Adds the background color to the html element to prevent white background on overscroll.
40-
document.documentElement.classList.add('bg-background');
41-
}
42-
setAndroidNavigationBar(colorScheme);
43-
setIsColorSchemeLoaded(true);
44-
hasMounted.current = true;
45-
}, []);
46-
47-
if (!isColorSchemeLoaded) {
48-
return null;
49-
}
34+
export default function RootLayout() {
35+
usePlatformSpecificSetup();
36+
const { isDarkColorScheme } = useColorScheme();
5037

5138
return (
5239
<ThemeProvider value={isDarkColorScheme ? DARK_THEME : LIGHT_THEME}>
@@ -67,3 +54,18 @@ export default function RootLayout() {
6754

6855
const useIsomorphicLayoutEffect =
6956
Platform.OS === 'web' && typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect;
57+
58+
function useSetWebBackgroundClassName() {
59+
useIsomorphicLayoutEffect(() => {
60+
// Adds the background color to the html element to prevent white background on overscroll.
61+
document.documentElement.classList.add('bg-background');
62+
}, []);
63+
}
64+
65+
function useSetAndroidNavigationBar() {
66+
React.useLayoutEffect(() => {
67+
setAndroidNavigationBar(Appearance.getColorScheme() ?? 'light');
68+
}, []);
69+
}
70+
71+
function noop() {}

0 commit comments

Comments
 (0)