| | 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: '/' }) |
| | } |
| |
|