|
import cookie from 'react-cookies' |
|
import BLOG from '@/blog.config' |
|
import { getQueryParam, getQueryVariable, isBrowser } from '../lib/utils' |
|
import dynamic from 'next/dynamic' |
|
import getConfig from 'next/config' |
|
import * as ThemeComponents from '@theme-components' |
|
|
|
export const { THEMES = [] } = getConfig().publicRuntimeConfig |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const getGlobalLayoutByTheme = (themeQuery) => { |
|
const layout = getLayoutNameByPath(-1) |
|
if (themeQuery !== BLOG.THEME) { |
|
return dynamic(() => import(`@/themes/${themeQuery}`).then(m => m[layout]), { ssr: true }) |
|
} else { |
|
return ThemeComponents[layout] |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const getLayoutByTheme = ({ router, theme }) => { |
|
const themeQuery = getQueryParam(router.asPath, 'theme') || theme |
|
const layoutName = getLayoutNameByPath(router.pathname) |
|
|
|
if (themeQuery !== BLOG.THEME) { |
|
return dynamic(() => import(`@/themes/${themeQuery}`).then(m => { |
|
setTimeout(() => { |
|
checkThemeDOM() |
|
}, 500); |
|
return m[layoutName] |
|
}), { ssr: true }) |
|
} else { |
|
setTimeout(() => { |
|
checkThemeDOM() |
|
}, 100); |
|
return ThemeComponents[layoutName] |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
const checkThemeDOM = () => { |
|
if (isBrowser) { |
|
const elements = document.querySelectorAll('[id^="theme-"]') |
|
if (elements?.length > 1) { |
|
elements[elements.length - 1].scrollIntoView() |
|
|
|
for (let i = 0; i < elements.length - 1; i++) { |
|
elements[i].parentNode.removeChild(elements[i]) |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
export const getLayoutNameByPath = (path) => { |
|
switch (path) { |
|
case -1: |
|
return 'LayoutBase' |
|
case '/': |
|
return 'LayoutIndex' |
|
case '/archive': |
|
return 'LayoutArchive' |
|
case '/page/[page]': |
|
case '/category/[category]': |
|
case '/category/[category]/page/[page]': |
|
case '/tag/[tag]': |
|
case '/tag/[tag]/page/[page]': |
|
return 'LayoutPostList' |
|
case '/search': |
|
case '/search/[keyword]': |
|
case '/search/[keyword]/page/[page]': |
|
return 'LayoutSearch' |
|
case '/404': |
|
return 'Layout404' |
|
case '/tag': |
|
return 'LayoutTagIndex' |
|
case '/category': |
|
return 'LayoutCategoryIndex' |
|
default: |
|
return 'LayoutSlug' |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export const initDarkMode = (updateDarkMode) => { |
|
|
|
let newDarkMode = isPreferDark() |
|
|
|
|
|
const cookieDarkMode = loadDarkModeFromCookies() |
|
if (cookieDarkMode) { |
|
newDarkMode = JSON.parse(cookieDarkMode) |
|
} |
|
|
|
|
|
const queryMode = getQueryVariable('mode') |
|
if (queryMode) { |
|
newDarkMode = queryMode === 'dark' |
|
} |
|
|
|
updateDarkMode(newDarkMode) |
|
saveDarkModeToCookies(newDarkMode) |
|
document.getElementsByTagName('html')[0].setAttribute('class', newDarkMode ? 'dark' : 'light') |
|
} |
|
|
|
|
|
|
|
|
|
|
|
export function isPreferDark() { |
|
if (BLOG.APPEARANCE === 'dark') { |
|
return true |
|
} |
|
if (BLOG.APPEARANCE === 'auto') { |
|
|
|
const date = new Date() |
|
const prefersDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches |
|
return prefersDarkMode || (BLOG.APPEARANCE_DARK_TIME && (date.getHours() >= BLOG.APPEARANCE_DARK_TIME[0] || date.getHours() < BLOG.APPEARANCE_DARK_TIME[1])) |
|
} |
|
return false |
|
} |
|
|
|
|
|
|
|
|
|
|
|
export const loadDarkModeFromCookies = () => { |
|
return cookie.load('darkMode') |
|
} |
|
|
|
|
|
|
|
|
|
|
|
export const saveDarkModeToCookies = (newTheme) => { |
|
cookie.save('darkMode', newTheme, { path: '/' }) |
|
} |
|
|
|
|
|
|
|
|
|
|
|
export const loadThemeFromCookies = () => { |
|
return cookie.load('theme') |
|
} |
|
|
|
|
|
|
|
|
|
|
|
export const saveThemeToCookies = (newTheme) => { |
|
cookie.save('theme', newTheme, { path: '/' }) |
|
} |
|
|