logo

pleroma-fe

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

settings_modal.js (5660B)


  1. import Modal from 'src/components/modal/modal.vue'
  2. import PanelLoading from 'src/components/panel_loading/panel_loading.vue'
  3. import AsyncComponentError from 'src/components/async_component_error/async_component_error.vue'
  4. import getResettableAsyncComponent from 'src/services/resettable_async_component.js'
  5. import Popover from '../popover/popover.vue'
  6. import Checkbox from 'src/components/checkbox/checkbox.vue'
  7. import { library } from '@fortawesome/fontawesome-svg-core'
  8. import { cloneDeep, isEqual } from 'lodash'
  9. import {
  10. newImporter,
  11. newExporter
  12. } from 'src/services/export_import/export_import.js'
  13. import {
  14. faTimes,
  15. faFileUpload,
  16. faFileDownload,
  17. faChevronDown
  18. } from '@fortawesome/free-solid-svg-icons'
  19. import {
  20. faWindowMinimize
  21. } from '@fortawesome/free-regular-svg-icons'
  22. const PLEROMAFE_SETTINGS_MAJOR_VERSION = 1
  23. const PLEROMAFE_SETTINGS_MINOR_VERSION = 0
  24. library.add(
  25. faTimes,
  26. faWindowMinimize,
  27. faFileUpload,
  28. faFileDownload,
  29. faChevronDown
  30. )
  31. const SettingsModal = {
  32. data () {
  33. return {
  34. dataImporter: newImporter({
  35. validator: this.importValidator,
  36. onImport: this.onImport,
  37. onImportFailure: this.onImportFailure
  38. }),
  39. dataThemeExporter: newExporter({
  40. filename: 'pleromafe_settings.full',
  41. getExportedObject: () => this.generateExport(true)
  42. }),
  43. dataExporter: newExporter({
  44. filename: 'pleromafe_settings',
  45. getExportedObject: () => this.generateExport()
  46. })
  47. }
  48. },
  49. components: {
  50. Modal,
  51. Popover,
  52. Checkbox,
  53. SettingsModalUserContent: getResettableAsyncComponent(
  54. () => import('./settings_modal_user_content.vue'),
  55. {
  56. loadingComponent: PanelLoading,
  57. errorComponent: AsyncComponentError,
  58. delay: 0
  59. }
  60. ),
  61. SettingsModalAdminContent: getResettableAsyncComponent(
  62. () => import('./settings_modal_admin_content.vue'),
  63. {
  64. loadingComponent: PanelLoading,
  65. errorComponent: AsyncComponentError,
  66. delay: 0
  67. }
  68. )
  69. },
  70. methods: {
  71. closeModal () {
  72. this.$store.dispatch('closeSettingsModal')
  73. },
  74. peekModal () {
  75. this.$store.dispatch('togglePeekSettingsModal')
  76. },
  77. importValidator (data) {
  78. if (!Array.isArray(data._pleroma_settings_version)) {
  79. return {
  80. messageKey: 'settings.file_import_export.invalid_file'
  81. }
  82. }
  83. const [major, minor] = data._pleroma_settings_version
  84. if (major > PLEROMAFE_SETTINGS_MAJOR_VERSION) {
  85. return {
  86. messageKey: 'settings.file_export_import.errors.file_too_new',
  87. messageArgs: {
  88. fileMajor: major,
  89. feMajor: PLEROMAFE_SETTINGS_MAJOR_VERSION
  90. }
  91. }
  92. }
  93. if (major < PLEROMAFE_SETTINGS_MAJOR_VERSION) {
  94. return {
  95. messageKey: 'settings.file_export_import.errors.file_too_old',
  96. messageArgs: {
  97. fileMajor: major,
  98. feMajor: PLEROMAFE_SETTINGS_MAJOR_VERSION
  99. }
  100. }
  101. }
  102. if (minor > PLEROMAFE_SETTINGS_MINOR_VERSION) {
  103. this.$store.dispatch('pushGlobalNotice', {
  104. level: 'warning',
  105. messageKey: 'settings.file_export_import.errors.file_slightly_new'
  106. })
  107. }
  108. return true
  109. },
  110. onImportFailure (result) {
  111. if (result.error) {
  112. this.$store.dispatch('pushGlobalNotice', { messageKey: 'settings.invalid_settings_imported', level: 'error' })
  113. } else {
  114. this.$store.dispatch('pushGlobalNotice', { ...result.validationResult, level: 'error' })
  115. }
  116. },
  117. onImport (data) {
  118. if (data) { this.$store.dispatch('loadSettings', data) }
  119. },
  120. restore () {
  121. this.dataImporter.importData()
  122. },
  123. backup () {
  124. this.dataExporter.exportData()
  125. },
  126. backupWithTheme () {
  127. this.dataThemeExporter.exportData()
  128. },
  129. generateExport (theme = false) {
  130. const { config } = this.$store.state
  131. let sample = config
  132. if (!theme) {
  133. const ignoreList = new Set([
  134. 'customTheme',
  135. 'customThemeSource',
  136. 'colors'
  137. ])
  138. sample = Object.fromEntries(
  139. Object
  140. .entries(sample)
  141. .filter(([key]) => !ignoreList.has(key))
  142. )
  143. }
  144. const clone = cloneDeep(sample)
  145. clone._pleroma_settings_version = [
  146. PLEROMAFE_SETTINGS_MAJOR_VERSION,
  147. PLEROMAFE_SETTINGS_MINOR_VERSION
  148. ]
  149. return clone
  150. },
  151. resetAdminDraft () {
  152. this.$store.commit('resetAdminDraft')
  153. },
  154. pushAdminDraft () {
  155. this.$store.dispatch('pushAdminDraft')
  156. }
  157. },
  158. computed: {
  159. currentSaveStateNotice () {
  160. return this.$store.state.interface.settings.currentSaveStateNotice
  161. },
  162. modalActivated () {
  163. return this.$store.state.interface.settingsModalState !== 'hidden'
  164. },
  165. modalMode () {
  166. return this.$store.state.interface.settingsModalMode
  167. },
  168. modalOpenedOnceUser () {
  169. return this.$store.state.interface.settingsModalLoadedUser
  170. },
  171. modalOpenedOnceAdmin () {
  172. return this.$store.state.interface.settingsModalLoadedAdmin
  173. },
  174. modalPeeked () {
  175. return this.$store.state.interface.settingsModalState === 'minimized'
  176. },
  177. expertLevel: {
  178. get () {
  179. return this.$store.state.config.expertLevel > 0
  180. },
  181. set (value) {
  182. this.$store.dispatch('setOption', { name: 'expertLevel', value: value ? 1 : 0 })
  183. }
  184. },
  185. adminDraftAny () {
  186. return !isEqual(
  187. this.$store.state.adminSettings.config,
  188. this.$store.state.adminSettings.draft
  189. )
  190. }
  191. }
  192. }
  193. export default SettingsModal