UNPKG

next-sanity

Version:
120 lines (119 loc) 4.29 kB
"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