index.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. const PERSISTENCE_KEY = 'darkmode:color-scheme'
  2. async function getService () {
  3. if (process.env.FEATURE_DARKMODE_DARKREADER === '1') {
  4. return await import('./darkreader')
  5. }
  6. throw Error(' No service defined for feature darkMode.')
  7. }
  8. window.addEventListener('DOMContentLoaded', async () => {
  9. const menu = document.getElementById('themeMenu')
  10. const $icon = document.getElementById('navbar-theme-icon-svg')
  11. if (menu == null || $icon == null) return
  12. const btns = menu.getElementsByTagName('a')
  13. const iconMap = Array.from(btns).reduce((map, btn) => {
  14. const $img = btn.getElementsByTagName('img')[0]
  15. map[btn.dataset.scheme] = $img.src
  16. return map
  17. }, {})
  18. const {
  19. setSchemeDark,
  20. setSchemeLight,
  21. setSchemeSystem,
  22. defaultColorScheme
  23. } = await getService()
  24. function loadScheme () {
  25. return localStorage.getItem(PERSISTENCE_KEY) || defaultColorScheme
  26. }
  27. function saveScheme (scheme) {
  28. localStorage.setItem(PERSISTENCE_KEY, scheme)
  29. }
  30. function setScheme (newScheme) {
  31. $icon.src = iconMap[newScheme]
  32. if (newScheme === 'dark') {
  33. setSchemeDark()
  34. } else if (newScheme === 'system') {
  35. setSchemeSystem()
  36. } else {
  37. setSchemeLight()
  38. }
  39. saveScheme(newScheme)
  40. }
  41. setScheme(loadScheme())
  42. Array.from(menu.getElementsByTagName('a')).forEach((btn) => {
  43. btn.addEventListener('click', () => {
  44. const { scheme } = btn.dataset
  45. setScheme(scheme)
  46. })
  47. })
  48. })