Skip to content

Commit 6b65b14

Browse files
committed
Added useColorScheme hook
1 parent cbd1e4b commit 6b65b14

3 files changed

Lines changed: 55 additions & 64 deletions

File tree

components/common/ColorSchemeToggle.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ function ColorSchemeToggle() {
5151
const { setColorScheme } = useSite();
5252

5353
useEffect(() => {
54-
const theme = window.localStorage.getItem('themeColor');
54+
const theme = window.localStorage.getItem('colorScheme');
5555

5656
if (theme) setToggleValue(theme)
5757
}, []);

components/common/Site.jsx

Lines changed: 5 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,81 +1,23 @@
11
import React, { useEffect, useContext } from "react";
22
import theme from "@/styles/theme";
33
import { ThemeProvider } from "styled-components";
4+
import useColorScheme from "@/hooks/useColorScheme";
45

56
export const SiteContext = React.createContext({});
67

78
const SiteContextProvider = SiteContext.Provider;
89

910
export const useSite = () => useContext(SiteContext);
1011

11-
function detectColorScheme() {
12-
var theme = 'light';
13-
14-
if (
15-
typeof window.matchMedia !== 'undefined' &&
16-
window.matchMedia('(prefers-color-scheme: dark)').matches
17-
) {
18-
theme = 'dark';
19-
}
20-
21-
document.querySelector(
22-
'input[type=radio][name=colorToggle][value=auto]'
23-
).checked = true;
24-
25-
if (window.localStorage.getItem('themeColor') !== 'undefined') {
26-
if (['dark', 'light'].includes(window.localStorage.getItem('themeColor'))) {
27-
theme = window.localStorage.getItem('themeColor');
28-
var themeToggle = document.querySelector(
29-
'input[type=radio][name=colorToggle][value=' + theme + ']'
30-
);
31-
themeToggle.checked = true;
32-
}
33-
}
34-
35-
setColorScheme(theme, true);
36-
}
37-
38-
function setColorScheme(theme, auto) {
39-
if (auto !== true) {
40-
window.localStorage.setItem('themeColor', theme);
41-
}
42-
43-
if (theme === 'auto') {
44-
window.localStorage.removeItem('themeColor');
45-
detectColorScheme();
46-
} else {
47-
document.children[0].setAttribute('data-color-scheme', theme);
48-
}
49-
50-
if (auto !== true) {
51-
document
52-
.querySelectorAll('input[type=radio][name=colorToggle]')
53-
.forEach(function (element) {
54-
if (theme !== element.value) {
55-
element.checked = false;
56-
}
57-
});
58-
}
59-
}
60-
61-
function setupActions() {
62-
window
63-
.matchMedia('(prefers-color-scheme: dark)')
64-
.addEventListener('change', function (e) {
65-
detectColorScheme();
66-
});
67-
}
68-
6912

7013

7114
const Site = ({ children }) => {
72-
useEffect(() => {
73-
detectColorScheme();
74-
setupActions();
75-
}, []);
15+
const { colorScheme, setColorScheme } = useColorScheme();
16+
17+
console.log({ colorScheme })
7618

7719
return (
78-
<SiteContextProvider value={{ setColorScheme }}>
20+
<SiteContextProvider value={{ colorScheme, setColorScheme }}>
7921
<ThemeProvider theme={theme}>
8022
{children}
8123
</ThemeProvider>

hooks/useColorScheme.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { useEffect, useState } from 'react';
2+
3+
const useColorScheme = () => {
4+
const [colorScheme, setColorSchemeState] = useState();
5+
6+
const getColorScheme = () => {
7+
const storedColorScheme = window.localStorage.getItem('colorScheme');
8+
let colorScheme = !storedColorScheme ? 'auto' : 'light';
9+
10+
if (
11+
storedColorScheme !== 'undefined' &&
12+
['dark', 'light'].includes(storedColorScheme)
13+
) {
14+
colorScheme = storedColorScheme;
15+
}
16+
17+
return colorScheme;
18+
};
19+
20+
const setColorScheme = (colorScheme) => {
21+
if (['light', 'dark'].includes(colorScheme)) {
22+
window.localStorage.setItem('colorScheme', colorScheme);
23+
document.children[0].setAttribute('data-color-scheme', colorScheme);
24+
} else {
25+
const systemColorScheme =
26+
typeof window.matchMedia !== 'undefined' &&
27+
window.matchMedia('(prefers-color-scheme: dark)').matches
28+
? 'dark'
29+
: 'light';
30+
window.localStorage.removeItem('colorScheme');
31+
document.children[0].setAttribute('data-color-scheme', systemColorScheme);
32+
}
33+
};
34+
35+
useEffect(() => {
36+
const initialColorScheme = getColorScheme();
37+
38+
window
39+
.matchMedia('(prefers-color-scheme: dark)')
40+
.addEventListener('change', () => setColorScheme(getColorScheme()));
41+
42+
setColorScheme(initialColorScheme);
43+
setColorSchemeState(initialColorScheme);
44+
}, []);
45+
46+
return { getColorScheme, setColorScheme, colorScheme };
47+
};
48+
49+
export default useColorScheme;

0 commit comments

Comments
 (0)