Skip to content

Commit a4bfdca

Browse files
committed
fix: guard matchMedia in theme toggle tests
1 parent 7948a58 commit a4bfdca

3 files changed

Lines changed: 26 additions & 4 deletions

File tree

src/components/ThemeToggle.jsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ const themes = ['system', 'light', 'dark'];
55

66
function applyTheme(theme) {
77
const root = document.documentElement;
8-
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
8+
const prefersDark = window.matchMedia
9+
? window.matchMedia('(prefers-color-scheme: dark)').matches
10+
: false;
911
if (theme === 'dark' || (theme === 'system' && prefersDark)) {
1012
root.classList.add('dark');
1113
} else {
@@ -22,10 +24,12 @@ export function ThemeToggle({ className = '' }) {
2224
}, [theme]);
2325

2426
useEffect(() => {
25-
const media = window.matchMedia('(prefers-color-scheme: dark)');
27+
const media = window.matchMedia
28+
? window.matchMedia('(prefers-color-scheme: dark)')
29+
: null;
2630
const listener = () => theme === 'system' && applyTheme('system');
27-
media.addEventListener('change', listener);
28-
return () => media.removeEventListener('change', listener);
31+
media?.addEventListener('change', listener);
32+
return () => media?.removeEventListener('change', listener);
2933
}, [theme]);
3034

3135
const cycleTheme = () => {

vite.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export default defineConfig({
1515
},
1616
test: {
1717
environment: 'jsdom',
18+
setupFiles: ['./vitest.setup.js'],
1819
coverage: {
1920
provider: 'v8',
2021
reporter: ['text', 'lcov'],

vitest.setup.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { vi } from 'vitest';
2+
3+
if (!window.matchMedia) {
4+
Object.defineProperty(window, 'matchMedia', {
5+
writable: true,
6+
value: vi.fn().mockImplementation((query) => ({
7+
matches: false,
8+
media: query,
9+
onchange: null,
10+
addListener: vi.fn(),
11+
removeListener: vi.fn(),
12+
addEventListener: vi.fn(),
13+
removeEventListener: vi.fn(),
14+
dispatchEvent: vi.fn(),
15+
})),
16+
});
17+
}

0 commit comments

Comments
 (0)