next-sanity
Version:
Sanity.io toolkit for Next.js
120 lines (119 loc) • 4.29 kB
JavaScript
"use client";
import { comlink, comlinkDataset, comlinkListeners, comlinkProjectId, environment, environmentListeners, perspective, perspectiveListeners } from "../context.js";
import { stegaEncodeSourceMap } from "@sanity/client/stega";
import { useCallback, useEffect, useMemo, useReducer, useSyncExternalStore } from "react";
import { dequal } from "dequal/lite";
import { useEffectEvent } from "use-effect-event";
import { useOptimistic } from "@sanity/visual-editing/react";
function useDraftModeEnvironment() {
const subscribe$1 = useCallback((listener) => {
environmentListeners.add(listener);
return () => environmentListeners.delete(listener);
}, []);
return useSyncExternalStore(subscribe$1, () => environment, () => "checking");
}
function useDraftModePerspective() {
const subscribe$1 = useCallback((listener) => {
perspectiveListeners.add(listener);
return () => perspectiveListeners.delete(listener);
}, []);
return useSyncExternalStore(subscribe$1, () => perspective, () => "checking");
}
function useIsPresentationTool() {
const environment$1 = useDraftModeEnvironment();
return environment$1 === "checking" ? null : environment$1 === "presentation-iframe" || environment$1 === "presentation-window";
}
function useIsLivePreview() {
const environment$1 = useDraftModeEnvironment();
return environment$1 === "checking" ? null : environment$1 === "presentation-iframe" || environment$1 === "presentation-window" || environment$1 === "live";
}
function reducer(state, { type, payload }) {
switch (type) {
case "query-change": return dequal(state, payload) ? state : {
...state,
data: dequal(state.data, payload.data) ? state.data : payload.data,
sourceMap: dequal(state.sourceMap, payload.sourceMap) ? state.sourceMap : payload.sourceMap,
perspective: dequal(state.perspective, payload.perspective) ? state.perspective : payload.perspective
};
default: return state;
}
}
const initialState = {
data: null,
sourceMap: null,
perspective: null
};
function subscribe(listener) {
comlinkListeners.add(listener);
return () => comlinkListeners.delete(listener);
}
const EMPTY_QUERY_PARAMS = {};
const LISTEN_HEARTBEAT_INTERVAL = 1e4;
function usePresentationQuery(props) {
const [state, dispatch] = useReducer(reducer, initialState);
const { query, params = EMPTY_QUERY_PARAMS, stega = true } = props;
const comlink$1 = useSyncExternalStore(subscribe, () => comlink, () => null);
const projectId = useSyncExternalStore(subscribe, () => comlinkProjectId, () => null);
const dataset = useSyncExternalStore(subscribe, () => comlinkDataset, () => null);
const perspective$1 = useDraftModePerspective();
const handleQueryHeartbeat = useEffectEvent((comlink$2) => {
if (!projectId || !dataset || !perspective$1) {
console.warn("usePresentationQuery: projectId, dataset and perspective must be set", {
projectId,
dataset,
perspective: perspective$1
});
return;
}
if (perspective$1 === "checking" || perspective$1 === "unknown") return;
comlink$2.post("loader/query-listen", {
projectId,
dataset,
perspective: perspective$1,
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
})) dispatch({
type: "query-change",
payload: {
data: event.result,
sourceMap: event.resultSourceMap || null,
perspective: event.perspective
}
});
});
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]);
return useMemo(() => {
if (stega && state.sourceMap) return {
...state,
data: stegaEncodeSourceMap(state.data, state.sourceMap, {
enabled: true,
studioUrl: "/"
})
};
return state;
}, [state, stega]);
}
export { useDraftModeEnvironment, useDraftModePerspective, useIsLivePreview, useIsPresentationTool, useOptimistic, usePresentationQuery };
//# sourceMappingURL=index.js.map