huggingface-projects/stable-diffusion-multiplayer
351
1// @ts-nocheck2import { LiveObject } from "@liveblocks/client";3import { useStorage } from "./useStorage";4import { onDestroy } from "svelte";5import type { Writable } from "svelte/store";6import { writable } from "svelte/store";7import { useRoom } from "./useRoom";8 9/**10 * Works similarly to `liveblocks-react` useObject11 * https://liveblocks.io/docs/api-reference/liveblocks-react#useObject12 *13 * The main difference is that it returns a Svelte store:14 * const obj = useObject()15 * $obj.set('name', 'Chris')16 * console.log($obj.get('name'))17 */18export function useObject(name: string, initial?: any): Writable<LiveObject> {19 const room = useRoom();20 const rootStore = useStorage();21 const list = writable<LiveObject>();22 let unsubscribe = () => {};23 24 const unsubscribeRoot = rootStore.subscribe((root) => {25 if (!root) {26 return;27 }28 29 if (!root.get(name)) {30 root.set(name, new LiveObject(initial));31 }32 33 list.set(root.get(name));34 35 unsubscribe();36 unsubscribe = room.subscribe(root.get(name) as LiveObject, (newObject) => {37 list.set(newObject);38 });39 });40 41 onDestroy(unsubscribeRoot);42 43 return list;44}45 