stoat-for-desktop/components/state/SyncWorker.tsx

51 lines
1.0 KiB
TypeScript

import { createEffect, on, onCleanup } from "solid-js";
import { ProtocolV1 } from "stoat.js/lib/events/v1";
import { useClient } from "@revolt/client";
import { useState } from ".";
/**
* Manage synchronisation of settings to-from API
*/
export function SyncWorker() {
const state = useState();
const client = useClient();
/**
* Handle incoming events
* @param event Event
*/
function handleEvent(event: ProtocolV1["server"]) {
if (event.type === "UserSettingsUpdate") {
state.sync.consumeEvent(event.update);
}
}
// sync REMOTE->LOCAL settings
createEffect(
on(
() => client(),
(client) => {
if (client) {
state.sync.initialSync(client);
client.events.addListener("event", handleEvent);
onCleanup(() => client.events.removeListener("event", handleEvent));
}
},
),
);
// sync LOCAL->REMOTE settings
createEffect(
on(
() => state.sync.shouldSync,
(shouldSync) => shouldSync && state.sync.save(client()),
),
);
return null;
}