Skip to content

Commit 56e4ac2

Browse files
authored
chore(/themes): turn visible task to strategy:document-idle (#938)
* chore(/themes): turn visible task to strategy:document-idle * fix(themes): add timeout to themeSig assignment to localstorage
1 parent aecabbf commit 56e4ac2

File tree

1 file changed

+24
-18
lines changed

1 file changed

+24
-18
lines changed

packages/themes/src/lib/provider.tsx

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
useOnWindow,
1010
useSignal,
1111
useTask$,
12+
useVisibleTask$,
1213
} from '@builder.io/qwik';
1314
import { ThemeScript } from './theme-script';
1415
import type { SystemTheme, Theme, ThemeProviderProps, UseThemeProps } from './types';
@@ -38,13 +39,13 @@ export const ThemeProvider = component$<ThemeProviderProps>(
3839

3940
const attrs = !value ? themes.flat() : Object.values(value);
4041

41-
const applyTheme = $((theme: Theme) => {
42+
const applyTheme = $(async (theme: Theme) => {
4243
let resolved = theme;
4344
if (!resolved) return;
4445

4546
// If theme is system, resolve it before setting theme
4647
if (theme === 'system' && enableSystem) {
47-
resolved = getSystemTheme();
48+
resolved = await getSystemTheme();
4849
}
4950

5051
// Join the array of attr if the theme is an array
@@ -72,25 +73,30 @@ export const ThemeProvider = component$<ThemeProviderProps>(
7273

7374
// DO NOT UNCOMMENT. THIS CAUSES BUNDLE ISSUE ACROSS SITE -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
7475
// 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)');
7882

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;
8286

83-
// if (themeSig.value === 'system' && enableSystem && !forcedTheme) {
84-
// applyTheme('system');
85-
// }
86-
// });
87+
if (themeSig.value === 'system' && enableSystem && !forcedTheme) {
88+
applyTheme('system');
89+
}
90+
});
8791

88-
// media.addEventListener('change', handleMediaQuery);
92+
media.addEventListener('change', handleMediaQuery);
8993

90-
// handleMediaQuery(media);
94+
handleMediaQuery(media);
9195

92-
// cleanup(() => media.removeEventListener('change', handleMediaQuery));
93-
// });
96+
cleanup(() => media.removeEventListener('change', handleMediaQuery));
97+
},
98+
{ strategy: 'document-idle' },
99+
);
94100

95101
// localStorage event handling
96102

@@ -163,12 +169,12 @@ export const ThemeProvider = component$<ThemeProviderProps>(
163169
},
164170
);
165171

166-
const getSystemTheme = (mq?: MediaQueryList | MediaQueryListEvent): SystemTheme => {
172+
const getSystemTheme = $((mq?: MediaQueryList | MediaQueryListEvent): SystemTheme => {
167173
const currMq = mq || window.matchMedia('(prefers-color-scheme: dark)');
168174
const isDark = currMq.matches;
169175
const systemTheme = isDark ? 'dark' : 'light';
170176
return systemTheme;
171-
};
177+
});
172178

173179
const disableAnimation = () => {
174180
const css = document.createElement('style');

0 commit comments

Comments
 (0)