import { useSettingStore } from '@/store/modules/setting'
|
import { SystemThemeEnum } from '@/enums/appEnum'
|
import AppConfig from '@/config'
|
import { getDarkColor, getLightColor, setElementThemeColor } from '@/utils/ui'
|
import { usePreferredDark } from '@vueuse/core'
|
import { watch } from 'vue'
|
function useTheme() {
|
const settingStore = useSettingStore()
|
const disableTransitions = () => {
|
const style = document.createElement('style')
|
style.setAttribute('id', 'disable-transitions')
|
style.textContent = '* { transition: none !important; }'
|
document.head.appendChild(style)
|
}
|
const enableTransitions = () => {
|
const style = document.getElementById('disable-transitions')
|
if (style) {
|
style.remove()
|
}
|
}
|
const setSystemTheme = (theme, themeMode) => {
|
disableTransitions()
|
const el = document.getElementsByTagName('html')[0]
|
const isDark = theme === SystemThemeEnum.DARK
|
if (!themeMode) {
|
themeMode = theme
|
}
|
const currentTheme = AppConfig.systemThemeStyles[theme]
|
if (currentTheme) {
|
el.setAttribute('class', currentTheme.className)
|
}
|
const primary = settingStore.systemThemeColor
|
for (let i = 1; i <= 9; i++) {
|
document.documentElement.style.setProperty(
|
`--el-color-primary-light-${i}`,
|
isDark ? `${getDarkColor(primary, i / 10)}` : `${getLightColor(primary, i / 10)}`
|
)
|
}
|
settingStore.setGlopTheme(theme, themeMode)
|
requestAnimationFrame(() => {
|
requestAnimationFrame(() => {
|
enableTransitions()
|
})
|
})
|
}
|
const prefersDark = usePreferredDark()
|
const setSystemAutoTheme = () => {
|
const theme = prefersDark.value ? SystemThemeEnum.DARK : SystemThemeEnum.LIGHT
|
setSystemTheme(theme, SystemThemeEnum.AUTO)
|
}
|
const switchThemeStyles = (theme) => {
|
if (theme === SystemThemeEnum.AUTO) {
|
setSystemAutoTheme()
|
} else {
|
setSystemTheme(theme)
|
}
|
}
|
return {
|
setSystemTheme,
|
setSystemAutoTheme,
|
switchThemeStyles,
|
prefersDark
|
}
|
}
|
function initializeTheme() {
|
const settingStore = useSettingStore()
|
const prefersDark = usePreferredDark()
|
const applyThemeByMode = () => {
|
const el = document.getElementsByTagName('html')[0]
|
let actualTheme = settingStore.systemThemeType
|
if (settingStore.systemThemeMode === SystemThemeEnum.AUTO) {
|
actualTheme = prefersDark.value ? SystemThemeEnum.DARK : SystemThemeEnum.LIGHT
|
settingStore.systemThemeType = actualTheme
|
}
|
const currentTheme = AppConfig.systemThemeStyles[actualTheme]
|
if (currentTheme) {
|
el.setAttribute('class', currentTheme.className)
|
}
|
setElementThemeColor(settingStore.systemThemeColor)
|
document.documentElement.style.setProperty('--custom-radius', `${settingStore.customRadius}rem`)
|
}
|
applyThemeByMode()
|
if (settingStore.systemThemeMode === SystemThemeEnum.AUTO) {
|
watch(
|
prefersDark,
|
() => {
|
if (settingStore.systemThemeMode === SystemThemeEnum.AUTO) {
|
applyThemeByMode()
|
}
|
},
|
{ immediate: false }
|
)
|
}
|
}
|
export { initializeTheme, useTheme }
|