From 644d25784191e7fd218fc0ba1847f32d841cdeae Mon Sep 17 00:00:00 2001 From: WardPearce Date: Sat, 7 Mar 2026 00:55:36 +1300 Subject: [PATCH] Added ablity to import settings from file --- .../components/settings/ExportImport.svelte | 26 ++++++++++++++++--- .../src/lib/externalSettings/index.ts | 15 +++++++++++ materialious/src/lib/i18n/locales/en.json | 5 +++- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/materialious/src/lib/components/settings/ExportImport.svelte b/materialious/src/lib/components/settings/ExportImport.svelte index 982423cf..4e58c8be 100644 --- a/materialious/src/lib/components/settings/ExportImport.svelte +++ b/materialious/src/lib/components/settings/ExportImport.svelte @@ -8,7 +8,7 @@ import { getSubscriptionsInvidious } from '$lib/api/invidious/feed'; import { backendInUseStore, invidiousAuthStore, invidiousInstanceStore } from '$lib/store'; import { Clipboard } from '@capacitor/clipboard'; - import { settingsToJson } from '$lib/externalSettings'; + import { loadSettingsFromFile, settingsToJson } from '$lib/externalSettings'; import { downloadStringAsFile } from '$lib/misc'; async function importInvidiousSubs() { @@ -147,7 +147,7 @@ }} > content_copy - {$_('copy')} + {$_('layout.export.exportToClipboard')}
+ +
+ +
+ + { + const files = (event.target as HTMLInputElement).files; + if (files?.length === 0 || !files) return; + + await loadSettingsFromFile(files[0]); + }} + type="file" + /> +
diff --git a/materialious/src/lib/externalSettings/index.ts b/materialious/src/lib/externalSettings/index.ts index 6eb3109f..cb88cf87 100644 --- a/materialious/src/lib/externalSettings/index.ts +++ b/materialious/src/lib/externalSettings/index.ts @@ -80,6 +80,21 @@ function setStores(toSet: Record, overwriteExisting = false) { } } +export async function loadSettingsFromFile(file: File) { + const fileContents = await file.text(); + + let fileJson: Record | undefined; + try { + fileJson = JSON.parse(fileContents); + } catch { + // Handled outside of catch. + } + + if (!fileJson) return; + + setStores(fileJson, true); +} + export function loadSettingsFromEnv() { const defaultSettings = getPublicEnv('DEFAULT_SETTINGS'); diff --git a/materialious/src/lib/i18n/locales/en.json b/materialious/src/lib/i18n/locales/en.json index 847cb2c5..6df66699 100644 --- a/materialious/src/lib/i18n/locales/en.json +++ b/materialious/src/lib/i18n/locales/en.json @@ -277,7 +277,10 @@ "importSubSupported": "YouTube CSV/OPML/JSON, Invidious OPML/JSON, Freetube database & NewPipe JSON supported", "importing": "Importing subscriptions (this will take a moment)", "importingCompleted": "Subscriptions successfully imported", - "exportSub": "Export subscriptions" + "exportSub": "Export subscriptions", + "exportToClipboard": "Export to clipboard", + "exportToFile": "Export to file", + "importFromFile": "Import from file" }, "deArrow": { "title": "DeArrow",