Skip to content

Commit 11c3d7b

Browse files
committed
Add the themeprovider and themecontext.
1 parent 61aa713 commit 11c3d7b

File tree

3 files changed

+53
-11
lines changed

3 files changed

+53
-11
lines changed

netflix-create-react-vite-app/src/app/App.tsx

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,22 @@ import { PopularAndTrending } from '../pages/popular-trending/popularAndTrending
88
import { Shows } from '../pages/shows/shows';
99

1010
import { GlobalStyle } from '../styles/global';
11+
import { ThemeProvider as StyledThemeProvider } from 'styled-components';
12+
import { ThemeProvider, useTheme } from '../context/themeContext';
1113

1214
export const App = () => {
1315
return (
14-
<>
16+
<ThemeProvider>
17+
<AppContent />
18+
</ThemeProvider>
19+
);
20+
};
21+
22+
const AppContent = () => {
23+
const { theme } = useTheme();
24+
25+
return (
26+
<StyledThemeProvider theme={theme}>
1527
<GlobalStyle />
1628
<Routes>
1729
<Route element={<Homepage />} path='/' />
@@ -22,6 +34,6 @@ export const App = () => {
2234
<Route element={<MediaDetail type="movie" />} path='/movies/:id' />
2335
<Route element={<MediaDetail type="tv" />} path='/shows/:id' />
2436
</Routes>
25-
</>
37+
</StyledThemeProvider>
2638
);
2739
};
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React, { createContext, useState, useContext, ReactNode } from 'react';
2+
import { DefaultTheme } from 'styled-components';
3+
import { purpleTheme, yellowTheme } from '../styles/themes/themes';
4+
5+
interface ThemeContextType {
6+
theme: DefaultTheme;
7+
toggleTheme: () => void;
8+
}
9+
10+
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
11+
12+
export const ThemeProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
13+
const [currentTheme, setCurrentTheme] = useState<DefaultTheme>(purpleTheme);
14+
15+
const toggleTheme = () => {
16+
setCurrentTheme((prevTheme) =>
17+
prevTheme === purpleTheme ? yellowTheme : purpleTheme
18+
);
19+
};
20+
21+
return (
22+
<ThemeContext.Provider value={{ theme: currentTheme, toggleTheme }}>
23+
{children}
24+
</ThemeContext.Provider>
25+
);
26+
};
27+
28+
export const useTheme = () => {
29+
const context = useContext(ThemeContext);
30+
if (context === undefined) {
31+
throw new Error('useTheme must be used within a ThemeProvider');
32+
}
33+
return context;
34+
};
Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
11
import React from 'react';
22
import ReactDOM from 'react-dom/client';
33
import { BrowserRouter } from 'react-router-dom';
4-
import { ThemeProvider } from 'styled-components';
5-
import { theme } from './styles/theme';
64
import '../i18n';
75
import { App } from './app/App';
86
import { MyListProvider } from './context/myListContext';
97

108
ReactDOM.createRoot(document.getElementById('root')!).render(
119
<React.StrictMode>
12-
<ThemeProvider theme={theme}>
13-
<BrowserRouter>
14-
<MyListProvider>
15-
<App />
16-
</MyListProvider>
17-
</BrowserRouter>
18-
</ThemeProvider>
10+
<BrowserRouter>
11+
<MyListProvider>
12+
<App />
13+
</MyListProvider>
14+
</BrowserRouter>
1915
</React.StrictMode>
2016
);

0 commit comments

Comments
 (0)