Skip to content

Commit 89c6bee

Browse files
live preview
1 parent d5f81ad commit 89c6bee

File tree

6 files changed

+57
-4
lines changed

6 files changed

+57
-4
lines changed

bun.lock

Lines changed: 7 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
},
1818
"dependencies": {
1919
"@buape/cms-types": "0.20251108.3",
20+
"@payloadcms/live-preview": "^3.63.0",
2021
"@payloadcms/richtext-lexical": "^3.63.0",
2122
"@payloadcms/sdk": "^3.63.0",
2223
"@radix-ui/react-slot": "1.2.3",
@@ -29,6 +30,7 @@
2930
"lucide-react": "0.534.0",
3031
"next": "15.3.5",
3132
"next-themes": "^0.4.6",
33+
"payload": "^3.63.0",
3234
"react": "19.1.1",
3335
"react-dom": "19.1.1",
3436
"react-icons": "5.5.0",

src/app/[slug]/page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import type { Metadata } from "next"
22
import { notFound } from "next/navigation"
33
import { createMetadata } from "~/app/createMetadata"
4+
import { RefreshRouteOnSave } from "~/components/RefreshOnSave"
45
import { RichText } from "~/components/RichText"
56
import GridPattern from "~/components/ui/grid-pattern"
67
import { payload } from "~/lib/payload"
@@ -35,6 +36,7 @@ export default async function Page(props: {
3536

3637
return (
3738
<>
39+
<RefreshRouteOnSave />
3840
<GridPattern
3941
className={cn(
4042
"mask-[linear-gradient(to_bottom,white,transparent,transparent)]"

src/app/blog/[slug]/page.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type { Metadata } from "next"
55
import Image from "next/image"
66
import { notFound } from "next/navigation"
77
import { createMetadata } from "~/app/createMetadata"
8+
import { RefreshRouteOnSave } from "~/components/RefreshOnSave"
89
import { RichText } from "~/components/RichText"
910
import GridPattern from "~/components/ui/grid-pattern"
1011
import { payload } from "~/lib/payload"
@@ -46,6 +47,7 @@ export default async function Page(props: {
4647

4748
return (
4849
<>
50+
<RefreshRouteOnSave />
4951
<GridPattern
5052
className={cn(
5153
"mask-[linear-gradient(to_bottom,white,transparent,transparent)]"

src/components/RefreshOnSave.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
"use client"
2+
3+
import { isDocumentEvent, ready } from "@payloadcms/live-preview"
4+
import { useRouter } from "next/navigation"
5+
import type React from "react"
6+
import { useCallback, useEffect, useRef } from "react"
7+
8+
export const RefreshRouteOnSave: React.FC = () => {
9+
const router = useRouter()
10+
11+
const hasSentReadyMessage = useRef<boolean>(false)
12+
13+
const onMessage = useCallback(
14+
(event: MessageEvent) => {
15+
if (isDocumentEvent(event, "https://cms.buape.com/api")) {
16+
router.refresh()
17+
}
18+
},
19+
[router]
20+
)
21+
22+
useEffect(() => {
23+
if (typeof window !== "undefined") {
24+
window.addEventListener("message", onMessage)
25+
}
26+
27+
if (!hasSentReadyMessage.current) {
28+
hasSentReadyMessage.current = true
29+
30+
ready({
31+
serverURL: "https://cms.buape.com/api"
32+
})
33+
}
34+
35+
return () => {
36+
if (typeof window !== "undefined") {
37+
window.removeEventListener("message", onMessage)
38+
}
39+
}
40+
}, [onMessage])
41+
42+
return null
43+
}

src/components/converters/HeadingConverter.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const headingConverter: JSXConverters<SerializedHeadingNode> = {
1313
.replace(/[^a-z0-9-]/g, "")
1414
return <h2 id={id}>{text}</h2>
1515
} else {
16-
const text = nodesToJSX({ nodes: node.children }).join("")
16+
const text = nodesToJSX({ nodes: node.children })
1717
const Tag = node.tag
1818
return <Tag>{text}</Tag>
1919
}

0 commit comments

Comments
 (0)