diff --git a/src/renderer/components/DataSettings/DataSettings.vue b/src/renderer/components/DataSettings/DataSettings.vue index 9228ded2fd876..99e102eb71d58 100644 --- a/src/renderer/components/DataSettings/DataSettings.vue +++ b/src/renderer/components/DataSettings/DataSettings.vue @@ -65,6 +65,24 @@ @click="showExportSearchHistoryPrompt = true" /> +

+ {{ t('Settings.Settings') }} + +

+ + + + } */ +const transferableSettings = computed(() => { + return store.getters.getTransferableSettings +}) + +async function importSettings() { + let response + try { + response = await readFileWithPicker( + t('Settings.Data Settings.Settings File'), + { + 'application/x-freetube-db': '.db', + 'application/json': '.json' + }, + IMPORT_DIRECTORY_ID, + START_IN_DIRECTORY + ) + } catch (err) { + const message = t('Settings.Data Settings.Unable to read file') + showToast(`${message}: ${err}`) + return + } + + if (response === null) { + return + } + + const { content } = response + const importedSettings = JSON.parse(content) + const currentTransferableSettings = transferableSettings.value + const currentSettings = store.state.settings + + for (const [importedKey, importedValue] of Object.entries(importedSettings)) { + if (!Object.hasOwn(currentSettings, importedKey)) { + const message = `${t('Settings.Data Settings.Unknown setting key')}: ${importedKey}` + showToast(message) + continue + } + + if (!Object.hasOwn(currentTransferableSettings, importedKey)) { + const message = `${t('Settings.Data Settings.Non-transferable setting key')}: ${importedKey}` + showToast(message) + continue + } + + const currentValue = currentTransferableSettings[importedKey] + const areValuesEqual = currentValue === importedValue || + (typeof importedValue === 'object' && JSON.stringify(currentValue) === JSON.stringify(importedValue)) + if (areValuesEqual) { + continue + } + + const updaterId = defaultUpdaterId(importedKey) + await store.dispatch(updaterId, importedValue) + } + + showToast(t('Settings.Data Settings.All settings have been successfully imported')) +} + +async function exportSettings() { + const dateStr = getTodayDateStrLocalTimezone() + const exportFileName = `freetube-settings-${dateStr}.db` + const settingsContent = JSON.stringify(transferableSettings.value) + + await promptAndWriteToFile( + exportFileName, + settingsContent, + t('Settings.Data Settings.Settings File'), + 'application/x-freetube-db', + '.db', + t('Settings.Data Settings.All settings have been successfully exported') + ) +} + +// #endregion settings +