Skip to content

Commit cf9eae0

Browse files
committed
$media store by @PaulMaly πŸ‘πŸ»
1 parent 54c13ef commit cf9eae0

File tree

2 files changed

+40
-15
lines changed

2 files changed

+40
-15
lines changed

β€Žsrc/stores/media.tsβ€Ž

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
1-
import watchMedia from 'svelte-media';
1+
import { type Readable, readable } from 'svelte/store';
22

3-
const mediaqueries = {
3+
export type Queries = {
4+
[key: string]: boolean | string;
5+
};
6+
7+
type MediaObject = {
8+
[key: string]: MediaQueryList
9+
}
10+
11+
const queries: Queries = {
412
xs: '(max-width: 480px)',
513
sm: '(max-width: 600px)',
614
md: '(max-width: 840px)',
@@ -15,4 +23,29 @@ const mediaqueries = {
1523
touch: '(hover: none)',
1624
};
1725

18-
export const media = watchMedia(mediaqueries);
26+
export const media: Readable<Queries> = mediaStore(queries)
27+
28+
function mediaStore(queries: Queries = {}) {
29+
return readable({}, (set) => {
30+
let mqs = Object.entries(queries).reduce((mqs: MediaObject, [key, query]) => {
31+
mqs[key] = window.matchMedia(query as string);
32+
mqs[key].onchange = (mq) => {
33+
mqs[key] = mq;
34+
update();
35+
};
36+
return mqs as MediaObject;
37+
}, {});
38+
39+
function update() {
40+
const matches: Queries = Object.entries(mqs).reduce((matches: Queries, [key, mq]) => {
41+
matches[key] = mq.matches;
42+
return matches;
43+
}, {});
44+
set(matches);
45+
}
46+
47+
update();
48+
49+
return () => mqs = {};
50+
});
51+
}

β€Žsrc/stores/theme.tsβ€Ž

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,7 @@
1-
import { writable } from 'svelte/store';
2-
3-
const darkMedia = window.matchMedia('(prefers-color-scheme: dark)')
1+
import { writable, get } from 'svelte/store';
2+
import { media } from '@/stores/media';
43

54
export const darkTheme = writable(
6-
JSON.parse(sessionStorage.getItem('optimade_darkTheme') as string) ?? darkMedia.matches
5+
JSON.parse(sessionStorage.getItem('optimade_darkTheme') as string) ?? get(media).dark
76
);
8-
darkTheme.subscribe((val) => sessionStorage.setItem('optimade_darkTheme', val));
9-
10-
11-
function handleMediaChange(event: { matches: boolean; }) {
12-
darkTheme.set(event.matches)
13-
}
14-
// handleMediaChange(darkMedia)
15-
darkMedia.addEventListener('change', handleMediaChange);
7+
darkTheme.subscribe((val) => sessionStorage.setItem('optimade_darkTheme', val));

0 commit comments

Comments
Β (0)