next-sanity
Version:
Sanity.io toolkit for Next.js
69 lines (68 loc) • 2.28 kB
JavaScript
import { r as comlinkListeners, t as comlink } from "./context.js";
import { use, useCallback, useEffect, useEffectEvent, useState, useSyncExternalStore } from "react";
import { stegaEncodeSourceMap } from "@sanity/client/stega";
import { dequal } from "dequal/lite";
import { Fragment, jsx } from "react/jsx-runtime";
import "@sanity/client";
const LISTEN_HEARTBEAT_INTERVAL = 1e4;
function SanityLiveStream(props) {
const { query, dataset, params = {}, perspective, projectId, stega } = props;
const comlink$1 = useSyncExternalStore(useCallback((listener) => {
comlinkListeners.add(listener);
return () => comlinkListeners.delete(listener);
}, []), () => comlink, () => null);
const [children, setChildren] = useState(void 0);
const handleQueryHeartbeat = useEffectEvent((comlink$2) => {
comlink$2.post("loader/query-listen", {
projectId,
dataset,
perspective,
query,
params,
heartbeat: LISTEN_HEARTBEAT_INTERVAL
});
});
const handleQueryChange = useEffectEvent((event) => {
if (dequal({
projectId,
dataset,
query,
params
}, {
projectId: event.projectId,
dataset: event.dataset,
query: event.query,
params: event.params
})) {
const { result, resultSourceMap, tags } = event;
const data = stega ? stegaEncodeSourceMap(result, resultSourceMap, {
enabled: true,
studioUrl: "/"
}) : result;
console.groupCollapsed("rendering with server action");
props.children({
data,
sourceMap: resultSourceMap,
tags: tags || []
}).then((children$1) => {
console.log("setChildren(children)");
setChildren(children$1);
}, (reason) => {
console.error("rendering with server action: render children error", reason);
}).finally(() => console.groupEnd());
}
});
useEffect(() => {
if (!comlink$1) return;
const unsubscribe = comlink$1.on("loader/query-change", handleQueryChange);
const interval = setInterval(() => handleQueryHeartbeat(comlink$1), LISTEN_HEARTBEAT_INTERVAL);
return () => {
clearInterval(interval);
unsubscribe();
};
}, [comlink$1]);
if (!comlink$1 || children === void 0) return use(props.initial);
return /* @__PURE__ */ jsx(Fragment, { children });
}
export { SanityLiveStream as default };
//# sourceMappingURL=SanityLiveStream.js.map