diff --git a/app/(site)/[locale]/[...slug]/page.tsx b/app/(site)/[locale]/[...slug]/page.tsx index be21d0282..38146d096 100644 --- a/app/(site)/[locale]/[...slug]/page.tsx +++ b/app/(site)/[locale]/[...slug]/page.tsx @@ -1,15 +1,20 @@ import CategoryPage from '@/components/pages/category-page'; +import CategoryPagePreview from '@/components/pages/category-page-preview'; import ProductPage from '@/components/pages/product-page'; +import ProductPagePreview from '@/components/pages/product-page-preview'; import SearchPage from '@/components/pages/search-page'; +import SearchPagePreview from '@/components/pages/search-page-preview'; import SinglePage from '@/components/pages/single-page'; // import PreviewProvider from '@/components/preview-provider'; +import SinglePagePreview from '@/components/pages/single-page-preview'; import getQueryFromSlug from '@/helpers/get-query-from-slug'; +import { categoryQuery, pageQuery, productQuery, searchPageQuery } from '@/lib/sanity/queries'; import { getCategory, getPage, getProduct, getSearch } from '@/lib/sanity/sanity.fetch'; import type { Metadata } from 'next'; +import { LiveQuery } from 'next-sanity/preview/live-query'; +import { draftMode } from 'next/headers'; import { notFound } from 'next/navigation'; -export const runtime = 'edge'; - export async function generateMetadata({ params }: { @@ -21,10 +26,15 @@ export async function generateMetadata({ let page; - docType === 'page' && (page = await getPage(queryParams.slug, queryParams.locale)); - docType === 'product' && (page = await getProduct(queryParams.slug, queryParams.locale)); - docType === 'category' && (page = await getCategory(queryParams.slug, queryParams.locale)); - docType === 'search' && (page = await getSearch(queryParams.slug, queryParams.locale)); + if (docType === 'page') { + page = await getPage(queryParams.slug, queryParams.locale); + } else if (docType === 'product') { + page = await getProduct(queryParams.slug, queryParams.locale); + } else if (docType === 'category') { + page = await getCategory(queryParams.slug, queryParams.locale); + } else if (docType === 'search') { + page = await getSearch(queryParams.slug, queryParams.locale); + } if (!page) return notFound(); @@ -63,16 +73,48 @@ export default async function Page({ params }: PageParams) { data = await getSearch(queryParams.slug, queryParams.locale); } - if (!data) { + let PagePreview; + + if (docType === 'page') { + PagePreview = SinglePagePreview; + } else if (docType === 'product') { + PagePreview = ProductPagePreview; + } else if (docType === 'category') { + PagePreview = CategoryPagePreview; + } else if (docType === 'search') { + PagePreview = SearchPagePreview; + } + + let query = ''; + + if (docType === 'page') { + query = pageQuery; + } else if (docType === 'product') { + query = productQuery; + } else if (docType === 'category') { + query = categoryQuery; + } else if (docType === 'search') { + query = searchPageQuery; + } + + if (!query && !PagePreview && !data && !draftMode().isEnabled) { notFound(); } return ( - <> - {docType === 'page' && } - {docType === 'product' && } - {docType === 'category' && } - {docType === 'search' && } - + + <> + {docType === 'page' && } + {docType === 'product' && } + {docType === 'category' && } + {docType === 'search' && } + + ); } diff --git a/app/(site)/[locale]/page.tsx b/app/(site)/[locale]/page.tsx index 542665fb5..27d27392e 100644 --- a/app/(site)/[locale]/page.tsx +++ b/app/(site)/[locale]/page.tsx @@ -7,8 +7,6 @@ import { LiveQuery } from 'next-sanity/preview/live-query'; import { draftMode } from 'next/headers'; import { notFound } from 'next/navigation'; -export const runtime = 'edge'; - export async function generateMetadata({ params }: { diff --git a/app/api/preview/route.ts b/app/api/preview/route.ts index 78617ef6e..8feb33431 100644 --- a/app/api/preview/route.ts +++ b/app/api/preview/route.ts @@ -1,10 +1,6 @@ -// import { previewSecretId } from '@/lib/sanity/sanity.api' -// import { client } from '@/lib/sanity/sanity.client' import { token } from '@/lib/sanity/sanity.fetch' import { draftMode } from 'next/headers' -export const runtime = 'edge' - export async function GET(request: Request) { const { searchParams } = new URL(request.url) const secret = searchParams.get('secret') @@ -18,26 +14,12 @@ export async function GET(request: Request) { ) } - if (!secret) { - return new Response('Invalid secret', { status: 401 }) + if (secret !== process.env.SANITY_API_READ_TOKEN) { + return new Response('Invalid token', { status: 401 }) } - // const authenticatedClient = client.withConfig({ token }) - - // const validSecret = await isValidSecret( - // authenticatedClient, - // previewSecretId, - // secret, - // ) - - // if (!validSecret) { - // return new Response('Invalid secret', { status: 401 }) - // } - draftMode().enable() - console.log(draftMode()) - if (type === 'home') { return new Response(null, { status: 307, diff --git a/components/pages/category-page-preview.tsx b/components/pages/category-page-preview.tsx new file mode 100644 index 000000000..61fddee75 --- /dev/null +++ b/components/pages/category-page-preview.tsx @@ -0,0 +1,24 @@ +'use client'; + +import dynamic from 'next/dynamic'; +import PreviewBanner from '../ui/preview-banner/preview-banner'; +import { CategoryPageParams } from './category-page'; + +const CategoryPage = dynamic(() => import('./category-page')); + +export default function CategoryPagePreview({ data }: CategoryPageParams) { + if (!data) { + return ( +
+ Please start editing your Product document to see the preview! +
+ ); + } + + return ( + <> + + + + ); +} diff --git a/components/pages/category-page.tsx b/components/pages/category-page.tsx index fa07deaa7..6e1eb54dc 100644 --- a/components/pages/category-page.tsx +++ b/components/pages/category-page.tsx @@ -2,9 +2,9 @@ import Search from '@/components/search/search'; import SearchResult from '@/components/search/search-result'; import Text from '@/components/ui/text/text'; -interface CategoryPageParams { +export type CategoryPageParams = { data: object | any; -} +}; export default function CategoryPage({ data }: CategoryPageParams) { const category = data; diff --git a/components/pages/product-page-preview.tsx b/components/pages/product-page-preview.tsx new file mode 100644 index 000000000..f2a72e487 --- /dev/null +++ b/components/pages/product-page-preview.tsx @@ -0,0 +1,24 @@ +'use client'; + +import dynamic from 'next/dynamic'; +import PreviewBanner from '../ui/preview-banner/preview-banner'; +import type { ProductPageParams } from './product-page'; + +const ProductPage = dynamic(() => import('./product-page')); + +export default function ProductPagePreview({ data }: ProductPageParams) { + if (!data) { + return ( +
+ Please start editing your Product document to see the preview! +
+ ); + } + + return ( + <> + + + + ); +} diff --git a/components/pages/product-page.tsx b/components/pages/product-page.tsx index c844c7bba..dfda2d1da 100644 --- a/components/pages/product-page.tsx +++ b/components/pages/product-page.tsx @@ -1,7 +1,7 @@ import ProductView from '@/components/product/product-view'; -interface ProductPageParams { +export type ProductPageParams = { data: object | any; -} +}; export default function ProductPage({ data }: ProductPageParams) { const product = data; diff --git a/components/pages/search-page-preview.tsx b/components/pages/search-page-preview.tsx index ab080523d..86e51af78 100644 --- a/components/pages/search-page-preview.tsx +++ b/components/pages/search-page-preview.tsx @@ -1,26 +1,24 @@ 'use client'; -import PreviewBanner from '@/components/ui/preview-banner'; -import { searchPageQuery } from '@/lib/sanity/queries'; -import { useLiveQuery } from '@sanity/preview-kit'; -import SearchPage from './search-page'; +import dynamic from 'next/dynamic'; +import PreviewBanner from '../ui/preview-banner'; +import type { SearchPageParams } from './search-page'; -interface SearchPagePreviewParams { - initialData: []; - params: { - locale: string; - slug: string; - }; -} +const SearchPage = dynamic(() => import('./search-page')); -export default function SearchPagePreview({ initialData, params }: SearchPagePreviewParams) { - const [data] = useLiveQuery(initialData, searchPageQuery, params); +export default function SearchPagePreview({ data }: SearchPageParams) { + if (!data) { + return ( +
+ Please start editing your Search page document to see the preview! +
+ ); + } return ( <> - - {/* @ts-ignore */} - + + ); } diff --git a/components/pages/search-page.tsx b/components/pages/search-page.tsx index 868ffb416..3cd13c4ad 100644 --- a/components/pages/search-page.tsx +++ b/components/pages/search-page.tsx @@ -2,9 +2,9 @@ import Search from '@/components/search/search'; import SearchResult from '@/components/search/search-result'; import Text from '@/components/ui/text/text'; -interface SearchPageParams { +export type SearchPageParams = { data: object | any; -} +}; export default function SearchPage({ data }: SearchPageParams) { return ( diff --git a/components/pages/single-page-preview.tsx b/components/pages/single-page-preview.tsx index 5679043d5..972090d6d 100644 --- a/components/pages/single-page-preview.tsx +++ b/components/pages/single-page-preview.tsx @@ -1,26 +1,22 @@ 'use client'; -import PreviewBanner from '@/components/ui/preview-banner'; -import { pageQuery } from '@/lib/sanity/queries'; -import { useLiveQuery } from '@sanity/preview-kit'; -import SinglePage from './single-page'; +import dynamic from 'next/dynamic'; +import { SinglePageParams } from './single-page'; -interface SinglePagePreviewParams { - initialData: []; - params: { - locale: string; - slug: string; - }; -} +const SinglePage = dynamic(() => import('./single-page')); +const PreviewBanner = dynamic(() => import('../ui/preview-banner/preview-banner')); -export default function SinglePagePreview({ initialData, params }: SinglePagePreviewParams) { - const [data] = useLiveQuery(initialData, pageQuery, params); +export default function SinglePagePreview({ data }: SinglePageParams) { + if (!data) { + return ( +
Please start editing your Page document to see the preview!
+ ); + } return ( <> - - {/* @ts-ignore */} - + + ); } diff --git a/components/pages/single-page.tsx b/components/pages/single-page.tsx index d48296e64..cb0f7c30d 100644 --- a/components/pages/single-page.tsx +++ b/components/pages/single-page.tsx @@ -1,13 +1,13 @@ import DynamicContentManager from '@/components/layout/dynamic-content-manager/dynamic-content-manager'; -interface SinglePageParams { +export type SinglePageParams = { data: object | any; -} +}; export default function SinglePage({ data }: SinglePageParams) { return ( <> - ; + ); } diff --git a/components/preview/preview-provider.tsx b/components/preview/preview-provider.tsx index 303bc681e..e5db67a08 100644 --- a/components/preview/preview-provider.tsx +++ b/components/preview/preview-provider.tsx @@ -13,17 +13,12 @@ export default function PreviewProvider({ token }: { children: React.ReactNode; - token: string; + token?: string; }) { const { client } = suspend(() => import('@/lib/sanity/sanity.client'), [UniqueKey]); if (!token) throw new TypeError('Missing token'); return ( - + {children} );