diff --git a/src/app/builders/[slug]/page.tsx b/src/app/builders/[slug]/page.tsx index ca4d2d2..baee37e 100644 --- a/src/app/builders/[slug]/page.tsx +++ b/src/app/builders/[slug]/page.tsx @@ -3,6 +3,8 @@ import type { Metadata } from "next"; import Image from "next/image"; import Link from "next/link"; import { fetchBuilder } from "@/lib/api/builders"; +import { DraftPreviewBanner } from "@/components/auth/DraftPreviewBanner"; +import { isDraft, primeAdminPreviewToken } from "@/lib/preview"; export async function generateMetadata({ params, @@ -10,6 +12,8 @@ export async function generateMetadata({ params: Promise<{ slug: string }>; }): Promise { const { slug } = await params; + // Prime the request-scoped token so draft metadata resolves for admins. + await primeAdminPreviewToken(); try { const builder = await fetchBuilder(slug); return { @@ -37,6 +41,9 @@ export default async function BuilderPage({ params: Promise<{ slug: string }>; }) { const { slug } = await params; + + const accessToken = await primeAdminPreviewToken(); + let builder; try { builder = await fetchBuilder(slug); @@ -50,6 +57,9 @@ export default async function BuilderPage({ return (
+ {accessToken && isDraft(builder.publishedAt) && ( + + )}
{ - const user = await getCurrentUser(); - const token = user?.admin ? await getAccessTokenCookie() : undefined; - setAccessToken(token); - return token; -} +import { DraftPreviewBanner } from "@/components/auth/DraftPreviewBanner"; +import { primeAdminPreviewToken } from "@/lib/preview"; +import { getCurrentUser } from "@/lib/auth"; export async function generateStaticParams() { try { @@ -42,7 +31,7 @@ export async function generateMetadata({ }): Promise { const { slug } = await params; // Prime the request-scoped token so draft metadata resolves for admins. - await resolveAccessToken(); + await primeAdminPreviewToken(); let memo; try { memo = await fetchMemo(slug); @@ -85,8 +74,8 @@ export default async function MemoDetailPage({ }) { const { slug } = await params; - const accessToken = await resolveAccessToken(); - // Cached per-request alongside resolveAccessToken's call — drives the + const accessToken = await primeAdminPreviewToken(); + // Cached per-request alongside primeAdminPreviewToken's call — drives the // engagement UI's signed-in / postal-code-ready states. const viewer = await getCurrentUser(); @@ -94,20 +83,7 @@ export default async function MemoDetailPage({ try { memo = await fetchMemo(slug); } catch { - if (!accessToken) notFound(); - - return ( -
-
-

404

-

Memo not found

-

- This memo doesn't exist or hasn't been published yet. -

- -
-
- ); + notFound(); } if (memo.slug !== slug) { diff --git a/src/app/posts/[slug]/page.tsx b/src/app/posts/[slug]/page.tsx index ad83e13..7915897 100644 --- a/src/app/posts/[slug]/page.tsx +++ b/src/app/posts/[slug]/page.tsx @@ -9,6 +9,8 @@ import { SubscribeButton } from "@/components/ui/subscribe-button"; import { buildGraph } from "@/lib/schemas/graph"; import { generateBreadcrumbSchema } from "@/lib/schemas/generators/breadcrumb"; import { generateOrganizationSchema } from "@/lib/schemas/generators/organization"; +import { DraftPreviewBanner } from "@/components/auth/DraftPreviewBanner"; +import { isDraft, primeAdminPreviewToken } from "@/lib/preview"; export async function generateStaticParams() { try { @@ -25,6 +27,8 @@ export async function generateMetadata({ params: Promise<{ slug: string }>; }): Promise { const { slug } = await params; + // Prime the request-scoped token so draft metadata resolves for admins. + await primeAdminPreviewToken(); let post; try { post = await fetchPost(slug); @@ -65,6 +69,9 @@ export default async function PostDetailPage({ params: Promise<{ slug: string }>; }) { const { slug } = await params; + + const accessToken = await primeAdminPreviewToken(); + let post; try { post = await fetchPost(slug); @@ -102,6 +109,9 @@ export default async function PostDetailPage({ return (
+ {accessToken && isDraft(post.publishedAt) && ( + + )}