|
9 | 9 | useOnWindow,
|
10 | 10 | useSignal,
|
11 | 11 | useTask$,
|
| 12 | + useVisibleTask$, |
12 | 13 | } from '@builder.io/qwik';
|
13 | 14 | import { ThemeScript } from './theme-script';
|
14 | 15 | import type { SystemTheme, Theme, ThemeProviderProps, UseThemeProps } from './types';
|
@@ -38,13 +39,13 @@ export const ThemeProvider = component$<ThemeProviderProps>(
|
38 | 39 |
|
39 | 40 | const attrs = !value ? themes.flat() : Object.values(value);
|
40 | 41 |
|
41 |
| - const applyTheme = $((theme: Theme) => { |
| 42 | + const applyTheme = $(async (theme: Theme) => { |
42 | 43 | let resolved = theme;
|
43 | 44 | if (!resolved) return;
|
44 | 45 |
|
45 | 46 | // If theme is system, resolve it before setting theme
|
46 | 47 | if (theme === 'system' && enableSystem) {
|
47 |
| - resolved = getSystemTheme(); |
| 48 | + resolved = await getSystemTheme(); |
48 | 49 | }
|
49 | 50 |
|
50 | 51 | // Join the array of attr if the theme is an array
|
@@ -72,25 +73,30 @@ export const ThemeProvider = component$<ThemeProviderProps>(
|
72 | 73 |
|
73 | 74 | // DO NOT UNCOMMENT. THIS CAUSES BUNDLE ISSUE ACROSS SITE -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
|
74 | 75 | // eslint-disable-next-line qwik/no-use-visible-task -- not possible atm to useOnWindow for a MediaQueryList event
|
75 |
| - // useVisibleTask$(({ cleanup }) => { |
76 |
| - // // themeSig.value = localStorage.getItem(storageKey) || defaultTheme; |
77 |
| - // const media = window.matchMedia('(prefers-color-scheme: dark)'); |
| 76 | + useVisibleTask$( |
| 77 | + ({ cleanup }) => { |
| 78 | + setTimeout(() => { |
| 79 | + themeSig.value = localStorage.getItem(storageKey) || defaultTheme; |
| 80 | + }, 1000); |
| 81 | + const media = window.matchMedia('(prefers-color-scheme: dark)'); |
78 | 82 |
|
79 |
| - // const handleMediaQuery = $((e: MediaQueryListEvent | MediaQueryList) => { |
80 |
| - // const resolved = getSystemTheme(e); |
81 |
| - // resolvedThemeSig.value = resolved; |
| 83 | + const handleMediaQuery = $(async (e: MediaQueryListEvent | MediaQueryList) => { |
| 84 | + const resolved = await getSystemTheme(e); |
| 85 | + resolvedThemeSig.value = resolved; |
82 | 86 |
|
83 |
| - // if (themeSig.value === 'system' && enableSystem && !forcedTheme) { |
84 |
| - // applyTheme('system'); |
85 |
| - // } |
86 |
| - // }); |
| 87 | + if (themeSig.value === 'system' && enableSystem && !forcedTheme) { |
| 88 | + applyTheme('system'); |
| 89 | + } |
| 90 | + }); |
87 | 91 |
|
88 |
| - // media.addEventListener('change', handleMediaQuery); |
| 92 | + media.addEventListener('change', handleMediaQuery); |
89 | 93 |
|
90 |
| - // handleMediaQuery(media); |
| 94 | + handleMediaQuery(media); |
91 | 95 |
|
92 |
| - // cleanup(() => media.removeEventListener('change', handleMediaQuery)); |
93 |
| - // }); |
| 96 | + cleanup(() => media.removeEventListener('change', handleMediaQuery)); |
| 97 | + }, |
| 98 | + { strategy: 'document-idle' }, |
| 99 | + ); |
94 | 100 |
|
95 | 101 | // localStorage event handling
|
96 | 102 |
|
@@ -163,12 +169,12 @@ export const ThemeProvider = component$<ThemeProviderProps>(
|
163 | 169 | },
|
164 | 170 | );
|
165 | 171 |
|
166 |
| -const getSystemTheme = (mq?: MediaQueryList | MediaQueryListEvent): SystemTheme => { |
| 172 | +const getSystemTheme = $((mq?: MediaQueryList | MediaQueryListEvent): SystemTheme => { |
167 | 173 | const currMq = mq || window.matchMedia('(prefers-color-scheme: dark)');
|
168 | 174 | const isDark = currMq.matches;
|
169 | 175 | const systemTheme = isDark ? 'dark' : 'light';
|
170 | 176 | return systemTheme;
|
171 |
| -}; |
| 177 | +}); |
172 | 178 |
|
173 | 179 | const disableAnimation = () => {
|
174 | 180 | const css = document.createElement('style');
|
|
0 commit comments