28/07/2023

Sanity Sistema de gerenciamento de conteúdo (CMS)

O que é um CMS?

Um sistema de gerenciamento de conteúdo (CMS) é um software que ajuda os usuários a criar, gerenciar e modificar conteúdo em uma aplicação sem a necessidade de conhecimento técnico. Esse blog é feito utilizando a feature da Sanity.io.

Image

Hoje eu vou te ensinar a como configurar de forma rápida e fácil o Sanity para aplicações React com o framework Nextjs.

Setup do projeto.

Para iniciar você devera rodar os seguintes comandos no seu terminal dentro do projeto Nextjs:

npm i @portabletext/react @sanity/image-url next-sanity

Após a instalação você deve criar uma conta no Sanity.io e, iniciar o seu projeto Sanity com o seguinte comando:

npm create sanity@latest -- --template clean --create-project "<nome do projeto Sanity>" --dataset production

Para as perguntas responda o seguinte:

  • Would you like to add configuration folder to this Nextjs project : n
  • Project output path: sanity
  • Do you want to use Typescript: (Você decide)

Schemas

O último comando deve ter inserido uma pasta chamada Sanity dentro do seu projeto, essa pasta contém tudo que você vai precisar para começar o seu projeto.

Os Schemas são as partes mais importantes, pois eles definem como o seu CMS vai se portar.

Image

Nesse projeto atualmente só existe um Schema que seria o dos posts, ele é o que gera toda a estrutura necessária para criar um post.

Crie esse arquivo e adicione o seguinte Schema:

export default {
name: 'post',
type: 'document',
title: 'Post',
fields: [
{
name: 'title',
type: 'string',
title: 'Title',
},
{
name: 'overview',
type: 'string',
title: 'Overview',
},
{
name: 'slug',
type: 'slug',
title: 'Slug',
options: {
source: 'title',
}
},
{
name: 'content',
type: 'array',
title: 'Content',
of: [
{
type: 'block',
},
{
type: 'image',
fields: [
{
name: 'alt',
type: 'text',
title: 'Alternative text',
}
]
}
]
}
]
}

Caso queira personalizar o seu Schema para portar o seu projeto da melhor forma, consulte a documentação Schema Docs.

Criando o primeiro Post:

Após criar o seu schema vá ao arquivo index.ts dentro da mesma pasta e adicione o seu dentro da array schemaTypes:

Image

Sempre que criar um schema novo devera adicioná-lo dentro desse array.

Para verificar se tudo ocorreu como o esperado acesse o CMD (terminal) e navegue para dentro da pasta sanity, e digite npm run dev isso vai iniciar o seu CMS local. Faça login e crie o seu primeiro post!

Após criar o seu post entre na aba vision e insira a seguinte query *[_type == "post"] :

Image

Listando os Posts no projeto:


Se funcionar tudo está indo como o esperado.

Volte para o código e crie um arquivo para iniciar o client do Sanity:

Image

Para conseguir o id do projeto acesse o Sanity.io faça login e entre no seu projeto, lá você encontrará o seu projectId.

Image

Agora vá ao local que ira fazer fetch dos seus posts e crie sua query:

Image

Essa chamada deve te retornar ao mínimo uma array de objetos com pelo menos esses atributos:

Image

Com isso você deve conseguir listar os posts com um simples map:

Image

Acessar um post:

Dentro do map crie uma tag de Link com o seguinte href (o atributo prefetch já vem como padrão true, foi inserido somente para visualização):

Image

Dentro do diretório crie a sua página com a seguinte estrutura:

Image

O [slug] significa que essa parte da URL será dinâmica.

Dentro desse arquivo novo devemos fazer a query do post em específico do qual estamos a procura:

Image

Para pegar somente um post utilize a seguinte query `*[_type == "post" && slug.current == "${slug}"][0]`

Lembrando que o slug vem do parâmetro via URL, passado na tag link, quando listamos todos os posts.

Para renderizarmos o texto utilizamos o Portable text que foi importado da lib que baixamos lá no início do projeto. Porém, existe um problema com a renderização das imagens adicionadas durante o conteúdo e para resolvermos precisaremos de uma função auxiliar:

Image

Essa função será utilizada em um objeto do qual tratara esse problema das imagens:

Image

Além disso, também é necessário adicionar o host da CDN da sanity nas configurações do nextjs. Dentro do arquivo next.config.js adicione:

const nextConfig = {
images: {
domains: ['cdn.sanity.io'],
}
}

Após isso podemos utilizar o componente importado da lib para nos auxiliar na inserção do html diretamente na página, import { PortableText } from"@portabletext/react";

Image

Com esse setup está tudo pronto para o seu blog funcionar perfeitamente, desejo muita sorte nessa caminhada dos estudos. Qualquer dúvida ou problema estou disponível para contato em @luccaparadeda pelo e-mail luccaparadedaprofessional@gmail.com

Referencias:
https://www.sanity.io/docs

https://www.youtube.com/watch?v=MqmzrQ1MNG8

https://kinsta.com/knowledgebase/content-management-system/