next-sanity
Version:
Sanity.io toolkit for Next.js
46 lines (45 loc) • 1.8 kB
JavaScript
import { sanitizePerspective } from "./utils.js";
import { perspective, setComlink, setComlinkClientConfig, setPerspective } from "./context.js";
import { useRouter } from "next/navigation";
import { startTransition, useEffect } from "react";
import { createNode, createNodeMachine } from "@sanity/comlink";
import { createCompatibilityActors } from "@sanity/presentation-comlink";
import { useEffectEvent } from "use-effect-event";
import { setPerspectiveCookie } from "next-sanity/live/server-actions";
function PresentationComlink(props) {
const { projectId, dataset, draftModeEnabled } = props;
const router = useRouter();
useEffect(() => {
setComlinkClientConfig(projectId, dataset);
}, [dataset, projectId]);
const handlePerspectiveChange = useEffectEvent((_perspective, signal) => {
const nextPerspective = sanitizePerspective(_perspective, "drafts");
if (draftModeEnabled && perspective.toString() !== nextPerspective.toString()) {
setPerspective(nextPerspective);
startTransition(() => setPerspectiveCookie(nextPerspective).then(() => {
if (signal.aborted) return;
router.refresh();
}).catch((reason) => console.error("Failed to set the preview perspective cookie", reason)));
}
});
useEffect(() => {
const comlink = createNode({
name: "loaders",
connectTo: "presentation"
}, createNodeMachine().provide({ actors: createCompatibilityActors() }));
let controller;
comlink.on("loader/perspective", (data) => {
controller?.abort();
controller = new AbortController();
handlePerspectiveChange(data.perspective, controller.signal);
});
const stop = comlink.start();
setComlink(comlink);
return () => {
stop();
};
}, []);
return null;
}
export { PresentationComlink as default };
//# sourceMappingURL=PresentationComlink.js.map