From cf8f1e83a05a9c618961864ec8e0984e50c85b89 Mon Sep 17 00:00:00 2001 From: Lee Robinson Date: Thu, 17 Aug 2023 21:33:34 -0500 Subject: [PATCH 1/4] Update --- examples/cms-contentful/README.md | 32 +++--- .../app/api/disable-draft/route.ts | 6 ++ .../cms-contentful/app/api/draft/route.ts | 22 ++++ .../app/api/revalidate/route.ts | 15 +++ examples/cms-contentful/app/avatar.tsx | 24 +++++ .../cover-image.js => app/cover-image.tsx} | 20 +++- .../{components/date.js => app/date.tsx} | 2 +- examples/cms-contentful/app/favicon.ico | Bin 0 -> 25931 bytes .../{styles/index.css => app/globals.css} | 2 - .../{components/footer.js => app/layout.tsx} | 43 ++++++-- examples/cms-contentful/app/more-stories.tsx | 61 +++++++++++ examples/cms-contentful/app/page.tsx | 101 ++++++++++++++++++ .../cms-contentful/app/posts/[slug]/page.tsx | 69 ++++++++++++ examples/cms-contentful/components/alert.js | 42 -------- examples/cms-contentful/components/avatar.js | 17 --- .../cms-contentful/components/container.js | 3 - .../components/contentful-image.js | 11 -- examples/cms-contentful/components/header.js | 12 --- .../cms-contentful/components/hero-post.js | 37 ------- examples/cms-contentful/components/intro.js | 28 ----- examples/cms-contentful/components/layout.js | 16 --- .../components/markdown-styles.module.css | 18 ---- examples/cms-contentful/components/meta.js | 42 -------- .../cms-contentful/components/more-stories.js | 24 ----- .../cms-contentful/components/post-body.js | 28 ----- .../cms-contentful/components/post-header.js | 26 ----- .../cms-contentful/components/post-preview.js | 31 ------ .../cms-contentful/components/post-title.js | 7 -- .../components/rich-text-asset.js | 11 -- .../components/section-separator.js | 3 - .../docs/content-content-type.png | Bin 117882 -> 0 bytes .../docs/content-entry-preview.png | Bin 179151 -> 0 bytes .../docs/content-entry-publish.png | Bin 176843 -> 0 bytes .../docs/content-model-overview.png | Bin 194710 -> 0 bytes .../docs/content-preview-setup.png | Bin 717059 -> 0 bytes .../docs/content-publish-changes.png | Bin 124374 -> 0 bytes .../docs/content-secret-header.png | Bin 41845 -> 0 bytes .../docs/content-successful-request.png | Bin 33305 -> 0 bytes .../docs/content-webhook-url.png | Bin 120539 -> 0 bytes .../cms-contentful/lib/{api.js => api.ts} | 77 ++++++------- examples/cms-contentful/lib/constants.js | 5 - examples/cms-contentful/lib/constants.ts | 3 + .../cms-contentful/lib/contentful-image.tsx | 18 ++++ .../{contentful => lib}/export.json | 0 examples/cms-contentful/lib/markdown.tsx | 51 +++++++++ .../{contentful => lib}/setup.js | 0 examples/cms-contentful/next.config.js | 1 + examples/cms-contentful/package.json | 25 +++-- examples/cms-contentful/pages/_app.js | 7 -- examples/cms-contentful/pages/_document.js | 13 --- .../cms-contentful/pages/api/exit-preview.js | 8 -- examples/cms-contentful/pages/api/preview.js | 33 ------ .../cms-contentful/pages/api/revalidate.js | 31 ------ examples/cms-contentful/pages/index.js | 43 -------- examples/cms-contentful/pages/posts/[slug].js | 74 ------------- examples/cms-contentful/postcss.config.js | 2 - .../public/favicon/android-chrome-192x192.png | Bin 4795 -> 0 bytes .../public/favicon/android-chrome-512x512.png | Bin 14640 -> 0 bytes .../public/favicon/apple-touch-icon.png | Bin 1327 -> 0 bytes .../public/favicon/browserconfig.xml | 9 -- .../public/favicon/favicon-16x16.png | Bin 595 -> 0 bytes .../public/favicon/favicon-32x32.png | Bin 880 -> 0 bytes .../cms-contentful/public/favicon/favicon.ico | Bin 15086 -> 0 bytes .../public/favicon/mstile-150x150.png | Bin 3567 -> 0 bytes .../public/favicon/safari-pinned-tab.svg | 33 ------ .../public/favicon/site.webmanifest | 19 ---- examples/cms-contentful/tailwind.config.js | 38 ------- examples/cms-contentful/tailwind.config.ts | 21 ++++ examples/cms-contentful/tsconfig.json | 28 +++++ examples/cms-contentful/types/author.json | 18 ---- examples/cms-contentful/types/post.json | 52 --------- 71 files changed, 538 insertions(+), 824 deletions(-) create mode 100644 examples/cms-contentful/app/api/disable-draft/route.ts create mode 100644 examples/cms-contentful/app/api/draft/route.ts create mode 100644 examples/cms-contentful/app/api/revalidate/route.ts create mode 100644 examples/cms-contentful/app/avatar.tsx rename examples/cms-contentful/{components/cover-image.js => app/cover-image.tsx} (64%) rename examples/cms-contentful/{components/date.js => app/date.tsx} (65%) create mode 100644 examples/cms-contentful/app/favicon.ico rename examples/cms-contentful/{styles/index.css => app/globals.css} (52%) rename examples/cms-contentful/{components/footer.js => app/layout.tsx} (53%) create mode 100644 examples/cms-contentful/app/more-stories.tsx create mode 100644 examples/cms-contentful/app/page.tsx create mode 100644 examples/cms-contentful/app/posts/[slug]/page.tsx delete mode 100644 examples/cms-contentful/components/alert.js delete mode 100644 examples/cms-contentful/components/avatar.js delete mode 100644 examples/cms-contentful/components/container.js delete mode 100644 examples/cms-contentful/components/contentful-image.js delete mode 100644 examples/cms-contentful/components/header.js delete mode 100644 examples/cms-contentful/components/hero-post.js delete mode 100644 examples/cms-contentful/components/intro.js delete mode 100644 examples/cms-contentful/components/layout.js delete mode 100644 examples/cms-contentful/components/markdown-styles.module.css delete mode 100644 examples/cms-contentful/components/meta.js delete mode 100644 examples/cms-contentful/components/more-stories.js delete mode 100644 examples/cms-contentful/components/post-body.js delete mode 100644 examples/cms-contentful/components/post-header.js delete mode 100644 examples/cms-contentful/components/post-preview.js delete mode 100644 examples/cms-contentful/components/post-title.js delete mode 100644 examples/cms-contentful/components/rich-text-asset.js delete mode 100644 examples/cms-contentful/components/section-separator.js delete mode 100644 examples/cms-contentful/docs/content-content-type.png delete mode 100644 examples/cms-contentful/docs/content-entry-preview.png delete mode 100644 examples/cms-contentful/docs/content-entry-publish.png delete mode 100644 examples/cms-contentful/docs/content-model-overview.png delete mode 100644 examples/cms-contentful/docs/content-preview-setup.png delete mode 100644 examples/cms-contentful/docs/content-publish-changes.png delete mode 100644 examples/cms-contentful/docs/content-secret-header.png delete mode 100644 examples/cms-contentful/docs/content-successful-request.png delete mode 100644 examples/cms-contentful/docs/content-webhook-url.png rename examples/cms-contentful/lib/{api.js => api.ts} (68%) delete mode 100644 examples/cms-contentful/lib/constants.js create mode 100644 examples/cms-contentful/lib/constants.ts create mode 100644 examples/cms-contentful/lib/contentful-image.tsx rename examples/cms-contentful/{contentful => lib}/export.json (100%) create mode 100644 examples/cms-contentful/lib/markdown.tsx rename examples/cms-contentful/{contentful => lib}/setup.js (100%) delete mode 100644 examples/cms-contentful/pages/_app.js delete mode 100644 examples/cms-contentful/pages/_document.js delete mode 100644 examples/cms-contentful/pages/api/exit-preview.js delete mode 100644 examples/cms-contentful/pages/api/preview.js delete mode 100644 examples/cms-contentful/pages/api/revalidate.js delete mode 100644 examples/cms-contentful/pages/index.js delete mode 100644 examples/cms-contentful/pages/posts/[slug].js delete mode 100644 examples/cms-contentful/public/favicon/android-chrome-192x192.png delete mode 100644 examples/cms-contentful/public/favicon/android-chrome-512x512.png delete mode 100644 examples/cms-contentful/public/favicon/apple-touch-icon.png delete mode 100644 examples/cms-contentful/public/favicon/browserconfig.xml delete mode 100644 examples/cms-contentful/public/favicon/favicon-16x16.png delete mode 100644 examples/cms-contentful/public/favicon/favicon-32x32.png delete mode 100644 examples/cms-contentful/public/favicon/favicon.ico delete mode 100644 examples/cms-contentful/public/favicon/mstile-150x150.png delete mode 100644 examples/cms-contentful/public/favicon/safari-pinned-tab.svg delete mode 100644 examples/cms-contentful/public/favicon/site.webmanifest delete mode 100644 examples/cms-contentful/tailwind.config.js create mode 100644 examples/cms-contentful/tailwind.config.ts create mode 100644 examples/cms-contentful/tsconfig.json delete mode 100644 examples/cms-contentful/types/author.json delete mode 100644 examples/cms-contentful/types/post.json diff --git a/examples/cms-contentful/README.md b/examples/cms-contentful/README.md index d2dd3e85e777..e74bfc2305f3 100644 --- a/examples/cms-contentful/README.md +++ b/examples/cms-contentful/README.md @@ -10,7 +10,7 @@ This example showcases Next.js's [Static Generation](https://nextjs.org/docs/bas Using the Deploy Button below, you'll deploy the Next.js project as well as connect it to your Contentful space using the Vercel Contentful Integration. -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnext.js%2Ftree%2Fcanary%2Fexamples%2Fcms-contentful&project-name=nextjs-contentful-blog&repository-name=nextjs-contentful-blog&demo-title=Next.js+Blog&demo-description=Static+blog+with+multiple+authors+using+Preview+Mode&demo-url=https%3A%2F%2Fnext-blog-contentful.vercel.app%2F&demo-image=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1625705016%2Ffront%2Fexamples%2FCleanShot_2021-07-07_at_19.43.15_2x.png&integration-ids=oac_aZtAZpDfT1lX3zrnWy7KT9VA&env=CONTENTFUL_PREVIEW_SECRET&envDescription=Any%20URL%20friendly%20value%20to%20secure%20Preview%20Mode) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnext.js%2Ftree%2Fcanary%2Fexamples%2Fcms-contentful&project-name=nextjs-contentful-blog&repository-name=nextjs-contentful-blog&demo-title=Next.js+Blog&demo-description=Static+blog+with+multiple+authors+using+Draft+Mode&demo-url=https%3A%2F%2Fnext-blog-contentful.vercel.app%2F&demo-image=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1625705016%2Ffront%2Fexamples%2FCleanShot_2021-07-07_at_19.43.15_2x.png&integration-ids=oac_aZtAZpDfT1lX3zrnWy7KT9VA&env=CONTENTFUL_PREVIEW_SECRET&envDescription=Any%20URL%20friendly%20value%20to%20secure%20Draft%20Mode) ### Related examples @@ -152,7 +152,7 @@ After setting up the content model (either manually or by running `npm run setup **Content model overview** -![Content model overview](./docs/content-model-overview.png) +![Content model overview](https://github.com/vercel/next.js/assets/9113740/d3f76907-7046-4d94-b285-eb89b87aa223) ### Step 4. Populate Content @@ -171,7 +171,7 @@ Next, create another entry with the content type **Post**: **Important:** For each entry and asset, you need to click on **Publish**. If not, the entry will be in draft state. -![Published content entry](./docs/content-entry-publish.png) +![Published content entry](https://github.com/vercel/next.js/assets/9113740/e1b4a3fe-45f4-4851-91db-8908d3ca18e9) ### Step 5. Set up environment variables @@ -188,7 +188,7 @@ Then set each variable on `.env.local`: - `CONTENTFUL_SPACE_ID` should be the **Space ID** field of your API Key - `CONTENTFUL_ACCESS_TOKEN` should be the **[Content Delivery API](https://www.contentful.com/developers/docs/references/content-delivery-api/) - access token** field of your API key - `CONTENTFUL_PREVIEW_ACCESS_TOKEN` should be the **[Content Preview API](https://www.contentful.com/developers/docs/references/content-preview-api/) - access token** field of your API key -- `CONTENTFUL_PREVIEW_SECRET` should be any value you want. It must be URL friendly as the dashboard will send it as a query parameter to enable preview mode +- `CONTENTFUL_PREVIEW_SECRET` should be any value you want. It must be URL friendly as the dashboard will send it as a query parameter to enable Next.js Draft Mode - - `CONTENTFUL_REVALIDATE_SECRET` should be any value you want. This will be the value you pass in as a secret header from the Contentful Webhook settings to use **[On-Demand Revalidation](https://vercel.com/docs/concepts/next.js/incremental-static-regeneration#on-demand-revalidation)** Your `.env.local` file should look like this: @@ -215,19 +215,19 @@ yarn dev Your blog should be up and running on [http://localhost:3000](http://localhost:3000)! If it doesn't work, post on [GitHub discussions](https://github.com/vercel/next.js/discussions). -### Step 7. Try preview mode +### Step 7. Try Draft Mode In your Contentful space, go to **Settings > Content preview** and add a new content preview for development. The **Name** field may be anything, like `Development`. Then, under **Content preview URLs**, check **Post** and set its value to: ``` -http://localhost:3000/api/preview?secret=&slug={entry.fields.slug} +http://localhost:3000/api/draft?secret=&slug={entry.fields.slug} ``` Replace `` with its respective value in `.env.local`. -![Content preview setup](./docs/content-preview-setup.png) +![Content preview setup](https://github.com/vercel/next.js/assets/9113740/f1383d68-ea2b-4adf-974f-235b8c098745) Once saved, go to one of the posts you've created and: @@ -235,9 +235,9 @@ Once saved, go to one of the posts you've created and: - The state of the post will switch to **CHANGED** automatically. **Do not** publish it. By doing this, the post will be in draft state. - In the sidebar, you will see the **Open preview** button. Click on it! -![Content entry overview](./docs/content-entry-preview.png) +![Content entry overview](https://github.com/vercel/next.js/assets/9113740/cc0dff9a-c57e-4ec4-85f1-22ab74af2b6b) -You will now be able to see the updated title. To exit preview mode, you can click on **Click here to exit preview mode** at the top of the page. +You will now be able to see the updated title. To manually exit Draft Mode, you can navigate to `/api/disable-draft` in the browser. ### Step 8. Deploy on Vercel @@ -253,9 +253,9 @@ To deploy your local project to Vercel, push it to GitHub/GitLab/Bitbucket and [ Alternatively, you can deploy using our template by clicking on the Deploy button below. -This will deploy the Next.js project as well as connect it to your Contentful space using the Vercel Contentful Integration. If you are using Preview Mode, make sure to add `CONTENTFUL_PREVIEW_SECRET` as an [Environment Variable](https://vercel.com/docs/environment-variables) as well. +This will deploy the Next.js project as well as connect it to your Contentful space using the Vercel Contentful Integration. If you are using Draft Mode, make sure to add `CONTENTFUL_PREVIEW_SECRET` as an [Environment Variable](https://vercel.com/docs/concepts/projects/environment-variables) as well. -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnext.js%2Ftree%2Fcanary%2Fexamples%2Fcms-contentful&project-name=nextjs-contentful-blog&repository-name=nextjs-contentful-blog&demo-title=Next.js+Blog&demo-description=Static+blog+with+multiple+authors+using+Preview+Mode&demo-url=https%3A%2F%2Fnext-blog-contentful.vercel.app%2F&demo-image=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1625705016%2Ffront%2Fexamples%2FCleanShot_2021-07-07_at_19.43.15_2x.png&integration-ids=oac_aZtAZpDfT1lX3zrnWy7KT9VA&env=CONTENTFUL_PREVIEW_SECRET,CONTENTFUL_REVALIDATE_SECRET&envDescription=Any%20URL%20friendly%20value%20to%20secure%20Your%20App) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnext.js%2Ftree%2Fcanary%2Fexamples%2Fcms-contentful&project-name=nextjs-contentful-blog&repository-name=nextjs-contentful-blog&demo-title=Next.js+Blog&demo-description=Static+blog+with+multiple+authors+using+Draft+Mode&demo-url=https%3A%2F%2Fnext-blog-contentful.vercel.app%2F&demo-image=https%3A%2F%2Fassets.vercel.com%2Fimage%2Fupload%2Fv1625705016%2Ffront%2Fexamples%2FCleanShot_2021-07-07_at_19.43.15_2x.png&integration-ids=oac_aZtAZpDfT1lX3zrnWy7KT9VA&env=CONTENTFUL_PREVIEW_SECRET,CONTENTFUL_REVALIDATE_SECRET&envDescription=Any%20URL%20friendly%20value%20to%20secure%20Your%20App) ### Step 9. Try using On-Demand Revalidation @@ -273,21 +273,21 @@ In your Contentful space, go to **Settings > Webhooks** and add a new webhook: - **Specify Triggers:** You can choose to trigger for all events or specific events only, such as the Publishing and Unpublishing of Entries and Assets, as shown below. - ![Content webhook url](./docs/content-webhook-url.png) + ![Content webhook url](https://github.com/vercel/next.js/assets/9113740/c8df492a-57d6-42a1-8a3c-b0de3d6ad42f) - **Specify Secret Header:** Add a secret header named `x-vercel-reval-key` and enter the value of the `CONTENTFUL_REVALIDATE_SECRET` from before. - ![Content secret header](./docs/content-secret-header.png) + ![Content secret header](https://github.com/vercel/next.js/assets/9113740/574935e6-0d31-4e4f-b914-8b01bdf03d5e) - **Set Content type:** Set content type to `application/json` in the dropdown. - ![Content publish changes](./docs/content-content-type.png) + ![Content publish changes](https://github.com/vercel/next.js/assets/9113740/78bd856c-ece1-4bf3-a330-1d544abd858d) - **Edit post:** Now, try editing the title of one of your blog posts in Contentful and click Publish. You should see the changed reflected in the website you just deployed, all without triggering a build! Behind the scenes a call was made to the revalidate api that triggers a revalidation of both the landing page and the specific post that was changed. - ![Content publish changes](./docs/content-publish-changes.png) + ![Content publish changes](https://github.com/vercel/next.js/assets/9113740/ad96bfa7-89c1-4e46-9d9c-9067176c9769) - **Verify:** You can verify if your request was made successfully by checking the webhook request log on Contentful and checking for a successful 200 status code, or by having your functions tab open on Vercel when committing the change (log drains may also be used). If you are experiencing issues with the api call, ensure you have correctly entered in the value for environment variable `CONTENTFUL_REVALIDATE_SECRET` within your Vercel deployment. - ![Content successful request](./docs/content-successful-request.png) + ![Content successful request](https://github.com/vercel/next.js/assets/9113740/ed1ffbe9-4dbf-4ec6-9c1f-39c8949c4d38) diff --git a/examples/cms-contentful/app/api/disable-draft/route.ts b/examples/cms-contentful/app/api/disable-draft/route.ts new file mode 100644 index 000000000000..40282bae836f --- /dev/null +++ b/examples/cms-contentful/app/api/disable-draft/route.ts @@ -0,0 +1,6 @@ +import { draftMode } from 'next/headers' + +export async function GET(request: Request) { + draftMode().disable() + return new Response('Draft mode is disabled') +} diff --git a/examples/cms-contentful/app/api/draft/route.ts b/examples/cms-contentful/app/api/draft/route.ts new file mode 100644 index 000000000000..0c22210167a4 --- /dev/null +++ b/examples/cms-contentful/app/api/draft/route.ts @@ -0,0 +1,22 @@ +import { draftMode } from 'next/headers' +import { redirect } from 'next/navigation' +import { getPreviewPostBySlug } from '../../../lib/api' + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url) + const secret = searchParams.get('secret') + const slug = searchParams.get('slug') + + if (secret !== process.env.CONTENTFUL_PREVIEW_SECRET || !slug) { + return new Response('Invalid token', { status: 401 }) + } + + const post = await getPreviewPostBySlug(slug) + + if (!post) { + return new Response('Invalid slug', { status: 401 }) + } + + draftMode().enable() + redirect(`/posts/${post.slug}`) +} diff --git a/examples/cms-contentful/app/api/revalidate/route.ts b/examples/cms-contentful/app/api/revalidate/route.ts new file mode 100644 index 000000000000..21cbcca25b14 --- /dev/null +++ b/examples/cms-contentful/app/api/revalidate/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from 'next/server' +import { revalidateTag } from 'next/cache' + +export async function POST(request: NextRequest) { + const requestHeaders = new Headers(request.headers) + const secret = requestHeaders.get('x-vercel-reval-key') + + if (secret !== process.env.CONTENTFUL_REVALIDATE_SECRET) { + return NextResponse.json({ message: 'Invalid secret' }, { status: 401 }) + } + + revalidateTag('posts') + + return NextResponse.json({ revalidated: true, now: Date.now() }) +} diff --git a/examples/cms-contentful/app/avatar.tsx b/examples/cms-contentful/app/avatar.tsx new file mode 100644 index 000000000000..0f9f8f49e014 --- /dev/null +++ b/examples/cms-contentful/app/avatar.tsx @@ -0,0 +1,24 @@ +import ContentfulImage from '@/lib/contentful-image' + +export default function Avatar({ + name, + picture, +}: { + name: string + picture: any +}) { + return ( +
+
+ +
+
{name}
+
+ ) +} diff --git a/examples/cms-contentful/components/cover-image.js b/examples/cms-contentful/app/cover-image.tsx similarity index 64% rename from examples/cms-contentful/components/cover-image.js rename to examples/cms-contentful/app/cover-image.tsx index 0b4a4f41295b..494271f9e523 100644 --- a/examples/cms-contentful/components/cover-image.js +++ b/examples/cms-contentful/app/cover-image.tsx @@ -1,13 +1,25 @@ -import ContentfulImage from './contentful-image' +import ContentfulImage from '../lib/contentful-image' import Link from 'next/link' -import cn from 'classnames' -export default function CoverImage({ title, url, slug }) { +function cn(...classes: any[]) { + return classes.filter(Boolean).join(' ') +} + +export default function CoverImage({ + title, + url, + slug, +}: { + title: string + url: string + slug?: string +}) { const image = ( {format(new Date(dateString), 'LLLL d, yyyy')} diff --git a/examples/cms-contentful/app/favicon.ico b/examples/cms-contentful/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/examples/cms-contentful/styles/index.css b/examples/cms-contentful/app/globals.css similarity index 52% rename from examples/cms-contentful/styles/index.css rename to examples/cms-contentful/app/globals.css index b63c4592cb2e..b5c61c956711 100644 --- a/examples/cms-contentful/styles/index.css +++ b/examples/cms-contentful/app/globals.css @@ -1,5 +1,3 @@ -/* purgecss start ignore */ @tailwind base; @tailwind components; -/* purgecss end ignore */ @tailwind utilities; diff --git a/examples/cms-contentful/components/footer.js b/examples/cms-contentful/app/layout.tsx similarity index 53% rename from examples/cms-contentful/components/footer.js rename to examples/cms-contentful/app/layout.tsx index da9eed88ec26..d8146f062cd1 100644 --- a/examples/cms-contentful/components/footer.js +++ b/examples/cms-contentful/app/layout.tsx @@ -1,17 +1,46 @@ -import Container from './container' -import { EXAMPLE_PATH } from '../lib/constants' +import './globals.css' +import { Inter } from 'next/font/google' +import { EXAMPLE_PATH, CMS_NAME } from '@/lib/constants' -export default function Footer() { +export const metadata = { + title: `Next.js and ${CMS_NAME} Example`, + description: `This is a blog built with Next.js and ${CMS_NAME}.`, +} + +const inter = Inter({ + variable: '--font-inter', + subsets: ['latin'], + display: 'swap', +}) + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + +
+
{children}
+
+
+ + + ) +} + +function Footer() { return ( ) } diff --git a/examples/cms-contentful/app/more-stories.tsx b/examples/cms-contentful/app/more-stories.tsx new file mode 100644 index 000000000000..c3a9dded0b12 --- /dev/null +++ b/examples/cms-contentful/app/more-stories.tsx @@ -0,0 +1,61 @@ +import Link from 'next/link' +import Avatar from './avatar' +import DateComponent from './date' +import CoverImage from './cover-image' + +export default function MoreStories({ morePosts }: { morePosts: any[] }) { + return ( +
+

+ More Stories +

+
+ {morePosts.map((post) => ( + + ))} +
+
+ ) +} + +function PostPreview({ + title, + coverImage, + date, + excerpt, + author, + slug, +}: { + title: string + coverImage: any + date: string + excerpt: string + author: any + slug: string +}) { + return ( +
+
+ +
+

+ + {title} + +

+
+ +
+

{excerpt}

+ {author && } +
+ ) +} diff --git a/examples/cms-contentful/app/page.tsx b/examples/cms-contentful/app/page.tsx new file mode 100644 index 000000000000..f99b9d40f699 --- /dev/null +++ b/examples/cms-contentful/app/page.tsx @@ -0,0 +1,101 @@ +import Link from 'next/link' +import { draftMode } from 'next/headers' + +import Date from './date' +import CoverImage from './cover-image' +import Avatar from './avatar' +import MoreStories from './more-stories' + +import { getAllPosts } from '@/lib/api' +import { CMS_NAME, CMS_URL } from '@/lib/constants' + +export default async function Page() { + const { isEnabled } = draftMode() + const allPosts = await getAllPosts(isEnabled) + const heroPost = allPosts[0] + const morePosts = allPosts.slice(1) + + return ( +
+ + {heroPost && ( + + )} + +
+ ) +} + +function Intro() { + return ( +
+

+ Blog. +

+

+ A statically generated blog example using{' '} + + Next.js + {' '} + and{' '} + + {CMS_NAME} + + . +

+
+ ) +} + +function HeroPost({ + title, + coverImage, + date, + excerpt, + author, + slug, +}: { + title: string + coverImage: any + date: string + excerpt: string + author: any + slug: string +}) { + return ( +
+
+ +
+
+
+

+ + {title} + +

+
+ +
+
+
+

{excerpt}

+ {author && } +
+
+
+ ) +} diff --git a/examples/cms-contentful/app/posts/[slug]/page.tsx b/examples/cms-contentful/app/posts/[slug]/page.tsx new file mode 100644 index 000000000000..e71d0f5b80a0 --- /dev/null +++ b/examples/cms-contentful/app/posts/[slug]/page.tsx @@ -0,0 +1,69 @@ +import Link from 'next/link' +import { draftMode } from 'next/headers' + +import MoreStories from '../../more-stories' +import Avatar from '../../avatar' +import Date from '../../date' +import CoverImage from '../../cover-image' + +import { Markdown } from '@/lib/markdown' +import { getAllPosts, getPostAndMorePosts } from '@/lib/api' + +export async function generateStaticParams() { + const allPosts = await getAllPosts(false) + + return allPosts.map((post) => ({ + slug: post.slug, + })) +} + +export default async function PostPage({ + params, +}: { + params: { slug: string } +}) { + const { isEnabled } = draftMode() + const { post, morePosts } = await getPostAndMorePosts(params.slug, isEnabled) + + return ( +
+

+ + Blog + + . +

+
+

+ {post.title} +

+
+ {post.author && ( + + )} +
+
+ +
+
+
+ {post.author && ( + + )} +
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+ ) +} diff --git a/examples/cms-contentful/components/alert.js b/examples/cms-contentful/components/alert.js deleted file mode 100644 index 2994d59fbd32..000000000000 --- a/examples/cms-contentful/components/alert.js +++ /dev/null @@ -1,42 +0,0 @@ -import Container from './container' -import cn from 'classnames' -import { EXAMPLE_PATH } from '../lib/constants' - -export default function Alert({ preview }) { - return ( -
- -
- {preview ? ( - <> - This is page is a preview.{' '} - - Click here - {' '} - to exit preview mode. - - ) : ( - <> - The source code for this blog is{' '} - - available on GitHub - - . - - )} -
-
-
- ) -} diff --git a/examples/cms-contentful/components/avatar.js b/examples/cms-contentful/components/avatar.js deleted file mode 100644 index f242405068d6..000000000000 --- a/examples/cms-contentful/components/avatar.js +++ /dev/null @@ -1,17 +0,0 @@ -import ContentfulImage from './contentful-image' - -export default function Avatar({ name, picture }) { - return ( -
-
- -
-
{name}
-
- ) -} diff --git a/examples/cms-contentful/components/container.js b/examples/cms-contentful/components/container.js deleted file mode 100644 index fc1c29dfb074..000000000000 --- a/examples/cms-contentful/components/container.js +++ /dev/null @@ -1,3 +0,0 @@ -export default function Container({ children }) { - return
{children}
-} diff --git a/examples/cms-contentful/components/contentful-image.js b/examples/cms-contentful/components/contentful-image.js deleted file mode 100644 index a6d6e691f751..000000000000 --- a/examples/cms-contentful/components/contentful-image.js +++ /dev/null @@ -1,11 +0,0 @@ -import Image from 'next/image' - -const contentfulLoader = ({ src, width, quality }) => { - return `${src}?w=${width}&q=${quality || 75}` -} - -const ContentfulImage = (props) => { - return -} - -export default ContentfulImage diff --git a/examples/cms-contentful/components/header.js b/examples/cms-contentful/components/header.js deleted file mode 100644 index 05cb9af247f7..000000000000 --- a/examples/cms-contentful/components/header.js +++ /dev/null @@ -1,12 +0,0 @@ -import Link from 'next/link' - -export default function Header() { - return ( -

- - Blog - - . -

- ) -} diff --git a/examples/cms-contentful/components/hero-post.js b/examples/cms-contentful/components/hero-post.js deleted file mode 100644 index 6999cbb3a1c5..000000000000 --- a/examples/cms-contentful/components/hero-post.js +++ /dev/null @@ -1,37 +0,0 @@ -import Link from 'next/link' -import Avatar from '../components/avatar' -import DateComponent from '../components/date' -import CoverImage from '../components/cover-image' - -export default function HeroPost({ - title, - coverImage, - date, - excerpt, - author, - slug, -}) { - return ( -
-
- -
-
-
-

- - {title} - -

-
- -
-
-
-

{excerpt}

- {author && } -
-
-
- ) -} diff --git a/examples/cms-contentful/components/intro.js b/examples/cms-contentful/components/intro.js deleted file mode 100644 index 5931b3c5961b..000000000000 --- a/examples/cms-contentful/components/intro.js +++ /dev/null @@ -1,28 +0,0 @@ -import { CMS_NAME, CMS_URL } from '../lib/constants' - -export default function Intro() { - return ( -
-

- Blog. -

-

- A statically generated blog example using{' '} - - Next.js - {' '} - and{' '} - - {CMS_NAME} - - . -

-
- ) -} diff --git a/examples/cms-contentful/components/layout.js b/examples/cms-contentful/components/layout.js deleted file mode 100644 index 99d95353131e..000000000000 --- a/examples/cms-contentful/components/layout.js +++ /dev/null @@ -1,16 +0,0 @@ -import Alert from '../components/alert' -import Footer from '../components/footer' -import Meta from '../components/meta' - -export default function Layout({ preview, children }) { - return ( - <> - -
- -
{children}
-
-