useTheme.ts 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import type { GlobalThemeOverrides } from 'naive-ui'
  2. import { computed, watch } from 'vue'
  3. import { darkTheme, useOsTheme } from 'naive-ui'
  4. import { useAppStore } from '@/store'
  5. import { useBasicLayout } from '@/hooks/useBasicLayout'
  6. export function useTheme() {
  7. const appStore = useAppStore()
  8. const OsTheme = useOsTheme()
  9. const isDark = computed(() => {
  10. if (appStore.theme === 'auto')
  11. return OsTheme.value === 'dark'
  12. else
  13. return appStore.theme === 'dark'
  14. })
  15. const theme = computed(() => {
  16. return isDark.value ? darkTheme : undefined
  17. })
  18. const themeOverrides = computed<GlobalThemeOverrides>(() => {
  19. if (isDark.value) {
  20. return {
  21. common: {},
  22. }
  23. }
  24. return {}
  25. })
  26. const { isMobile } = useBasicLayout()
  27. watch(
  28. () => isDark.value,
  29. (dark) => {
  30. if (dark)
  31. document.documentElement.classList.add('dark')
  32. else
  33. document.documentElement.classList.remove('dark')
  34. },
  35. { immediate: true },
  36. )
  37. watch(
  38. () => isMobile.value,
  39. (dark) => {
  40. if (dark)
  41. document.documentElement.classList.add('is-mobile')
  42. else
  43. document.documentElement.classList.remove('is-mobile')
  44. },
  45. { immediate: true },
  46. )
  47. return { theme, themeOverrides }
  48. }