themeUtil.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { generate } from '@ant-design/colors'
  2. import tool from '../utils/tool'
  3. import config from '../config'
  4. import { ThemeModeEnum } from './enum'
  5. const changeColor = (newPrimaryColor, theme, darkClass = 'snowy-theme-dark') => {
  6. return new Promise((resolve) => {
  7. const themeEleId = 'snowy-theme-var'
  8. const themeEle = document.querySelector(`#${themeEleId}`)
  9. if (themeEle && themeEle.parentNode) {
  10. themeEle.parentNode.removeChild(themeEle)
  11. }
  12. const isRealDark = theme === ThemeModeEnum.REAL_DARK
  13. if (newPrimaryColor) {
  14. const colors = generate(newPrimaryColor, isRealDark ? { theme: 'dark' } : {})
  15. const rootClass = isRealDark ? `.${darkClass}` : ':root'
  16. const styleElement = document.createElement('style')
  17. styleElement.id = themeEleId
  18. styleElement.setAttribute('type', 'text/css')
  19. styleElement.innerHTML = `${rootClass}{${colors
  20. .map((c, i) => {
  21. return `--primary-${i + 1}:${c};`
  22. })
  23. .concat([`--primary-color:${newPrimaryColor};`])
  24. .join('')}}`
  25. document.head.appendChild(styleElement)
  26. } else {
  27. document.body.removeAttribute('snowy-theme')
  28. }
  29. if (isRealDark) {
  30. document.body.classList.add(darkClass)
  31. } else {
  32. document.body.classList.remove(darkClass)
  33. }
  34. resolve()
  35. })
  36. }
  37. const loadLocalTheme = (localSetting) => {
  38. if (localSetting) {
  39. let { theme, themeColor } = localSetting
  40. themeColor = themeColor || config.COLOR
  41. theme = theme || config.THEME
  42. changeColor(themeColor, theme)
  43. }
  44. }
  45. /**
  46. * 获取本地保存的配置
  47. * @param loadTheme {boolean} 是否加载配置中的主题
  48. * @returns {Object}
  49. */
  50. const getLocalSetting = (loadTheme) => {
  51. let localSetting = {}
  52. try {
  53. const theme = tool.data.get('SNOWY_THEME')
  54. const themeColor = tool.data.get('SNOWY_THEME_COLOR')
  55. localSetting = {
  56. theme,
  57. themeColor
  58. }
  59. } catch (e) {
  60. console.error(e)
  61. }
  62. if (loadTheme) {
  63. loadLocalTheme(localSetting)
  64. }
  65. return localSetting
  66. }
  67. export { loadLocalTheme, getLocalSetting, changeColor }