jdcProject_front/src/hooks/useTheme.ts

53 lines
1.2 KiB
TypeScript
Raw Normal View History

import { ref } from "vue"
import { getActiveThemeName, setActiveThemeName } from "@/utils/cache/localStorage"
2023-02-28 14:12:38 +08:00
const DEFAULT_THEME_NAME = "normal"
type DefaultThemeNameType = typeof DEFAULT_THEME_NAME
/** 注册的主题名称, 其中 DefaultThemeNameType 是必填的 */
export type ThemeName = DefaultThemeNameType | "dark" | "dark-blue"
interface IThemeList {
title: string
name: ThemeName
}
2022-10-21 11:25:06 +08:00
/** 主题列表 */
const themeList: IThemeList[] = [
{
title: "默认",
2023-02-28 14:12:38 +08:00
name: DEFAULT_THEME_NAME
2022-10-21 11:25:06 +08:00
},
{
title: "黑暗",
name: "dark"
2022-10-21 18:06:56 +08:00
},
{
title: "深蓝",
name: "dark-blue"
}
2022-10-21 11:25:06 +08:00
]
2022-10-21 11:25:06 +08:00
/** 正在应用的主题名称 */
2023-02-28 14:12:38 +08:00
const activeThemeName = ref<ThemeName>(getActiveThemeName() || DEFAULT_THEME_NAME)
2022-10-21 11:25:06 +08:00
const initTheme = () => {
setHtmlClassName(activeThemeName.value)
}
2022-10-21 11:25:06 +08:00
const setTheme = (value: ThemeName) => {
activeThemeName.value = value
2023-02-28 14:12:38 +08:00
setHtmlClassName(value)
setActiveThemeName(value)
2022-10-21 11:25:06 +08:00
}
/** 在 html 根元素上挂载 class */
const setHtmlClassName = (value: ThemeName) => {
document.documentElement.className = value
}
/** 主题 hook */
export function useTheme() {
return { themeList, activeThemeName, initTheme, setTheme }
}