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; };