Skip to content

Commit 05008ee

Browse files
author
Sanjeev Yadav
committed
feat: Support dark mode in react-navigation
1 parent fcd9d3b commit 05008ee

File tree

6 files changed

+52
-15
lines changed

6 files changed

+52
-15
lines changed

__mocks__/react-native-appearance.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from 'react-native-appearance/src/mock';

android/app/src/main/java/com/rnmagentographql/MainActivity.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.rnmagentographql;
22

33
import com.facebook.react.ReactActivity;
4+
import android.content.Intent;
5+
import android.content.res.Configuration;
46

57
public class MainActivity extends ReactActivity {
68

@@ -12,4 +14,12 @@ public class MainActivity extends ReactActivity {
1214
protected String getMainComponentName() {
1315
return "RNMagentoGraphQL";
1416
}
17+
18+
@Override
19+
public void onConfigurationChanged(Configuration newConfig) {
20+
super.onConfigurationChanged(newConfig);
21+
Intent intent = new Intent("onConfigurationChanged");
22+
intent.putExtra("newConfig", newConfig);
23+
sendBroadcast(intent);
24+
}
1525
}

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
"i18n-js": "^3.8.0",
2727
"react": "16.13.1",
2828
"react-native": "0.63.3",
29+
"react-native-appearance": "^0.3.4",
2930
"react-native-elements": "^3.0.1",
3031
"react-native-gesture-handler": "^1.9.0",
3132
"react-native-localize": "^2.0.1",

src/App.tsx

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React, { useEffect, useState } from 'react';
2+
import { Appearance, AppearanceProvider } from 'react-native-appearance';
23
import { ThemeProvider } from 'react-native-elements';
34
import { OverflowMenuProvider } from 'react-navigation-header-buttons';
45
import Navigator from './navigation';
@@ -8,22 +9,36 @@ import { theme } from './theme';
89
import { Spinner } from './components';
910

1011
const App = (): React.ReactElement => {
12+
const [colorScheme, setColorScheme] = useState('light');
1113
const [client, setClient] = useState<ApolloClient<any>>();
1214

15+
console.log(colorScheme);
16+
1317
useEffect(() => {
1418
getApolloClient()
1519
.then(setClient)
1620
.catch(e => console.log(e));
21+
22+
const subscription = Appearance.addChangeListener(
23+
({ colorScheme: newColorScheme }) => {
24+
// do something with color scheme
25+
setColorScheme(newColorScheme);
26+
},
27+
);
28+
29+
return () => subscription.remove();
1730
}, []);
1831

1932
if (client) {
2033
return (
2134
<ApolloProvider client={client}>
22-
<ThemeProvider theme={theme}>
23-
<OverflowMenuProvider>
24-
<Navigator />
25-
</OverflowMenuProvider>
26-
</ThemeProvider>
35+
<AppearanceProvider>
36+
<ThemeProvider useDark={colorScheme === 'dark'}>
37+
<OverflowMenuProvider>
38+
<Navigator />
39+
</OverflowMenuProvider>
40+
</ThemeProvider>
41+
</AppearanceProvider>
2742
</ApolloProvider>
2843
);
2944
}

src/components/CustomHeaderButtons/CustomHeaderButtons.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@ import {
66
HeaderButtonProps,
77
HeaderButtonsProps,
88
} from 'react-navigation-header-buttons';
9+
import { useTheme } from '@react-navigation/native';
910

1011
// define IconComponent, color, sizes and OverflowIcon in one place
11-
const CustomHeaderButton = (props: HeaderButtonProps) => (
12-
<HeaderButton
13-
IconComponent={MaterialIcons}
14-
iconSize={23}
15-
color="black"
16-
{...props}
17-
/>
18-
);
12+
const CustomHeaderButton = (props: HeaderButtonProps) => {
13+
const { colors } = useTheme();
14+
return (
15+
<HeaderButton
16+
IconComponent={MaterialIcons}
17+
iconSize={23}
18+
color={colors.text}
19+
{...props}
20+
/>
21+
);
22+
};
1923

2024
export const CustomHeaderButtons = (props: HeaderButtonsProps) => {
2125
return (

src/navigation/RootNavigator.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
import React from 'react';
2-
import { NavigationContainer } from '@react-navigation/native';
2+
import {
3+
DarkTheme,
4+
DefaultTheme,
5+
NavigationContainer,
6+
} from '@react-navigation/native';
37
import { createDrawerNavigator } from '@react-navigation/drawer';
8+
import { useColorScheme } from 'react-native-appearance';
49
import StackNavigator from './StackNavigator';
510
import { DrawerScreen } from '../screens';
611
import { useCart } from '../logic/cart/useCart';
712

813
const Drawer = createDrawerNavigator();
914

1015
const RootNavigator = () => {
16+
const scheme = useColorScheme();
1117
const { cartId } = useCart();
1218
return (
13-
<NavigationContainer>
19+
<NavigationContainer theme={scheme === 'dark' ? DarkTheme : DefaultTheme}>
1420
<Drawer.Navigator drawerContent={props => <DrawerScreen {...props} />}>
1521
<Drawer.Screen
1622
name="drawer"

0 commit comments

Comments
 (0)