diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx index 75f7a9f1d..9688902b7 100644 --- a/packages/ui/src/App.tsx +++ b/packages/ui/src/App.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { Route, Switch } from 'react-router-dom'; import AppContent from './components/AppContent'; +import useTheme from './hooks/use-theme'; import initI18n from './init/i18n'; import Consent from './pages/Consent'; import SignIn from './pages/SignIn'; @@ -9,14 +10,18 @@ import './scss/normalized.scss'; initI18n(); -const App = () => ( - - - - - - - -); +const App = () => { + const theme = useTheme(); + + return ( + + + + + + + + ); +}; export default App; diff --git a/packages/ui/src/hooks/use-theme.ts b/packages/ui/src/hooks/use-theme.ts new file mode 100644 index 000000000..b9e9a09d3 --- /dev/null +++ b/packages/ui/src/hooks/use-theme.ts @@ -0,0 +1,22 @@ +import { useState, useEffect } from 'react'; +import { Theme } from '@/components/AppContent'; + +const darkThemeWatchMedia = window.matchMedia('(prefers-color-scheme: dark)'); +const getThemeBySystemConfiguration = (): Theme => (darkThemeWatchMedia.matches ? 'dark' : 'light'); + +export default function useTheme() { + const [theme, setTheme] = useState(getThemeBySystemConfiguration()); + + useEffect(() => { + const changeTheme = () => { + setTheme(getThemeBySystemConfiguration()); + }; + + darkThemeWatchMedia.addEventListener('change', changeTheme); + return () => { + darkThemeWatchMedia.removeEventListener('change', changeTheme); + }; + }, []); + + return theme; +}