alinea
Version:
Headless git-based CMS
82 lines (80 loc) • 2.4 kB
JavaScript
"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
};