Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DatoCMS Example #10891

Merged
merged 55 commits into from
Mar 9, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
39a333c
Copy cms-datocms
chibicode Mar 6, 2020
aab8c39
Update package.json
chibicode Mar 6, 2020
e5f48aa
Desktop design
chibicode Mar 7, 2020
2116dd7
Tablet support
chibicode Mar 7, 2020
72cf270
Mobile styles
chibicode Mar 7, 2020
f8804fb
Update titles
chibicode Mar 7, 2020
d2571d1
Add article page
chibicode Mar 7, 2020
22c6dc5
Minor tweaks
chibicode Mar 7, 2020
8ee5bf8
Fix height issue
chibicode Mar 7, 2020
83b999a
Improve text colors
chibicode Mar 7, 2020
333555f
Extract Alert and Footer components
chibicode Mar 7, 2020
cee5fff
Extract avatar
chibicode Mar 7, 2020
e99e9b8
Add Date
chibicode Mar 7, 2020
33324b9
Extract container
chibicode Mar 7, 2020
28513da
Fix capitalization
chibicode Mar 7, 2020
b28f810
Make it work with no backend
chibicode Mar 7, 2020
6de8eab
Add paragraph styles
chibicode Mar 7, 2020
a74b373
Extract PostPreview
chibicode Mar 8, 2020
23d8333
Extract h2
chibicode Mar 8, 2020
0c6be70
Extract more stories
chibicode Mar 8, 2020
3d3e5be
Refactor into more components
chibicode Mar 8, 2020
8d7c610
Update tags
chibicode Mar 8, 2020
d563708
Add missing key
chibicode Mar 8, 2020
6c69b60
Add custom document for lang="" support
chibicode Mar 8, 2020
4079b2e
Add dotenv
chibicode Mar 8, 2020
aaeda54
Load data for the index page
chibicode Mar 8, 2020
7caddef
Limit posts
chibicode Mar 8, 2020
a01f50c
Show post page
chibicode Mar 8, 2020
7eccf5a
Add markdown processing
chibicode Mar 8, 2020
dc16db6
Forgot margin
chibicode Mar 8, 2020
6a2c9cc
Add links
chibicode Mar 8, 2020
7fa6419
Remove files and add fallback
chibicode Mar 8, 2020
09e26e8
Add og:image
chibicode Mar 8, 2020
ca993f9
Add favicon
chibicode Mar 8, 2020
e259853
Add aria-label
chibicode Mar 8, 2020
9608b44
Merge branch 'canary' into NEXT-10/cms-example
chibicode Mar 8, 2020
d0ac359
Fix prerender
chibicode Mar 8, 2020
56e3174
Learn more → read documentation
chibicode Mar 8, 2020
2915b15
Fix links and footer
chibicode Mar 8, 2020
289b4ab
Desaturate using imgix
chibicode Mar 8, 2020
00662b4
Add preview secret
chibicode Mar 8, 2020
4abf54e
Add preview support
chibicode Mar 8, 2020
119cabb
Fix preview code
chibicode Mar 8, 2020
f4071ad
Exit preview mode
chibicode Mar 8, 2020
037d62d
Extract getAllPostsWithSlug
chibicode Mar 8, 2020
f683e0f
Extract getAllPostsForHome
chibicode Mar 8, 2020
b4a956b
Extract getPreviewPostBySlug
chibicode Mar 8, 2020
c1079c1
Extract getPostAndMorePosts
chibicode Mar 8, 2020
e533d05
Extract constants
chibicode Mar 9, 2020
0939e93
Extract markdownToHtml
chibicode Mar 9, 2020
666f78c
Fix markdown styles
chibicode Mar 9, 2020
1992894
Fix imgix for author
chibicode Mar 9, 2020
e549e9d
Add README
chibicode Mar 9, 2020
16f8d49
Merge branch 'canary' into NEXT-10/cms-example
chibicode Mar 9, 2020
32dee1d
Add links to docs
chibicode Mar 9, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/advanced-features/preview-mode.md
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,12 @@ That’s it! If you access the preview API route (with `secret` and `slug`) from
https://<your-site>/api/preview?secret=<token>&slug=<path>
```

## More Examples

Take a look at the following examples to learn more:

- [DatoCMS Example](https://github.com/zeit/next.js/tree/canary/examples/cms-datocms)

## More Details

### Clear the preview mode cookies
Expand Down
6 changes: 6 additions & 0 deletions docs/basic-features/data-fetching.md
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,12 @@ function Profile() {

[Check out the SWR documentation to learn more](https://swr.now.sh/).

## More Examples

Take a look at the following examples to learn more:

- [DatoCMS Example](https://github.com/zeit/next.js/tree/canary/examples/cms-datocms)

## Learn more

We recommend you to read the following sections next:
Expand Down
6 changes: 6 additions & 0 deletions docs/basic-features/pages.md
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,12 @@ We've discussed two forms of pre-rendering for Next.js.
- **Static Generation (Recommended):** The HTML is generated at **build time** and will be reused on each request. To make a page use Static Generation, just export the page component, or export `getStaticProps` (and `getStaticPaths` if necessary). It's great for pages that can be pre-rendered ahead of a user's request. You can also use it with Client-side Rendering to bring in additional data.
- **Server-side Rendering:** The HTML is generated on **each request**. To make a page use Server-side Rendering, export `getServerSideProps`. Because Server-side Rendering results in slower performance than Static Generation, use this only if absolutely necessary.

## More Examples

Take a look at the following examples to learn more:

- [DatoCMS Example](https://github.com/zeit/next.js/tree/canary/examples/cms-datocms)

## Learn more

We recommend you to read the following sections next:
Expand Down
2 changes: 2 additions & 0 deletions examples/cms-datocms/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
NEXT_EXAMPLE_CMS_DATOCMS_API_TOKEN=
NEXT_EXAMPLE_CMS_DATOCMS_PREVIEW_SECRET=
2 changes: 2 additions & 0 deletions examples/cms-datocms/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.env
.now
153 changes: 153 additions & 0 deletions examples/cms-datocms/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
# A statically generated blog example using Next.js and DatoCMS

This example showcases Next.js's [Static Generation](/docs/basic-features/pages.md) feature using [DatoCMS](https://www.datocms.com/) as the data source.

## How to use

### Using `create-next-app`

Execute [`create-next-app`](https://github.com/zeit/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init) or [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) to bootstrap the example:

```bash
npm init next-app --example cms-datocms cms-datocms-app
# or
yarn create next-app --example cms-datocms cms-datocms-app
```

### Download manually

Download the example:

```bash
curl https://codeload.github.com/zeit/next.js/tar.gz/canary | tar -xz --strip=2 next.js-canary/examples/cms-datocms
cd cms-datocms
```

## Configuration

### Step 1. Create an account and a project on DatoCMS

First, [create an account on DatoCMS](https://datocms.com).

After creating an account, create a **new project** from the dashboard. You can select a **Blank Project**.

### Step 2. Create an `Author` model

From the project setting page, create a new **Model**.

- The name should be `Author`.

Next, add these fields (you don't have to modify the settings):

- `Name` - **Text** field (**Single-line String**)
- `Picture` - **Media** field (**Single asset**)

### Step 3. Create a `Post` model

From the project setting page, create a new **Model**:

- The name should be `Post`.
- **Important:** From the "Additional Settings" tab, turn on **Enable draft/published system.** This lets you preview the content.

Next, add these fields (you don't have to modify the settings unless specified):

- `Title` - **Text** field (**Single-line String**)
- `Content` - **Text** field (**Multiple-paragraph Text**)
- `Excerpt` - **Text** field (**Single-line String**)
- `Cover Image` - **Media** field (**Single asset**)
- `Date` - **Date and time** field (**Date**)
- `Author` - **Links** field (**Single link**) , and from the "Validations" tab under "Accept only specified model", select **Author**.
- `Slug` - **SEO** field (**Slug**), and from the "Validations" tab under "Reference field" select **Title**.

### Step 4. Populate Content

From the **Content** menu at the top, select **Author** and create a new record.

- You just need **1 Author record**.
- Use dummy data for the text.
- For the image, you can download one from [Unsplash](https://unsplash.com/).

Next, select **Post** and create a new record.

- We recommend creating at least **2 Post records**.
- Use dummy data for the text.
- You can write markdown for the **Content** field.
- For the images, you can download ones from [Unsplash](https://unsplash.com/).
- Pick the **Author** you created earlier.

**Important:** For each post record, you need to click **Publish** after saving. If not, the post will be in the draft state.

### Step 5. Set up environment variables

Go to the **Settings** menu at the top and click **API tokens**.

Then click **Read-only API token** and copy the token.

Next, copy the `.env.example` file in this directory to `.env` (which will be ignored by Git):

```bash
cp .env.example .env
```

Then set each variable on `.env`:

- `NEXT_EXAMPLE_CMS_DATOCMS_API_TOKEN` should be the API token you just copied.
- `NEXT_EXAMPLE_CMS_DATOCMS_PREVIEW_SECRET` can be any random string (but avoid spaces), like `MY_SECRET` - this is used for [the Preview Mode](/docs/advanced-features/preview-mode.md).

Your `.env` file should look like this:

```bash
NEXT_EXAMPLE_CMS_DATOCMS_API_TOKEN=...
NEXT_EXAMPLE_CMS_DATOCMS_PREVIEW_SECRET=...
```

### Step 6. Run Next.js in development mode

```bash
npm install
npm run dev

# or

yarn install
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/zeit/next.js/discussions).

### Step 7. Try preview mode

On DatoCMS, go to one of the posts you've created and:

- **Update the title**. For example, you can add `[Draft]` in front of the title.
- Click **Save**, but **DO NOT** click **Publish**. By doing this, the post will be in the draft state.

(If it doesn't become draft, you need to go to the model settings for `Post`, go to **Additional Settings**, and turn on **Enable draft/published system**.)

Now, if you go to the post page on localhost, you won't see the updated title. However, if you use the **Preview Mode**, you'll be able to see the change ([Documentation](/docs/advanced-features/preview-mode.md)).

To enable the Preview Mode, go to this URL:

```
http://localhost:3000/api/preview?secret=<secret>&slug=<slug>
```

- `<secret>` should be the string you entered for `NEXT_EXAMPLE_CMS_DATOCMS_PREVIEW_SECRET`.
- `<slug>` should be the post's `slug` attribute (you can check on DatoCMS).

You should now be able to see the updated title. To exit the preview mode, you can click **Click here to exit preview mode** at the top.

### Step 8. Deploy on ZEIT Now

You can deploy this app to the cloud with [ZEIT Now](https://zeit.co/import?filter=next.js&utm_source=github&utm_medium=readme&utm_campaign=next-example) ([Documentation](https://nextjs.org/docs/deployment)).

To deploy on ZEIT Now, you need to set the environment variables with **Now Secrets** using [Now CLI](https://zeit.co/download) ([Documentation](https://zeit.co/docs/now-cli#commands/secrets)).

Install [Now CLI](https://zeit.co/download), log in to your account from the CLI, and run the following commands to add the environment variables. Replace `<NEXT_EXAMPLE_CMS_DATOCMS_API_TOKEN>` and `<NEXT_EXAMPLE_CMS_DATOCMS_PREVIEW_SECRET>` with the corresponding strings in `.env`.

```
now secrets add next_example_cms_datocms_api_token <NEXT_EXAMPLE_CMS_DATOCMS_API_TOKEN>
now secrets add next_example_cms_datocms_preview_secret <NEXT_EXAMPLE_CMS_DATOCMS_PREVIEW_SECRET>
```

Then push the project to GitHub/GitLab/Bitbucket and [import to ZEIT Now](https://zeit.co/import?filter=next.js&utm_source=github&utm_medium=readme&utm_campaign=next-example) to deploy.
42 changes: 42 additions & 0 deletions examples/cms-datocms/components/alert.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import Container from './container'
import cn from 'classnames'
import { EXAMPLE_PATH } from '../lib/constants'

export default function Alert({ preview }) {
return (
<div
className={cn('border-b', {
'bg-accent-7 border-accent-7 text-white': preview,
'bg-accent-1 border-accent-2': !preview,
})}
>
<Container>
<div className="py-2 text-center text-sm">
{preview ? (
<>
This is page is a preview.{' '}
<a
href="/api/exit-preview"
className="underline hover:text-cyan duration-200 transition-colors"
>
Click here
</a>{' '}
to exit preview mode.
</>
) : (
<>
The source code for this blog is{' '}
<a
href={`https://github.com/zeit/next.js/tree/canary/examples/${EXAMPLE_PATH}`}
className="underline hover:text-success duration-200 transition-colors"
>
available on GitHub
</a>
.
</>
)}
</div>
</Container>
</div>
)
}
12 changes: 12 additions & 0 deletions examples/cms-datocms/components/avatar.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
export default function Avatar({ name, picture }) {
return (
<div className="flex items-center">
<img
src={picture.url}
className="w-12 h-12 rounded-full mr-4"
alt={name}
/>
<div className="text-xl font-bold">{name}</div>
</div>
)
}
3 changes: 3 additions & 0 deletions examples/cms-datocms/components/container.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function Container({ children }) {
return <div className="container mx-auto px-5">{children}</div>
}
28 changes: 28 additions & 0 deletions examples/cms-datocms/components/cover-image.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { Image } from 'react-datocms'
import cn from 'classnames'
import Link from 'next/link'

export default function CoverImage({ title, responsiveImage, slug }) {
const image = (
<Image
data={{
...responsiveImage,
alt: `Cover Image for ${title}`,
}}
className={cn('shadow-small', {
'hover:shadow-medium transition-shadow duration-200': slug,
})}
/>
)
return (
<div className="-mx-5 sm:mx-0">
{slug ? (
<Link as={`/posts/${slug}`} href="/posts/[slug]">
<a aria-label={title}>{image}</a>
</Link>
) : (
image
)}
</div>
)
}
6 changes: 6 additions & 0 deletions examples/cms-datocms/components/date.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { parseISO, format } from 'date-fns'

export default function Date({ dateString }) {
const date = parseISO(dateString)
return <time dateTime={dateString}>{format(date, 'LLLL d, yyyy')}</time>
}
30 changes: 30 additions & 0 deletions examples/cms-datocms/components/footer.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import Container from './container'
import { EXAMPLE_PATH } from '../lib/constants'

export default function Footer() {
return (
<footer className="bg-accent-1 border-t border-accent-2">
<Container>
<div className="py-28 flex flex-col lg:flex-row items-center">
<h3 className="text-4xl lg:text-5xl font-bold tracking-tighter leading-tight text-center lg:text-left mb-10 lg:mb-0 lg:pr-4 lg:w-1/2">
Statically Generated with Next.js.
</h3>
<div className="flex flex-col lg:flex-row justify-center items-center lg:pl-4 lg:w-1/2">
<a
href="https://nextjs.org/docs/basic-features/pages"
className="mx-3 bg-black hover:bg-white hover:text-black border border-black text-white font-bold py-3 px-12 lg:px-8 duration-200 transition-colors mb-6 lg:mb-0"
>
Read Documentation
</a>
<a
href={`https://github.com/zeit/next.js/tree/canary/examples/${EXAMPLE_PATH}`}
className="mx-3 font-bold hover:underline"
>
View on GitHub
</a>
</div>
</div>
</Container>
</footer>
)
}
12 changes: 12 additions & 0 deletions examples/cms-datocms/components/header.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import Link from 'next/link'

export default function Header() {
return (
<h2 className="text-2xl md:text-4xl font-bold tracking-tight md:tracking-tighter leading-tight mb-20 mt-8">
<Link href="/">
<a className="hover:underline">Blog</a>
</Link>
.
</h2>
)
}
41 changes: 41 additions & 0 deletions examples/cms-datocms/components/hero-post.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import Avatar from '../components/avatar'
import Date from '../components/date'
import CoverImage from '../components/cover-image'
import Link from 'next/link'

export default function HeroPost({
title,
coverImage,
date,
excerpt,
author,
slug,
}) {
return (
<section>
<div className="mb-8 md:mb-16">
<CoverImage
title={title}
responsiveImage={coverImage.responsiveImage}
slug={slug}
/>
</div>
<div className="md:grid md:grid-cols-2 md:col-gap-16 lg:col-gap-8 mb-20 md:mb-28">
<div>
<h3 className="mb-4 text-4xl lg:text-6xl leading-tight">
<Link as={`/posts/${slug}`} href="/posts/[slug]">
<a className="hover:underline">{title}</a>
</Link>
</h3>
<div className="mb-4 md:mb-0 text-lg">
<Date dateString={date} />
</div>
</div>
<div>
<p className="text-lg leading-relaxed mb-4">{excerpt}</p>
<Avatar name={author.name} picture={author.picture} />
</div>
</div>
</section>
)
}
Loading