Explorando a estrutura do projeto React
Estou dentro da pasta do nosso projeto, ou seja, do projeto que vamos construir durante o curso. Dentro desse diretório, já temos um projeto feito somente com React do Culturama. Na estrutura que estamos chamando de repositório "Trabalhando com Frameworks Modernos", utilizamos o terminal integrado do editor de texto, que está sendo compartilhado na tela, e digitamos o comando para navegar até a estrutura do projeto existente:
Na aba lateral esquerda, conseguimos visualizar toda a estrutura do projeto e verificamos que é um projeto React com o Vite, bem simples. Ele possui a pasta public, onde estão os arquivos que serão disponibilizados para o estático do site, gerado pelo build do Vite. Aqui, temos somente o favicon, que é o ícone que aparece no topo do site, na barra de navegação.
Detalhando a estrutura de pastas do projeto
Dentro da pasta src, encontramos uma estrutura simples de um projeto React. Temos a pasta assets, com os arquivos relacionados a imagens, fontes e outros elementos do projeto. Há também uma pasta components, onde estão todos os componentes utilizados no projeto. A pasta context é utilizada para o gerenciamento de informações na aplicação, através do useContext do React.
Temos a pasta hooks, que será muito utilizada. Posteriormente, vamos transferir toda essa parte de hooks, utilitários e tipagem para o lado do Next.js. Os hooks facilitam nossa utilização. Existe também uma pasta chamada pages, que contém as páginas do projeto. Quando fizermos a migração para o Next.js, entenderemos melhor como diferenciar uma parte de detalhe de uma parte de evento, entre outros aspectos.
Configurando o roteamento da aplicação
Além disso, temos a parte de router, que é o roteamento da aplicação. Ela utiliza as páginas dentro do diretório pages, mencionado anteriormente. Vamos ver como configuramos o roteamento utilizando o react-router-dom:
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import App from '../App';
import Home from '../pages/Home';
import Events from '../pages/Events';
import Categories from '../pages/Categories';
import EventDetail from '../pages/EventDetail';
import NotFound from '../pages/NotFound';
import Search from '../pages/Search';
const router = createBrowserRouter([
{
path: '/',
element: <App />,
errorElement: <NotFound />,
children: [
{
index: true,
element: <Home />,
},
{
path: 'eventos',
element: <Events />,
},
{
path: 'categorias',
element: <Categories />,
},
{
path: 'categorias/:categoryId',
element: <Categories />,
},
{
path: 'eventos/:eventId',
element: <EventDetail />,
},
{
path: 'buscar',
element: <Search />,
},
],
},
]);
export const AppRouter = () => <RouterProvider router={router} />;
Definindo tipagens e interfaces
Por fim, há uma pasta types, onde está toda a parte de tipagem utilizada na aplicação. Vamos dar uma olhada em como definimos as interfaces para as categorias e eventos:
export interface Category {
id: number;
name: string;
}
export interface Event {
id: number;
name: string;
image: string;
description: string;
date: string;
categoryId: number;
location: string;
}
export interface DataContextType {
categories: Category[];
events: Event[];
loading: boolean;
error: string | null;
getEventsByCategory: (categoryId: number) => Event[];
searchEvents: (query: string) => Event[];
refreshData: () => Promise<void>;
}
Iniciando o servidor e rodando a aplicação
No terminal, começamos rodando o servidor com o seguinte comando:
O projeto utiliza um json-server para simular informações vindas de um back-end. Trata-se de um back-end controlado, que não aprofunda em serviços específicos. Já trouxemos um serviço pronto que traz eventos e categorias reais para ilustrar na aplicação.
Com o servidor rodando na localhost:3001, abrimos uma nova instância do terminal e digitamos o comando para rodar a aplicação:
Inicialmente, esquecemos de mudar de pasta, então utilizamos o comando:
E, em seguida, rodamos novamente:
Explorando as funcionalidades do projeto Culturama
O projeto começou a rodar na porta 5173. Vamos abrir via terminal e, agora, temos no navegador a ilustração de como está funcionando o nosso projeto do Culturama. O Culturama é um site que traz um calendário e uma agenda de eventos. Esses eventos são reais, mas as datas e localizações são fictícias. Temos separação por categoria e por data. O projeto está completo. Por exemplo, ao clicar na amostra de cinema brasileiro, marcada para o dia 29/10 em Brasília, Distrito Federal, e selecionar "ver", temos uma seção inteira de detalhes do evento.
Nessa seção, encontramos a imagem do evento, algumas informações adicionais, data e hora, e localização. A parte de localização ainda não está integrada com o mapa, e essa integração não é nosso objetivo no momento. Há também uma seção de compra de ingressos, que ainda não está funcional, mas todas as informações de categoria, organização, idioma do evento, descrição, contato e telefone estão disponíveis. Além disso, há uma seção de eventos relacionados, que mostra eventos com descrições semelhantes ou do mesmo organizador.
Navegando por categorias e funcionalidades de busca
Podemos navegar por categorias, como shows, arte, teatro e fotografia. O site oferece diversas funcionalidades que já estão operacionais, inclusive o campo de busca. Ao pesquisar por "teatro" e pressionar "Enter", não encontramos resultados porque não há eventos com "teatro" no nome, descrição ou localização. No entanto, ao acessar a página de categorias e clicar em "teatro", um filtro específico por categoria é aplicado, mostrando eventos como Hamlet, Quebra-Nozes e festival de dança urbana, que incluem teatro na descrição.
Nosso projeto funciona totalmente com informações reais, exceto pela localização e datas, que são fictícias para fins de estudo. Agora que conhecemos a estrutura do Culturama, vimos como ele funciona internamente, o código e sua organização, é hora de iniciar um novo projeto utilizando o Next.js. Vamos explorar as diferenças e nuances entre os projetos, utilizando o React Vanilla, que chamaremos de Vanilla, apenas com o Vite para build.
Iniciando a migração para Next.js
Vamos desenvolver um novo projeto migrando o código existente para o framework Next.js com React. Vamos iniciar o desenvolvimento desse novo projeto baseado no que já temos com o React. Vamos juntos, estudantes!