156 lines
3.3 KiB
JavaScript
156 lines
3.3 KiB
JavaScript
import { defineStore } from 'pinia'
|
|
import { ref, watchEffect, reactive } from 'vue'
|
|
import { setBodyPrimaryColor } from '@/utils/format'
|
|
import { useDark, usePreferredDark } from '@vueuse/core'
|
|
|
|
export const useAppStore = defineStore('app', () => {
|
|
const device = ref('')
|
|
const drawerSize = ref('')
|
|
const operateMinWith = ref('240')
|
|
const config = reactive({
|
|
weakness: false,
|
|
grey: false,
|
|
primaryColor: '#3b82f6',
|
|
showTabs: true,
|
|
darkMode: 'auto',
|
|
layout_side_width: 256,
|
|
layout_side_collapsed_width: 80,
|
|
layout_side_item_height: 48,
|
|
show_watermark: true,
|
|
side_mode: 'normal',
|
|
// 页面过渡动画配置
|
|
transition_type: 'slide'
|
|
})
|
|
|
|
const isDark = useDark({
|
|
selector: 'html',
|
|
attribute: 'class',
|
|
valueDark: 'dark',
|
|
valueLight: 'light'
|
|
})
|
|
|
|
const preferredDark = usePreferredDark()
|
|
|
|
const toggleTheme = (darkMode) => {
|
|
isDark.value = darkMode
|
|
}
|
|
|
|
const toggleWeakness = (e) => {
|
|
config.weakness = e
|
|
}
|
|
|
|
const toggleGrey = (e) => {
|
|
config.grey = e
|
|
}
|
|
|
|
const togglePrimaryColor = (e) => {
|
|
config.primaryColor = e
|
|
}
|
|
|
|
const toggleTabs = (e) => {
|
|
config.showTabs = e
|
|
}
|
|
|
|
const toggleDevice = (e) => {
|
|
if (e === 'mobile') {
|
|
drawerSize.value = '100%'
|
|
operateMinWith.value = '80'
|
|
} else {
|
|
drawerSize.value = '800'
|
|
operateMinWith.value = '240'
|
|
}
|
|
device.value = e
|
|
}
|
|
|
|
const toggleDarkMode = (e) => {
|
|
config.darkMode = e
|
|
}
|
|
|
|
// 监听系统主题变化
|
|
watchEffect(() => {
|
|
if (config.darkMode === 'auto') {
|
|
isDark.value = preferredDark.value
|
|
return
|
|
}
|
|
isDark.value = config.darkMode === 'dark'
|
|
})
|
|
|
|
const toggleConfigSideWidth = (e) => {
|
|
config.layout_side_width = e
|
|
}
|
|
|
|
const toggleConfigSideCollapsedWidth = (e) => {
|
|
config.layout_side_collapsed_width = e
|
|
}
|
|
|
|
const toggleConfigSideItemHeight = (e) => {
|
|
config.layout_side_item_height = e
|
|
}
|
|
|
|
const toggleConfigWatermark = (e) => {
|
|
config.show_watermark = e
|
|
}
|
|
|
|
const toggleSideMode = (e) => {
|
|
config.side_mode = e
|
|
}
|
|
|
|
const toggleTransition = (e) => {
|
|
config.transition_type = e
|
|
}
|
|
|
|
const baseCoinfg = {
|
|
weakness: false,
|
|
grey: false,
|
|
primaryColor: '#3b82f6',
|
|
showTabs: true,
|
|
darkMode: 'auto',
|
|
layout_side_width: 256,
|
|
layout_side_collapsed_width: 80,
|
|
layout_side_item_height: 48,
|
|
show_watermark: true,
|
|
side_mode: 'normal',
|
|
// 页面过渡动画配置
|
|
transition_type: 'slide'
|
|
}
|
|
|
|
const resetConfig = () => {
|
|
for (let baseCoinfgKey in baseCoinfg) {
|
|
config[baseCoinfgKey] = baseCoinfg[baseCoinfgKey]
|
|
}
|
|
}
|
|
|
|
// 监听色弱模式和灰色模式
|
|
watchEffect(() => {
|
|
document.documentElement.classList.toggle('html-weakenss', config.weakness)
|
|
document.documentElement.classList.toggle('html-grey', config.grey)
|
|
})
|
|
|
|
// 监听主题色
|
|
watchEffect(() => {
|
|
setBodyPrimaryColor(config.primaryColor, isDark.value ? 'dark' : 'light')
|
|
})
|
|
|
|
return {
|
|
isDark,
|
|
device,
|
|
drawerSize,
|
|
operateMinWith,
|
|
config,
|
|
toggleTheme,
|
|
toggleDevice,
|
|
toggleWeakness,
|
|
toggleGrey,
|
|
togglePrimaryColor,
|
|
toggleTabs,
|
|
toggleDarkMode,
|
|
toggleConfigSideWidth,
|
|
toggleConfigSideCollapsedWidth,
|
|
toggleConfigSideItemHeight,
|
|
toggleConfigWatermark,
|
|
toggleSideMode,
|
|
toggleTransition,
|
|
resetConfig
|
|
}
|
|
})
|