Skip to content

Commit ca8ed40

Browse files
committed
added dark mode icon
1 parent a1b4119 commit ca8ed40

File tree

7 files changed

+98
-14
lines changed

7 files changed

+98
-14
lines changed

src/app/App.tsx

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,16 @@ import React from 'react';
22
import { MemoryRouter as Router } from 'react-router-dom';
33
import MainContainer from './containers/MainContainer';
44
import { Toaster } from 'react-hot-toast';
5-
6-
/*
7-
'currentTab' is the current active tab within Google Chrome.
8-
This is used to decide what tab Reactime should be monitoring. This can be "locked" currentTabInApp is the current active tab within Reactime (Map, Performance, History, etc).
9-
This is used to determine the proper tutorial to render when How To button is pressed.
10-
*/
5+
import { ThemeProvider } from './ThemeProvider';
116

127
function App(): JSX.Element {
138
return (
14-
<Router>
15-
<Toaster />
16-
<MainContainer />
17-
</Router>
9+
<ThemeProvider>
10+
<Router>
11+
<Toaster />
12+
<MainContainer />
13+
</Router>
14+
</ThemeProvider>
1815
);
1916
}
2017

src/app/FrontendTypes.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ export interface BarStackProp {
4444
currentTab?: string;
4545
}
4646

47-
// On-hover data for BarGraph/BarGraphComparison.tsx
4847
export interface TooltipData {
4948
bar: SeriesPoint<snapshot>;
5049
key: string;
@@ -310,7 +309,6 @@ export interface LinkControlProps {
310309
}
311310

312311
export interface ControlStyles {
313-
//fontSize: string;
314312
padding: string;
315313
}
316314

@@ -328,7 +326,6 @@ export interface DropDownStyle {
328326
export interface Node {
329327
children?: Node[];
330328
name?: string;
331-
// other properties here
332329
}
333330

334331
export interface LinkComponent {

src/app/ThemeProvider.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import React, { createContext, useContext, useState, useEffect } from 'react';
2+
3+
const ThemeContext = createContext({
4+
isDark: false,
5+
toggleTheme: () => {},
6+
});
7+
8+
export const ThemeProvider = ({ children }) => {
9+
const [isDark, setIsDark] = useState(false);
10+
11+
// Check for system preference on mount
12+
useEffect(() => {
13+
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
14+
setIsDark(prefersDark);
15+
}, []);
16+
17+
// Update body class when theme changes
18+
useEffect(() => {
19+
if (isDark) {
20+
document.documentElement.classList.add('dark');
21+
} else {
22+
document.documentElement.classList.remove('dark');
23+
}
24+
}, [isDark]);
25+
26+
const toggleTheme = () => {
27+
setIsDark((prev) => !prev);
28+
};
29+
30+
return <ThemeContext.Provider value={{ isDark, toggleTheme }}>{children}</ThemeContext.Provider>;
31+
};
32+
33+
export const useTheme = () => {
34+
const context = useContext(ThemeContext);
35+
if (context === undefined) {
36+
throw new Error('useTheme must be used within a ThemeProvider');
37+
}
38+
return context;
39+
};

src/app/components/Actions/RecordButton.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22
import { Switch } from '@mui/material';
3+
import ThemeToggle from './ThemeToggle';
34

45
const RecordButton = ({ isRecording, onToggle }) => {
56
return (
@@ -32,6 +33,7 @@ const RecordButton = ({ isRecording, onToggle }) => {
3233
},
3334
}}
3435
/>
36+
<ThemeToggle />
3537
</div>
3638
);
3739
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from 'react';
2+
import { Moon, Sun } from 'lucide-react';
3+
import { useTheme } from '../../ThemeProvider';
4+
5+
const ThemeToggle = () => {
6+
const { isDark, toggleTheme } = useTheme();
7+
8+
return (
9+
<button
10+
className={`theme-toggle ${isDark ? 'dark' : ''}`}
11+
onClick={toggleTheme}
12+
aria-label={`Switch to ${isDark ? 'light' : 'dark'} mode`}
13+
>
14+
{isDark ? <Sun className='theme-toggle-icon' /> : <Moon className='theme-toggle-icon' />}
15+
</button>
16+
);
17+
};
18+
19+
export default ThemeToggle;

src/app/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import './styles/main.scss';
66
import { store } from './store'; //imported RTK Store
77
import { Provider } from 'react-redux'; //imported Provider
88

9-
//Updated rendering sytax for React 18
109
const root = createRoot(document.getElementById('root'));
1110
root.render(
1211
<Provider store={store}>

src/app/styles/components/_buttons.scss

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,34 @@
112112
.clear-button-modern:hover {
113113
background-color: #e5e7eb !important;
114114
}
115+
116+
.theme-toggle {
117+
display: flex;
118+
align-items: center;
119+
justify-content: center;
120+
width: 32px;
121+
height: 32px;
122+
border: none;
123+
border-radius: 6px;
124+
background-color: transparent;
125+
color: #374151;
126+
cursor: pointer;
127+
transition: all 200ms ease;
128+
}
129+
130+
.theme-toggle:hover {
131+
background-color: #f3f4f6;
132+
}
133+
134+
.theme-toggle-icon {
135+
width: 18px;
136+
height: 18px;
137+
}
138+
139+
.theme-toggle.dark {
140+
color: #14b8a6;
141+
}
142+
143+
.theme-toggle.dark:hover {
144+
background-color: rgba(20, 184, 166, 0.1);
145+
}

0 commit comments

Comments
 (0)