|
1 | | -import { useCallback, useEffect } from 'react' |
| 1 | +import { useEffect } from 'react' |
2 | 2 | import { Theme, THEME_MATCH_MEDIA_DARK } from 'uiSrc/constants' |
3 | 3 | import { useThemeContext } from 'uiSrc/contexts/themeContext' |
4 | 4 |
|
5 | | -let mediaQuery = window.matchMedia?.(THEME_MATCH_MEDIA_DARK) |
6 | | - |
7 | 5 | /** |
8 | 6 | * Hook that listens to OS system theme changes |
9 | 7 | * and updates the theme context when user has System theme selected. |
10 | 8 | */ |
11 | 9 | export const useSystemThemeListener = () => { |
12 | 10 | const { usingSystemTheme, changeTheme } = useThemeContext() |
13 | 11 |
|
14 | | - const handleSystemThemeChange = useCallback(() => { |
15 | | - usingSystemTheme && changeTheme(Theme.System) |
16 | | - }, [changeTheme, usingSystemTheme]) |
17 | | - |
18 | 12 | useEffect(() => { |
19 | | - if (!mediaQuery) { |
20 | | - // Initialize mediaQuery if not done already because window might not be defined when module is loaded |
21 | | - mediaQuery = window.matchMedia?.(THEME_MATCH_MEDIA_DARK) |
| 13 | + const handleSystemThemeChange = () => { |
| 14 | + changeTheme(Theme.System) |
22 | 15 | } |
23 | | - // Only listen if using system theme |
24 | | - if (usingSystemTheme) { |
25 | | - if (!mediaQuery) { |
26 | | - return undefined |
27 | | - } |
| 16 | + const mediaQuery = window.matchMedia?.(THEME_MATCH_MEDIA_DARK) |
| 17 | + if (usingSystemTheme && mediaQuery) { |
28 | 18 | mediaQuery.addEventListener('change', handleSystemThemeChange) |
29 | 19 | } |
| 20 | + |
30 | 21 | return () => { |
31 | | - if (mediaQuery) { |
32 | | - mediaQuery.removeEventListener('change', handleSystemThemeChange) |
33 | | - } |
| 22 | + mediaQuery.removeEventListener('change', handleSystemThemeChange) |
34 | 23 | } |
35 | | - }, [usingSystemTheme]) |
| 24 | + }, [usingSystemTheme, changeTheme]) |
36 | 25 | } |
0 commit comments