logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://hacktivis.me/git/pleroma-fe.git

config.js (8655B)


  1. import Cookies from 'js-cookie'
  2. import { setPreset, applyTheme, applyConfig } from '../services/style_setter/style_setter.js'
  3. import messages from '../i18n/messages'
  4. import { set } from 'lodash'
  5. import localeService from '../services/locale/locale.service.js'
  6. const BACKEND_LANGUAGE_COOKIE_NAME = 'userLanguage'
  7. const browserLocale = (window.navigator.language || 'en').split('-')[0]
  8. /* TODO this is a bit messy.
  9. * We need to declare settings with their types and also deal with
  10. * instance-default settings in some way, hopefully try to avoid copy-pasta
  11. * in general.
  12. */
  13. export const multiChoiceProperties = [
  14. 'postContentType',
  15. 'subjectLineBehavior',
  16. 'conversationDisplay', // tree | linear
  17. 'conversationOtherRepliesButton', // below | inside
  18. 'mentionLinkDisplay', // short | full_for_remote | full
  19. 'userPopoverAvatarAction' // close | zoom | open
  20. ]
  21. export const defaultState = {
  22. expertLevel: 0, // used to track which settings to show and hide
  23. colors: {},
  24. theme: undefined,
  25. customTheme: undefined,
  26. customThemeSource: undefined,
  27. hideISP: false,
  28. hideInstanceWallpaper: false,
  29. hideShoutbox: false,
  30. // bad name: actually hides posts of muted USERS
  31. hideMutedPosts: undefined, // instance default
  32. hideMutedThreads: undefined, // instance default
  33. hideWordFilteredPosts: undefined, // instance default
  34. muteBotStatuses: undefined, // instance default
  35. collapseMessageWithSubject: undefined, // instance default
  36. padEmoji: true,
  37. hideAttachments: false,
  38. hideAttachmentsInConv: false,
  39. hideScrobbles: false,
  40. maxThumbnails: 16,
  41. hideNsfw: true,
  42. preloadImage: true,
  43. loopVideo: true,
  44. loopVideoSilentOnly: true,
  45. streaming: false,
  46. emojiReactionsOnTimeline: true,
  47. alwaysShowNewPostButton: false,
  48. autohideFloatingPostButton: false,
  49. pauseOnUnfocused: true,
  50. stopGifs: true,
  51. replyVisibility: 'all',
  52. thirdColumnMode: 'notifications',
  53. notificationVisibility: {
  54. follows: true,
  55. mentions: true,
  56. likes: true,
  57. repeats: true,
  58. moves: true,
  59. emojiReactions: true,
  60. followRequest: true,
  61. reports: true,
  62. chatMention: true,
  63. polls: true
  64. },
  65. notificationNative: {
  66. follows: true,
  67. mentions: true,
  68. likes: false,
  69. repeats: false,
  70. moves: false,
  71. emojiReactions: false,
  72. followRequest: true,
  73. reports: true,
  74. chatMention: true,
  75. polls: true
  76. },
  77. webPushNotifications: false,
  78. webPushAlwaysShowNotifications: false,
  79. muteWords: [],
  80. highlight: {},
  81. interfaceLanguage: browserLocale,
  82. hideScopeNotice: false,
  83. useStreamingApi: false,
  84. sidebarRight: undefined, // instance default
  85. scopeCopy: undefined, // instance default
  86. subjectLineBehavior: undefined, // instance default
  87. alwaysShowSubjectInput: undefined, // instance default
  88. postContentType: undefined, // instance default
  89. minimalScopesMode: undefined, // instance default
  90. // This hides statuses filtered via a word filter
  91. hideFilteredStatuses: undefined, // instance default
  92. modalOnRepeat: undefined, // instance default
  93. modalOnUnfollow: undefined, // instance default
  94. modalOnBlock: undefined, // instance default
  95. modalOnMute: undefined, // instance default
  96. modalOnDelete: undefined, // instance default
  97. modalOnLogout: undefined, // instance default
  98. modalOnApproveFollow: undefined, // instance default
  99. modalOnDenyFollow: undefined, // instance default
  100. modalOnRemoveUserFromFollowers: undefined, // instance default
  101. playVideosInModal: false,
  102. useOneClickNsfw: false,
  103. useContainFit: true,
  104. disableStickyHeaders: false,
  105. showScrollbars: false,
  106. userPopoverAvatarAction: 'open',
  107. userPopoverOverlay: false,
  108. sidebarColumnWidth: '25rem',
  109. contentColumnWidth: '45rem',
  110. notifsColumnWidth: '25rem',
  111. emojiReactionsScale: 1.0,
  112. navbarColumnStretch: false,
  113. greentext: undefined, // instance default
  114. useAtIcon: undefined, // instance default
  115. mentionLinkDisplay: undefined, // instance default
  116. mentionLinkShowTooltip: undefined, // instance default
  117. mentionLinkShowAvatar: undefined, // instance default
  118. mentionLinkFadeDomain: undefined, // instance default
  119. mentionLinkShowYous: undefined, // instance default
  120. mentionLinkBoldenYou: undefined, // instance default
  121. hidePostStats: undefined, // instance default
  122. hideBotIndication: undefined, // instance default
  123. hideUserStats: undefined, // instance default
  124. virtualScrolling: undefined, // instance default
  125. sensitiveByDefault: undefined, // instance default
  126. conversationDisplay: undefined, // instance default
  127. conversationTreeAdvanced: undefined, // instance default
  128. conversationOtherRepliesButton: undefined, // instance default
  129. conversationTreeFadeAncestors: undefined, // instance default
  130. showExtraNotifications: undefined, // instance default
  131. showExtraNotificationsTip: undefined, // instance default
  132. showChatsInExtraNotifications: undefined, // instance default
  133. showAnnouncementsInExtraNotifications: undefined, // instance default
  134. showFollowRequestsInExtraNotifications: undefined, // instance default
  135. maxDepthInThread: undefined, // instance default
  136. autocompleteSelect: undefined, // instance default
  137. closingDrawerMarksAsSeen: undefined, // instance default
  138. unseenAtTop: undefined, // instance default
  139. ignoreInactionableSeen: undefined // instance default
  140. }
  141. // caching the instance default properties
  142. export const instanceDefaultProperties = Object.entries(defaultState)
  143. .filter(([key, value]) => value === undefined)
  144. .map(([key, value]) => key)
  145. const config = {
  146. state: { ...defaultState },
  147. getters: {
  148. defaultConfig (state, getters, rootState, rootGetters) {
  149. const { instance } = rootState
  150. return {
  151. ...defaultState,
  152. ...Object.fromEntries(
  153. instanceDefaultProperties.map(key => [key, instance[key]])
  154. )
  155. }
  156. },
  157. mergedConfig (state, getters, rootState, rootGetters) {
  158. const { defaultConfig } = rootGetters
  159. return {
  160. ...defaultConfig,
  161. // Do not override with undefined
  162. ...Object.fromEntries(Object.entries(state).filter(([k, v]) => v !== undefined))
  163. }
  164. }
  165. },
  166. mutations: {
  167. setOption (state, { name, value }) {
  168. set(state, name, value)
  169. },
  170. setHighlight (state, { user, color, type }) {
  171. const data = this.state.config.highlight[user]
  172. if (color || type) {
  173. state.highlight[user] = { color: color || data.color, type: type || data.type }
  174. } else {
  175. delete state.highlight[user]
  176. }
  177. }
  178. },
  179. actions: {
  180. loadSettings ({ dispatch }, data) {
  181. const knownKeys = new Set(Object.keys(defaultState))
  182. const presentKeys = new Set(Object.keys(data))
  183. const intersection = new Set()
  184. for (const elem of presentKeys) {
  185. if (knownKeys.has(elem)) {
  186. intersection.add(elem)
  187. }
  188. }
  189. intersection.forEach(
  190. name => dispatch('setOption', { name, value: data[name] })
  191. )
  192. },
  193. setHighlight ({ commit, dispatch }, { user, color, type }) {
  194. commit('setHighlight', { user, color, type })
  195. },
  196. setOption ({ commit, dispatch, state }, { name, value }) {
  197. const exceptions = new Set([
  198. 'useStreamingApi'
  199. ])
  200. if (exceptions.has(name)) {
  201. switch (name) {
  202. case 'useStreamingApi': {
  203. const action = value ? 'enableMastoSockets' : 'disableMastoSockets'
  204. dispatch(action).then(() => {
  205. commit('setOption', { name: 'useStreamingApi', value })
  206. }).catch((e) => {
  207. console.error('Failed starting MastoAPI Streaming socket', e)
  208. dispatch('disableMastoSockets')
  209. dispatch('setOption', { name: 'useStreamingApi', value: false })
  210. })
  211. }
  212. }
  213. } else {
  214. commit('setOption', { name, value })
  215. switch (name) {
  216. case 'theme':
  217. setPreset(value)
  218. break
  219. case 'sidebarColumnWidth':
  220. case 'contentColumnWidth':
  221. case 'notifsColumnWidth':
  222. case 'emojiReactionsScale':
  223. applyConfig(state)
  224. break
  225. case 'customTheme':
  226. case 'customThemeSource':
  227. applyTheme(value)
  228. break
  229. case 'interfaceLanguage':
  230. messages.setLanguage(this.getters.i18n, value)
  231. dispatch('loadUnicodeEmojiData', value)
  232. Cookies.set(
  233. BACKEND_LANGUAGE_COOKIE_NAME,
  234. localeService.internalToBackendLocaleMulti(value)
  235. )
  236. break
  237. case 'thirdColumnMode':
  238. dispatch('setLayoutWidth', undefined)
  239. break
  240. }
  241. }
  242. }
  243. }
  244. }
  245. export default config