-
Notifications
You must be signed in to change notification settings - Fork 0
/
interpolator.jsx
65 lines (57 loc) · 1.49 KB
/
interpolator.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import {useEffect, useState} from 'react';
import PropTypes from 'prop-types';
const defaultFilter = {
brightness: 100,
contrast: 90,
sepia: 10
};
export default function Interpolator({
appearance,
watchSystem = false,
filter,
children
}) {
if (window) {
const {
enable: enableDarkMode,
disable: disableDarkMode
} = require('darkreader');
const mq = window.matchMedia('(prefers-color-scheme: dark)');
const [watchIsDark, setWatchIsDark] = useState(mq.matches);
function updateWatch(update) {
setWatchIsDark(update.matches);
}
useEffect(() => {
mq.addEventListener('change', updateWatch);
return () => mq.removeEventListener('change', updateWatch);
}, [mq]);
const filterProps = filter ? filter : defaultFilter;
const {
brightness = defaultFilter.brightness,
contrast = defaultFilter.contrast,
sepia = defaultFilter.sepia
} = filterProps;
if (
(watchSystem && watchIsDark) ||
(!watchSystem && appearance === 'dark')
) {
enableDarkMode({brightness, contrast, sepia});
} else if (
(watchSystem && !watchIsDark) ||
(!watchSystem && appearance !== 'dark')
) {
disableDarkMode();
}
}
return children;
}
Interpolator.propTypes = {
appearance: PropTypes.string,
watchSystem: PropTypes.bool,
filter: PropTypes.shape({
brightness: PropTypes.number,
contrast: PropTypes.number,
sepia: PropTypes.number
}),
children: PropTypes.node
};