logo

pleroma-fe

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

settings_modal.js (5761B)


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