diff --git a/src/components/settings/tabs/sync/BackupAndRestoreTab.tsx b/src/components/settings/tabs/sync/BackupAndRestoreTab.tsx index 2ab114e98..668f1f31d 100644 --- a/src/components/settings/tabs/sync/BackupAndRestoreTab.tsx +++ b/src/components/settings/tabs/sync/BackupAndRestoreTab.tsx @@ -54,11 +54,29 @@ function BackupAndRestoreTab() { Import Settings + + + ); diff --git a/src/utils/settingsSync.ts b/src/utils/settingsSync.ts index 60031e08b..4567f80b6 100644 --- a/src/utils/settingsSync.ts +++ b/src/utils/settingsSync.ts @@ -28,20 +28,30 @@ import { relaunch } from "./native"; import { chooseFile, saveFile } from "./web"; export async function importSettings(data: string) { + let parsed: any; try { - var parsed = JSON.parse(data); + parsed = JSON.parse(data); } catch (err) { console.log(data); throw new Error("Failed to parse JSON: " + String(err)); } - if ("settings" in parsed && "quickCss" in parsed) { + if ("settings" in parsed) { Object.assign(PlainSettings, parsed.settings); await VencordNative.settings.set(parsed.settings); + } + + if ("quickCss" in parsed) { await VencordNative.quickCss.set(parsed.quickCss); - if (parsed.dataStore) await DataStore.setMany(parsed.dataStore); - } else + } + + if ("dataStore" in parsed) { + await DataStore.setMany(parsed.dataStore); + } + + if (!("settings" in parsed || "quickCss" in parsed || "dataStore" in parsed)) { throw new Error("Invalid Settings. Is this even an Equicord Settings file?"); + } } export async function exportSettings({ minify }: { minify?: boolean; } = {}) { @@ -51,9 +61,44 @@ export async function exportSettings({ minify }: { minify?: boolean; } = {}) { return JSON.stringify({ settings, quickCss, dataStore }, null, minify ? undefined : 4); } -export async function downloadSettingsBackup() { - const filename = `equicord-settings-backup-${moment().format("YYYY-MM-DD")}.json`; - const backup = await exportSettings(); +export async function exportPlugins({ minify }: { minify?: boolean; } = {}) { + const { plugins } = VencordNative.settings.get(); + return JSON.stringify({ settings: { plugins } }, null, minify ? undefined : 4); +} + +export async function exportCSS({ minify }: { minify?: boolean; } = {}) { + const quickCss = await VencordNative.quickCss.get(); + return JSON.stringify({ quickCss }, null, minify ? undefined : 4); +} + +export async function exportDataStores({ minify }: { minify?: boolean; } = {}) { + const dataStore = await DataStore.entries(); + return JSON.stringify({ dataStore }, null, minify ? undefined : 4); +} + +type BackupType = "settings" | "plugins" | "css" | "datastore"; + +export async function downloadSettingsBackup(type: BackupType, { minify }: { minify?: boolean; } = {}) { + let backup: string; + + switch (type) { + case "settings": + backup = await exportSettings({ minify }); + break; + case "plugins": + backup = await exportPlugins({ minify }); + break; + case "css": + backup = await exportCSS({ minify }); + break; + case "datastore": + backup = await exportDataStores({ minify }); + break; + default: + throw new Error("Invalid backup type"); + } + + const filename = `equicord-${type}-backup-${moment().format("YYYY-MM-DD")}.json`; const data = new TextEncoder().encode(backup); if (IS_DISCORD_DESKTOP) {