Получение темы на Next.js
Как получить тему, которая установлена у человека в браузере. Попытался сам сделать, но данный код ниже работает только в React а тут ошибка с window
'use client'
import {useEffect, useLayoutEffect, useState} from "react";
export const useTheme = () => {
const idDarkTheme = window?.matchMedia('(prefers-color-scheme: dark)').matches
const defaultTheme = idDarkTheme ? 'dark' : 'light'
const [theme, setTheme] = useState(localStorage.getItem('app-theme') || defaultTheme)
useLayoutEffect(() => {
document.documentElement.setAttribute('data-theme', theme)
localStorage.setItem('app-theme', theme)
}, [theme]);
return {theme, setTheme}
}
Ответы (1 шт):
Автор решения: Grundy
→ Ссылка
Страницы в nextjs рендерятся на сервере, там недоступно браузерное api: window, localStorage
Гарантированно на клиенте выполняется все, что указано в useEffect:
export const useTheme = () => {
const [theme, setTheme] = useState('light')
useEffect(()=>{
const idDarkTheme = window?.matchMedia('(prefers-color-scheme: dark)').matches
const defaultTheme = idDarkTheme ? 'dark' : 'light'
setTheme(localStorage.getItem('app-theme') || defaultTheme);
},[]);
useLayoutEffect(() => {
document.documentElement.setAttribute('data-theme', theme)
localStorage.setItem('app-theme', theme);
}, [theme]);
return {theme, setTheme}
}