Skip to content

Commit

Permalink
Theme toggle tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
domhhv committed Feb 8, 2024
1 parent d7c8d07 commit 447b95a
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 5 deletions.
5 changes: 3 additions & 2 deletions src/components/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import {
CalendarEventsProvider,
SnackbarProvider,
} from '@context';
import { USER_THEME_STORAGE_KEY } from '@hooks';
import { CssVarsProvider, styled } from '@mui/joy';
import { SessionContextProvider } from '@supabase/auth-helpers-react';
import { supabaseClient, theme } from '@utils';
Expand All @@ -21,8 +22,8 @@ const App = () => {
return (
<CssVarsProvider
theme={theme}
defaultMode="system"
modeStorageKey="user_mode_preference"
defaultMode="light"
modeStorageKey={USER_THEME_STORAGE_KEY}
>
<SessionContextProvider supabaseClient={supabaseClient}>
<SnackbarProvider>
Expand Down
7 changes: 4 additions & 3 deletions src/components/header/ThemeToggle.tsx
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { ThemeModes, useTheme } from '@hooks';
import LightModeRoundedIcon from '@mui/icons-material/LightModeRounded';
import NightlightRoundRoundedIcon from '@mui/icons-material/NightlightRoundRounded';
import { Button, useColorScheme } from '@mui/joy';
Expand All @@ -6,22 +7,22 @@ import React from 'react';
import { StyledToggleModeIconButton } from './styled';

const ThemeToggle = () => {
useTheme();
const { mode, setMode } = useColorScheme();

const handleToggleMode = () => {
setMode(mode === 'light' ? 'dark' : 'light');
setMode(mode === ThemeModes.LIGHT ? ThemeModes.DARK : ThemeModes.LIGHT);
};

return (
<>
<StyledToggleModeIconButton onClick={handleToggleMode}>
{mode === 'light' ? (
{mode === ThemeModes.LIGHT ? (
<NightlightRoundRoundedIcon />
) : (
<LightModeRoundedIcon />
)}
</StyledToggleModeIconButton>
<Button variant="plain">Current theme: {mode}</Button>
</>
);
};
Expand Down
2 changes: 2 additions & 0 deletions src/hooks/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export * from './useTheme';
export { default as useTheme } from './useTheme';
47 changes: 47 additions & 0 deletions src/hooks/useTheme.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { useColorScheme } from '@mui/joy';
import React from 'react';

export const USER_THEME_STORAGE_KEY = 'user-theme-preference';

export enum ThemeModes {
LIGHT = 'light',
DARK = 'dark',
}

const useTheme = () => {
const { setMode } = useColorScheme();
const [theme, setTheme] = React.useState<ThemeModes>(ThemeModes.LIGHT);

const darkThemeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');

React.useEffect(() => {
const userTheme = localStorage.getItem(
USER_THEME_STORAGE_KEY
) as ThemeModes | null;

if (userTheme) {
setTheme(userTheme);
} else {
setTheme(
darkThemeMediaQuery.matches ? ThemeModes.DARK : ThemeModes.LIGHT
);
}
}, [darkThemeMediaQuery.matches]);

React.useEffect(() => {
if (theme) {
setMode(theme);
localStorage.setItem(USER_THEME_STORAGE_KEY, theme);
}
}, [theme, setMode]);

darkThemeMediaQuery.addEventListener('change', (mediaQueryListEvent) => {
setTheme(mediaQueryListEvent.matches ? ThemeModes.DARK : ThemeModes.LIGHT);
});

return {
theme,
};
};

export default useTheme;

0 comments on commit 447b95a

Please sign in to comment.