From b89800f9dacaf6894427df382b671e24e43fc6ab Mon Sep 17 00:00:00 2001 From: WardPearce Date: Sun, 15 Feb 2026 21:27:34 +1300 Subject: [PATCH] Implemented account setting syncing --- materialious/src/lib/api/backend.ts | 34 ++++ .../lib/components/settings/Interface.svelte | 3 +- .../src/lib/externalSettings/index.ts | 128 ++++++++++++ .../settings.ts} | 192 ++++++++++-------- materialious/src/lib/server/database.ts | 43 +++- materialious/src/lib/server/user.ts | 60 +++++- materialious/src/routes/(app)/+layout.svelte | 101 --------- materialious/src/routes/+layout.svelte | 119 ++++++++++- .../routes/api/user/keyValue/[key]/+server.ts | 45 ++++ 9 files changed, 528 insertions(+), 197 deletions(-) create mode 100644 materialious/src/lib/externalSettings/index.ts rename materialious/src/lib/{externalSettings.ts => externalSettings/settings.ts} (63%) create mode 100644 materialious/src/routes/api/user/keyValue/[key]/+server.ts diff --git a/materialious/src/lib/api/backend.ts b/materialious/src/lib/api/backend.ts index 23bcf37d..35534f92 100644 --- a/materialious/src/lib/api/backend.ts +++ b/materialious/src/lib/api/backend.ts @@ -220,6 +220,40 @@ export async function loginUserBackend( return true; } +export async function addOrUpdateKeyValue(key: string, value: string) { + const valueEncrypted = await encryptWithMasterKey(value); + + await fetch(`/api/user/keyValue/${key}`, { + method: 'POST', + credentials: 'same-origin', + body: JSON.stringify({ + valueCipher: valueEncrypted?.cipher, + valueNonce: valueEncrypted?.nonce + }) + }); +} + +export async function deleteKeyValue(key: string) { + await fetch(`/api/user/keyValue/${key}`, { + method: 'DELETE', + credentials: 'same-origin' + }); +} + +export type KeyValue = boolean | number | string[] | string | object | undefined; + +export async function getKeyValue(key: string): Promise { + const resp = await fetch(`/api/user/keyValue/${key}`, { + method: 'GET', + credentials: 'same-origin' + }); + + if (!resp.ok) return null; + + const respJson = await resp.json(); + return (await decryptWithMasterKey(respJson.valueNonce, respJson.valueCipher)) ?? null; +} + async function encryptWithMasterKey( text: string ): Promise<{ nonce: string; cipher: string } | undefined> { diff --git a/materialious/src/lib/components/settings/Interface.svelte b/materialious/src/lib/components/settings/Interface.svelte index 0799991f..85e6f3f0 100644 --- a/materialious/src/lib/components/settings/Interface.svelte +++ b/materialious/src/lib/components/settings/Interface.svelte @@ -86,7 +86,6 @@ clearCaches(); ui('#dialog-settings'); goto(resolve('/', {}), { replaceState: true }); - location.reload(); } async function setInstance(event: Event) { @@ -165,7 +164,7 @@ - {#if isOwnBackend()?.internalAuth} + {#if isOwnBackend()?.internalAuth && $invidiousInstanceStore} {#if !$invidiousAuthStore}