Desenvolvedores
src_
components_
context_
CoursesContext.jsx

📖 Descrição do Arquivo

O arquivo CoursesContext.jsx gerencia o estado relacionado aos cursos da aplicação. Ele é um contexto React que facilita o acesso e a manipulação das informações de cursos em qualquer parte da árvore de componentes. Além disso, ele trata o carregamento e possíveis erros durante a recuperação dos dados da API.

🔧 Configuração do Componente

'use client'
import { createContext, useContext, useState, useEffect } from 'react'
 
const CoursesContext = createContext()
 
export const useCourses = () => {
  return useContext(CoursesContext)
}
 
export const CoursesProvider = ({ children }) => {
  const [courses, setCourses] = useState([]) // Lista de cursos
  const [loading, setLoading] = useState(true) // Estado de carregamento
  const [error, setError] = useState(null) // Estado para erro
 
  useEffect(() => {
    const fetchCourses = async () => { // Função para buscar os cursos
      try {
        const apiUrl = process.env.NEXT_PUBLIC_SERVER_URL
        const response = await fetch(`${apiUrl}/api/cursos`) // Requisição para API
        if (!response.ok) {
          throw new Error(`Erro: ${response.statusText}`) // Lança erro em caso de falha
        }
        const data = await response.json()
        setCourses(data.docs || []) // Atualiza lista de cursos
      } catch (err) {
        setError(err.message) // Atualiza o erro, caso haja
      } finally {
        setLoading(false) // Atualiza o estado de carregamento
      }
    }
 
    fetchCourses() // Chama a função para carregar os cursos
  }, []) // Efeito colateral executado uma vez ao montar o componente
 
  return (
    <CoursesContext.Provider value={{ courses, loading, error }}>
      {children} {/* Renderiza os filhos com o contexto de cursos */}
    </CoursesContext.Provider>
  )
}

📦 Componentes e Funções

1. CoursesContext

  • Criado usando createContext() para armazenar e fornecer o estado dos cursos aos componentes filhos.

2. useCourses()

  • Um hook personalizado que permite acessar facilmente o contexto de cursos em qualquer componente, utilizando useContext(CoursesContext).

3. CoursesProvider

  • Um componente que encapsula a lógica para carregar os cursos da API e fornece esse estado através do CoursesContext.Provider.

⚙️ Funcionamento

Estado

O CoursesProvider mantém três estados principais:

  • courses: Lista de cursos carregados da API.
  • loading: Booleano que indica se os dados estão sendo carregados.
  • error: Mensagem de erro, caso a recuperação dos cursos falhe.

Efeito Colateral

O useEffect executa uma requisição para a API e atualiza o estado com os dados obtidos. Se houver falha, o erro será capturado e mostrado.

Provedor de Contexto

O CoursesProvider fornece os estados de cursos, carregamento e erro para todos os componentes filhos dentro do componente que o envolve.

🎯 Considerações Finais

Este contexto permite gerenciar o estado de forma eficiente, tornando fácil para os componentes acessarem os dados dos cursos sem duplicar lógica. Ele melhora a escalabilidade e manutenção da aplicação.

🧑‍💻 Código Completo:

'use client'
import { createContext, useContext, useState, useEffect } from 'react'
 
const CoursesContext = createContext()
 
export const useCourses = () => {
  return useContext(CoursesContext)
}
 
export const CoursesProvider = ({ children }) => {
  const [courses, setCourses] = useState([]) // Lista de cursos
  const [loading, setLoading] = useState(true) // Estado de carregamento
  const [error, setError] = useState(null) // Estado para erro
 
  useEffect(() => {
    const fetchCourses = async () => { // Função para buscar os cursos
      try {
        const apiUrl = process.env.NEXT_PUBLIC_SERVER_URL
        const response = await fetch(`${apiUrl}/api/cursos`) // Requisição para API
        if (!response.ok) {
          throw new Error(`Erro: ${response.statusText}`) // Lança erro em caso de falha
        }
        const data = await response.json()
        setCourses(data.docs || []) // Atualiza lista de cursos
      } catch (err) {
        setError(err.message) // Atualiza o erro, caso haja
      } finally {
        setLoading(false) // Atualiza o estado de carregamento
      }
    }
 
    fetchCourses() // Chama a função para carregar os cursos
  }, []) // Efeito colateral executado uma vez ao montar o componente
 
  return (
    <CoursesContext.Provider value={{ courses, loading, error }}>
      {children} {/* Renderiza os filhos com o contexto de cursos */}
    </CoursesContext.Provider>
  )
}