pleroma-fe/src/components/settings_modal/settings_modal.js

212 lines
5.8 KiB
JavaScript
Raw Normal View History

2026-01-06 16:23:17 +02:00
import { cloneDeep, isEqual } from 'lodash'
import { mapActions, mapState } from 'pinia'
2026-01-08 17:26:52 +02:00
import AsyncComponentError from 'src/components/async_component_error/async_component_error.vue'
import Checkbox from 'src/components/checkbox/checkbox.vue'
import ConfirmModal from 'src/components/confirm_modal/confirm_modal.vue'
2026-01-06 16:23:17 +02:00
import Modal from 'src/components/modal/modal.vue'
import PanelLoading from 'src/components/panel_loading/panel_loading.vue'
2026-01-29 20:40:00 +02:00
import Popover from '../popover/popover.vue'
2026-01-29 20:44:55 +02:00
import { useInterfaceStore } from 'src/stores/interface.js'
2026-01-29 20:40:00 +02:00
2021-03-08 19:53:30 +02:00
import {
2026-01-06 16:22:52 +02:00
newExporter,
2026-01-06 16:23:17 +02:00
newImporter,
2021-03-08 19:53:30 +02:00
} from 'src/services/export_import/export_import.js'
2026-01-06 16:23:17 +02:00
import getResettableAsyncComponent from 'src/services/resettable_async_component.js'
2021-03-08 19:53:30 +02:00
2026-01-08 17:26:52 +02:00
import { library } from '@fortawesome/fontawesome-svg-core'
import { faWindowMinimize } from '@fortawesome/free-regular-svg-icons'
import {
faChevronDown,
faFileDownload,
faFileUpload,
faTimes,
} from '@fortawesome/free-solid-svg-icons'
2021-03-08 21:00:43 +02:00
const PLEROMAFE_SETTINGS_MAJOR_VERSION = 1
const PLEROMAFE_SETTINGS_MINOR_VERSION = 0
2021-03-08 19:53:30 +02:00
library.add(
faTimes,
faWindowMinimize,
faFileUpload,
faFileDownload,
2026-01-06 16:22:52 +02:00
faChevronDown,
2021-03-08 19:53:30 +02:00
)
2020-05-03 17:36:12 +03:00
const SettingsModal = {
2026-01-06 16:22:52 +02:00
data() {
2021-03-08 19:53:30 +02:00
return {
dataImporter: newImporter({
validator: this.importValidator,
onImport: this.onImport,
2026-01-06 16:22:52 +02:00
onImportFailure: this.onImportFailure,
2021-03-08 19:53:30 +02:00
}),
dataThemeExporter: newExporter({
filename: 'pleromafe_settings.full',
2026-01-06 16:22:52 +02:00
getExportedObject: () => this.generateExport(true),
2021-03-08 19:53:30 +02:00
}),
dataExporter: newExporter({
filename: 'pleromafe_settings',
2026-01-06 16:22:52 +02:00
getExportedObject: () => this.generateExport(),
}),
2021-03-08 19:53:30 +02:00
}
},
2020-05-03 17:36:12 +03:00
components: {
Modal,
2021-03-08 19:53:30 +02:00
Popover,
Checkbox,
ConfirmModal,
2023-03-14 21:50:43 +02:00
SettingsModalUserContent: getResettableAsyncComponent(
() => import('./settings_modal_user_content.vue'),
{
loadingComponent: PanelLoading,
errorComponent: AsyncComponentError,
2026-01-06 16:22:52 +02:00
delay: 0,
},
2023-03-14 21:50:43 +02:00
),
SettingsModalAdminContent: getResettableAsyncComponent(
() => import('./settings_modal_admin_content.vue'),
{
loadingComponent: PanelLoading,
errorComponent: AsyncComponentError,
2026-01-06 16:22:52 +02:00
delay: 0,
},
),
2020-05-03 17:36:12 +03:00
},
methods: {
2026-01-06 16:22:52 +02:00
closeModal() {
2023-04-05 21:06:37 -06:00
useInterfaceStore().closeSettingsModal()
},
2026-01-06 16:22:52 +02:00
peekModal() {
2023-04-05 21:06:37 -06:00
useInterfaceStore().togglePeekSettingsModal()
2021-03-08 19:53:30 +02:00
},
2026-01-06 16:22:52 +02:00
importValidator(data) {
2021-03-08 21:00:43 +02:00
if (!Array.isArray(data._pleroma_settings_version)) {
return {
2026-01-06 16:22:52 +02:00
messageKey: 'settings.file_import_export.invalid_file',
2021-03-08 21:00:43 +02:00
}
}
const [major, minor] = data._pleroma_settings_version
if (major > PLEROMAFE_SETTINGS_MAJOR_VERSION) {
return {
messageKey: 'settings.file_export_import.errors.file_too_new',
messageArgs: {
fileMajor: major,
2026-01-06 16:22:52 +02:00
feMajor: PLEROMAFE_SETTINGS_MAJOR_VERSION,
},
2021-03-08 21:00:43 +02:00
}
}
if (major < PLEROMAFE_SETTINGS_MAJOR_VERSION) {
return {
messageKey: 'settings.file_export_import.errors.file_too_old',
messageArgs: {
fileMajor: major,
2026-01-06 16:22:52 +02:00
feMajor: PLEROMAFE_SETTINGS_MAJOR_VERSION,
},
2021-03-08 21:00:43 +02:00
}
}
if (minor > PLEROMAFE_SETTINGS_MINOR_VERSION) {
2023-04-05 21:06:37 -06:00
useInterfaceStore().pushGlobalNotice({
2021-03-08 21:00:43 +02:00
level: 'warning',
2026-01-06 16:22:52 +02:00
messageKey: 'settings.file_export_import.errors.file_slightly_new',
2021-03-08 21:00:43 +02:00
})
}
return true
2021-03-08 19:53:30 +02:00
},
2026-01-06 16:22:52 +02:00
onImportFailure(result) {
2021-03-08 21:00:43 +02:00
if (result.error) {
2026-01-06 16:22:52 +02:00
useInterfaceStore().pushGlobalNotice({
messageKey: 'settings.invalid_settings_imported',
level: 'error',
})
2021-03-08 21:00:43 +02:00
} else {
2026-01-06 16:22:52 +02:00
useInterfaceStore().pushGlobalNotice({
...result.validationResult,
level: 'error',
})
2021-03-08 21:00:43 +02:00
}
2021-03-08 19:53:30 +02:00
},
2026-01-06 16:22:52 +02:00
onImport(data) {
if (data) {
this.$store.dispatch('loadSettings', data)
}
2021-03-08 19:53:30 +02:00
},
2026-01-06 16:22:52 +02:00
restore() {
2021-03-08 19:53:30 +02:00
this.dataImporter.importData()
},
2026-01-06 16:22:52 +02:00
backup() {
2021-03-08 19:53:30 +02:00
this.dataExporter.exportData()
},
2026-01-06 16:22:52 +02:00
backupWithTheme() {
2021-03-08 19:53:30 +02:00
this.dataThemeExporter.exportData()
},
2026-01-06 16:22:52 +02:00
generateExport(theme = false) {
2021-03-08 19:53:30 +02:00
const { config } = this.$store.state
let sample = config
if (!theme) {
const ignoreList = new Set([
'customTheme',
'customThemeSource',
2026-01-06 16:22:52 +02:00
'colors',
2021-03-08 19:53:30 +02:00
])
sample = Object.fromEntries(
2026-01-06 16:22:52 +02:00
Object.entries(sample).filter(([key]) => !ignoreList.has(key)),
2021-03-08 19:53:30 +02:00
)
}
const clone = cloneDeep(sample)
2021-03-08 21:00:43 +02:00
clone._pleroma_settings_version = [
PLEROMAFE_SETTINGS_MAJOR_VERSION,
2026-01-06 16:22:52 +02:00
PLEROMAFE_SETTINGS_MINOR_VERSION,
2021-03-08 21:00:43 +02:00
]
2021-03-08 19:53:30 +02:00
return clone
},
2026-01-06 16:22:52 +02:00
resetAdminDraft() {
this.$store.commit('resetAdminDraft')
},
2026-01-06 16:22:52 +02:00
pushAdminDraft() {
this.$store.dispatch('pushAdminDraft')
},
2026-01-06 16:22:52 +02:00
...mapActions(useInterfaceStore, [
'temporaryChangesRevert',
'temporaryChangesConfirm',
]),
},
2020-05-03 17:36:12 +03:00
computed: {
...mapState(useInterfaceStore, {
2026-01-06 16:22:52 +02:00
temporaryChangesCountdown: (store) => store.temporaryChangesCountdown,
currentSaveStateNotice: (store) => store.settings.currentSaveStateNotice,
modalActivated: (store) => store.settingsModalState !== 'hidden',
modalMode: (store) => store.settingsModalMode,
modalOpenedOnceUser: (store) => store.settingsModalLoadedUser,
modalOpenedOnceAdmin: (store) => store.settingsModalLoadedAdmin,
modalPeeked: (store) => store.settingsModalState === 'minimized',
2025-01-30 21:56:07 +02:00
}),
expertLevel: {
2026-01-06 16:22:52 +02:00
get() {
return this.$store.state.config.expertLevel > 0
},
2026-01-06 16:22:52 +02:00
set(value) {
this.$store.dispatch('setOption', {
name: 'expertLevel',
value: value ? 1 : 0,
})
},
},
2026-01-06 16:22:52 +02:00
adminDraftAny() {
return !isEqual(
this.$store.state.adminSettings.config,
2026-01-06 16:22:52 +02:00
this.$store.state.adminSettings.draft,
)
2026-01-06 16:22:52 +02:00
},
},
2020-05-03 17:36:12 +03:00
}
export default SettingsModal