feat(darkmode): listen to browser color preference change

If no color preference is set by user
This commit is contained in:
Jimmy Cai 2020-09-19 00:43:52 +02:00
parent 0f9682e4b4
commit 7e1c7b94bf
No known key found for this signature in database
GPG Key ID: 3EA408E527F37B18

View File

@ -1,29 +1,57 @@
export default () => { export default () => {
const toggleDarkMode = document.getElementById('dark-mode-toggle'); const toggleDarkMode = document.getElementById('dark-mode-toggle');
const darkModeKey = 'StackDarkMode'; const darkModeKey = 'StackDarkMode';
const darkModeItem = localStorage.getItem(darkModeKey);
const darkModeEnabled = localStorage.getItem(darkModeKey) === 'true'; const darkModeEnabled = localStorage.getItem(darkModeKey) === 'true';
const supportDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches === true;
const mql = window.matchMedia('(prefers-color-scheme: dark)');
let darkMode = false; let darkMode = false;
if (darkModeEnabled) { if (darkModeItem && darkModeEnabled || !darkModeItem && supportDarkMode) {
/**
* Enable dark mode if:
* 1. If dark mode is set already (in local storage)
* 2. No color scheme preference is set in localstorage, and user's browser indicates preference for dark mode
*/
darkMode = true; darkMode = true;
} }
else {
darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches === true;
}
document.body.style.setProperty('transition', 'background-color .3s ease');
toggleDarkMode.addEventListener('click', (e) => {
darkMode = !darkMode;
const setBodyClass = () => {
if (darkMode) { if (darkMode) {
document.body.classList.add('theme-dark'); document.body.classList.add('theme-dark');
} }
else { else {
document.body.classList.remove('theme-dark'); document.body.classList.remove('theme-dark');
} }
}
const mediaQueryListener = (e) => {
darkMode = e.matches;
setBodyClass();
}
let listening = false;
if (!darkModeItem) {
/**
* If no dark mode preference is set in local storage, listen to browser color preference change
*/
mql.addEventListener('change', mediaQueryListener);
listening = true;
}
document.body.style.setProperty('transition', 'background-color .3s ease');
toggleDarkMode.addEventListener('click', (e) => {
darkMode = !darkMode;
setBodyClass();
localStorage.setItem(darkModeKey, darkMode.toString()); localStorage.setItem(darkModeKey, darkMode.toString());
if (listening) {
/**
* Remove listener once user set color preference in website
*/
mql.removeEventListener('change', mediaQueryListener);
}
}) })
} }