diff --git a/eslint.config.mjs b/eslint.config.mjs index e764a20b0..e047113d7 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -36,7 +36,7 @@ export default tseslint.config( "@stylistic": stylistic, "@typescript-eslint": tseslint.plugin, "simple-import-sort": simpleImportSort, - "unused-imports": unusedImports + "unused-imports": unusedImports, }, settings: { "import/resolver": { @@ -138,7 +138,7 @@ export default tseslint.config( // Plugin Rules "simple-import-sort/imports": "error", "simple-import-sort/exports": "error", - "unused-imports/no-unused-imports": "error", + "unused-imports/no-unused-imports": "error" } } ); diff --git a/src/api/SettingsSync/offline.ts b/src/api/SettingsSync/offline.ts index aced11e81..12fa9001c 100644 --- a/src/api/SettingsSync/offline.ts +++ b/src/api/SettingsSync/offline.ts @@ -9,6 +9,8 @@ import { Logger } from "@utils/Logger"; import { chooseFile, saveFile } from "@utils/web"; import { moment, Toasts } from "@webpack/common"; +import { DataStore } from ".."; + const toast = (type: string, message: string) => Toasts.show({ type, @@ -43,12 +45,48 @@ export async function importSettings(data: string) { export async function exportSettings({ minify }: { minify?: boolean; } = {}) { const settings = VencordNative.settings.get(); const quickCss = await VencordNative.quickCss.get(); - return JSON.stringify({ settings, quickCss }, null, minify ? undefined : 4); + const dataStore = await DataStore.entries(); + return JSON.stringify({ settings, quickCss, dataStore }, null, minify ? undefined : 4); } -export async function downloadSettingsBackup() { - const filename = `vencord-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) { diff --git a/src/components/ThemeSettings/ThemesTab.tsx b/src/components/ThemeSettings/ThemesTab.tsx index eb8034f99..fd63dc352 100644 --- a/src/components/ThemeSettings/ThemesTab.tsx +++ b/src/components/ThemeSettings/ThemesTab.tsx @@ -18,8 +18,10 @@ import "./themesStyles.css"; +import { isPluginEnabled } from "@api/PluginManager"; import { Settings, useSettings } from "@api/Settings"; import { classNameFactory } from "@api/Styles"; +import { Card } from "@components/Card"; import { Divider } from "@components/Divider"; import { ErrorCard } from "@components/ErrorCard"; import { Flex } from "@components/Flex"; @@ -41,7 +43,7 @@ import { getThemeInfo, stripBOM, type UserThemeHeader } from "@utils/themes/bd"; import { usercssParse } from "@utils/themes/usercss"; import { getStylusWebStoreUrl } from "@utils/web"; import { findLazy } from "@webpack"; -import { Alerts, Button, Card, React, showToast, TabBar, TextInput, Tooltip, useEffect, useMemo, useRef, useState } from "@webpack/common"; +import { Alerts, Button, React, showToast, TabBar, TextInput, Tooltip, useEffect, useMemo, useRef, useState } from "@webpack/common"; import type { ComponentType, Ref, SyntheticEvent } from "react"; import type { UserstyleHeader } from "usercss-meta"; @@ -102,7 +104,7 @@ interface UserCSSCardProps { function UserCSSThemeCard({ theme, enabled, onChange, onDelete, onSettingsReset }: UserCSSCardProps) { const missingPlugins = useMemo(() => - theme.requiredPlugins?.filter(p => !Vencord.Plugins.isPluginEnabled(p)), [theme]); + theme.requiredPlugins?.filter(p => !isPluginEnabled(p)), [theme]); return ( - + {decodedContent.map((content, index) => (