settings.coffee 2.9 KB

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