"use client"; import * as React from "react"; import { createLiveCollection, type ColineRecordQuery, type LiveCollectionOptions, } from "@colineapp/sdk/v2"; import { useColine, useColineContext } from "./provider"; /** Inline query objects are safe: equivalent inputs retain the same live view. */ export function useLiveCollection>( name: string, query?: ColineRecordQuery, options?: LiveCollectionOptions, ) { const coline = useColine(); const context = useColineContext(); const key = JSON.stringify({ query, options: { actorUserId: context.actor?.userId, installId: context.app.installId, ...options }, }); const live = React.useMemo(() => { const input = JSON.parse(key) as { query?: ColineRecordQuery; options?: LiveCollectionOptions; }; return createLiveCollection(coline, name, input.query, input.options); }, [coline, name, key]); React.useEffect(() => { void live.start(); return () => live.stop(); }, [live]); const snapshot = React.useSyncExternalStore(live.subscribe, live.getSnapshot, live.getSnapshot); return { ...snapshot, insert: live.insert, update: live.update, delete: live.delete, setAccess: live.setAccess, refresh: live.refresh, }; }