settings.coffee 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. class app.Settings
  2. PREFERENCE_KEYS = [
  3. 'hideDisabled'
  4. 'hideIntro'
  5. 'manualUpdate'
  6. 'fastScroll'
  7. 'arrowScroll'
  8. 'analyticsConsent'
  9. 'docs'
  10. 'dark' # legacy
  11. 'theme'
  12. 'layout'
  13. 'size'
  14. 'tips'
  15. 'autoInstall'
  16. ]
  17. INTERNAL_KEYS = [
  18. 'count'
  19. 'schema'
  20. 'version'
  21. 'news'
  22. ]
  23. LAYOUTS: ['_max-width', '_sidebar-hidden', '_native-scrollbars']
  24. @defaults:
  25. count: 0
  26. hideDisabled: false
  27. hideIntro: false
  28. news: 0
  29. manualUpdate: false
  30. schema: 1
  31. analyticsConsent: false
  32. theme: 'auto'
  33. constructor: ->
  34. @store = new CookiesStore
  35. @cache = {}
  36. @autoSupported = window.matchMedia('(prefers-color-scheme)').media != 'not all'
  37. if @autoSupported
  38. @darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)')
  39. @darkModeQuery.onchange = -> @setTheme(@get('theme'))
  40. get: (key) ->
  41. return @cache[key] if @cache.hasOwnProperty(key)
  42. @cache[key] = @store.get(key) ? @constructor.defaults[key]
  43. set: (key, value) ->
  44. @store.set(key, value)
  45. delete @cache[key]
  46. @setTheme(value) if key == 'theme'
  47. return
  48. del: (key) ->
  49. @store.del(key)
  50. delete @cache[key]
  51. return
  52. hasDocs: ->
  53. try !!@store.get('docs')
  54. getDocs: ->
  55. @store.get('docs')?.split('/') or app.config.default_docs
  56. setDocs: (docs) ->
  57. @set 'docs', docs.join('/')
  58. return
  59. getTips: ->
  60. @store.get('tips')?.split('/') or []
  61. setTips: (tips) ->
  62. @set 'tips', tips.join('/')
  63. return
  64. setLayout: (name, enable) ->
  65. @toggleLayout(name, enable)
  66. layout = (@store.get('layout') || '').split(' ')
  67. $.arrayDelete(layout, '')
  68. if enable
  69. layout.push(name) if layout.indexOf(name) is -1
  70. else
  71. $.arrayDelete(layout, name)
  72. if layout.length > 0
  73. @set 'layout', layout.join(' ')
  74. else
  75. @del 'layout'
  76. return
  77. hasLayout: (name) ->
  78. layout = (@store.get('layout') || '').split(' ')
  79. layout.indexOf(name) isnt -1
  80. setSize: (value) ->
  81. @set 'size', value
  82. return
  83. dump: ->
  84. @store.dump()
  85. export: ->
  86. data = @dump()
  87. delete data[key] for key in INTERNAL_KEYS
  88. data
  89. import: (data) ->
  90. for key, value of @export()
  91. @del key unless data.hasOwnProperty(key)
  92. for key, value of data
  93. @set key, value if PREFERENCE_KEYS.indexOf(key) isnt -1
  94. return
  95. reset: ->
  96. @store.reset()
  97. @cache = {}
  98. return
  99. initLayout: ->
  100. if @get('dark') is 1
  101. @set('theme', 'dark')
  102. @del 'dark'
  103. @setTheme(@get('theme'))
  104. @toggleLayout(layout, @hasLayout(layout)) for layout in @LAYOUTS
  105. @initSidebarWidth()
  106. return
  107. setTheme: (theme) ->
  108. if theme is 'auto'
  109. theme = if @darkModeQuery.matches then 'dark' else 'default'
  110. classList = document.documentElement.classList
  111. classList.remove('_theme-default', '_theme-dark')
  112. classList.add('_theme-' + theme)
  113. @updateColorMeta()
  114. return
  115. updateColorMeta: ->
  116. color = getComputedStyle(document.documentElement).getPropertyValue('--headerBackground').trim()
  117. $('meta[name=theme-color]').setAttribute('content', color)
  118. return
  119. toggleLayout: (layout, enable) ->
  120. classList = document.body.classList
  121. classList.toggle(layout, enable) unless layout is '_sidebar-hidden'
  122. classList.toggle('_overlay-scrollbars', $.overlayScrollbarsEnabled())
  123. return
  124. initSidebarWidth: ->
  125. size = @get('size')
  126. document.documentElement.style.setProperty('--sidebarWidth', size + 'px') if size
  127. return