From 5accc4e512e9bbff8d4303cb732edccaccd9b5a3 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 26 Apr 2026 12:40:27 +0000 Subject: feat(command-palette): add quick toggles, sync, and auth actions Adds 13 reactive quick toggles (24h time, animations, blur adult, cover modes, hover cover, schedule list, reverse sort, data saver, notifications, language, title format cycle, outbound link target cycle), three sync actions (push/pull/disable), and login/logout entries gated on auth state. Names reflect current state so the palette doubles as a status surface. --- src/lib/CommandPalette/syncActions.ts | 106 ++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/lib/CommandPalette/syncActions.ts (limited to 'src/lib/CommandPalette/syncActions.ts') diff --git a/src/lib/CommandPalette/syncActions.ts b/src/lib/CommandPalette/syncActions.ts new file mode 100644 index 00000000..c787f348 --- /dev/null +++ b/src/lib/CommandPalette/syncActions.ts @@ -0,0 +1,106 @@ +import { addNotification } from "$lib/Notification/store"; +import { options } from "$lib/Notification/options"; +import root from "$lib/Utility/root"; +import settings from "$stores/settings"; +import settingsSyncPulled from "$stores/settingsSyncPulled"; +import settingsSyncTimes from "$stores/settingsSyncTimes"; +import { get } from "svelte/store"; +import type { CommandPaletteAction } from "./actions"; + +export const syncActions = ( + identityId: number, + syncEnabled: boolean, +): CommandPaletteAction[] => { + if (identityId <= 0) return []; + + const actions: CommandPaletteAction[] = [ + { + name: "Push Settings Now", + url: "#", + preventDefault: true, + tags: ["settings", "sync", "push", "upload", "remote"], + onClick: () => { + settings.setKey("settingsSync", true); + + fetch(root(`/api/configuration`), { + method: "PUT", + body: JSON.stringify(get(settings)), + }) + .then((response) => { + if (!response.ok) return; + + addNotification( + options({ + heading: "Settings Sync", + description: "Pushed local configuration to remote", + }), + ); + + settingsSyncTimes.update((times) => ({ + ...times, + lastPush: new Date(), + })); + }) + .catch((error) => + console.error("Settings sync push failed", error), + ); + }, + }, + { + name: "Pull Settings Now", + url: "#", + preventDefault: true, + tags: ["settings", "sync", "pull", "download", "remote"], + onClick: () => { + settings.setKey("settingsSync", true); + + fetch(root(`/api/configuration?id=${identityId}`)) + .then((response) => { + if (!response.ok) return; + + return response.json().then((data) => { + if (!data?.configuration) { + addNotification( + options({ + heading: "Settings Sync", + description: "No remote configuration found", + }), + ); + + return; + } + + settings.set(data.configuration); + settingsSyncPulled.set(true); + settingsSyncTimes.set({ + lastPull: new Date(), + lastPush: new Date(`${data.updated_at}Z`), + }); + + addNotification( + options({ heading: "Pulled remote configuration" }), + ); + }); + }) + .catch((error) => + console.error("Settings sync pull failed", error), + ); + }, + }, + ]; + + if (syncEnabled) + actions.push({ + name: "Disable Settings Sync", + url: "#", + preventDefault: true, + tags: ["settings", "sync", "disable", "off", "stop"], + onClick: () => { + settings.setKey("settingsSync", false); + + addNotification(options({ heading: "Settings sync disabled" })); + }, + }); + + return actions; +}; -- cgit v1.2.3