UNPKG

alinea

Version:
82 lines (80 loc) 2.4 kB
"use client"; import "../../chunks/chunk-NZLE2WMY.js"; // src/adapter/next/previews.tsx import { setPreviewCookies } from "alinea/preview/PreviewCookies"; import { usePreview } from "alinea/preview/react"; import { registerPreviewWidget } from "alinea/preview/widget"; import { usePathname, useRouter } from "next/navigation.js"; import { useEffect, useState, useTransition } from "react"; import { jsx } from "react/jsx-runtime"; function NextPreviews({ dashboardUrl, widget, root, workspace }) { const refresh = useRouterRefresh(); const [isLoading, setIsLoading] = useState(false); const [previewDisabled, setPreviewDisabled] = useState(false); const pathname = usePathname(); const adminUrl = new URL(dashboardUrl, location.origin); const entryParams = new URLSearchParams({ url: pathname }); if (workspace) entryParams.set("workspace", workspace); if (root) entryParams.set("root", root); const editUrl = new URL(`#/edit?${entryParams}`, adminUrl); const { isPreviewing } = usePreview({ async preview(update) { if (!update) return; const success = await setPreviewCookies(update.payload); setPreviewDisabled(!success); if (!success) return; setIsLoading(true); refresh().then(() => setIsLoading(false)); } }); useEffect(() => { if (widget) registerPreviewWidget(); }, [widget]); if (!widget) return null; return /* @__PURE__ */ jsx( "alinea-preview", { adminUrl: String(adminUrl), editUrl: String(editUrl), livePreview: isLoading ? "loading" : isPreviewing ? previewDisabled ? "warning" : "connected" : void 0 } ); } function useRouterRefresh() { const router = useRouter(); const [isPending, startTransition] = useTransition(); const [resolve, setResolve] = useState( null ); const [isTriggered, setIsTriggered] = useState(false); const refresh = () => { return new Promise((resolve2, reject) => { setResolve(() => resolve2); startTransition(() => { router.refresh(); }); }); }; useEffect(() => { if (isTriggered && !isPending) { if (resolve) { resolve(null); setIsTriggered(false); setResolve(null); } } if (isPending) { setIsTriggered(true); } }, [isTriggered, isPending, resolve]); return refresh; } export { NextPreviews as default, useRouterRefresh };