Explicação do Código
1. Importação do Contexto de Cursos 📚
import { useCourses } from '@/components/context/CoursesContext'
Aqui, estamos importando o hook useCourses
do contexto de cursos. Este hook oferece funções e dados relacionados ao contexto global dos cursos no projeto, o que facilita o acesso aos dados do curso em diferentes partes da aplicação.
2. Definição do Hook useCourseDetails
🎯
export const useCourseDetails = ({ slug, moduleIndex, lessonIndex }) => {
Definimos o hook useCourseDetails
, que recebe um objeto com as propriedades slug
, moduleIndex
e lessonIndex
. Essas propriedades são usadas para buscar os detalhes de um curso específico, módulo e lição. O hook pode ser utilizado em qualquer componente que precise desses detalhes.
3. Desestruturação do Hook useCourses
🔄
const { getCourseDetails, loading, error } = useCourses()
Dentro do hook useCourseDetails
, estamos desestruturando o retorno do hook useCourses
:
getCourseDetails
: Função que obtém os detalhes do curso com base noslug
, índice do módulo e índice da lição.loading
: Indicador booleano que mostra se os dados estão sendo carregados.error
: Indicador que sinaliza se ocorreu algum erro na busca dos dados.
4. Verificação de Carregamento ou Erro ⚠️
if (loading || error) {
return { loading, error, course: null, module: null, lesson: null }
}
Antes de continuar, verificamos se o estado está loading
(carregando) ou se ocorreu algum error
. Se algum desses estados for verdadeiro, o hook retorna:
loading
: O estado de carregamento.error
: O erro ocorrido.course
,module
,lesson
: Como não há dados disponíveis, são retornados comonull
.
5. Ajuste dos Índices do Módulo e da Lição 🔢
const adjustedModuleIndex = parseInt(moduleIndex) - 1
const adjustedLessonIndex = parseInt(lessonIndex) - 1
Aqui, ajustamos os índices de módulo e lição. Os índices no moduleIndex
e lessonIndex
geralmente são passados como strings e começam do 1. No entanto, os arrays em JavaScript são baseados em índice 0, então subtraímos 1 de cada índice para garantir que a busca pelos módulos e lições seja feita corretamente.
6. Obtenção dos Detalhes do Curso, Módulo e Lição 📑
const { course, courseModule, lesson } = getCourseDetails({
slug,
moduleIndex: adjustedModuleIndex,
lessonIndex: adjustedLessonIndex,
})
Agora, chamamos a função getCourseDetails
, passando os parâmetros ajustados moduleIndex
e lessonIndex
junto com o slug
. A função retorna os detalhes do curso, módulo e lição, que são desestruturados e armazenados nas variáveis course
, courseModule
e lesson
.
7. Retorno do Hook 📬
return { loading, error, course, module: courseModule, lesson }
Finalmente, o hook retorna um objeto contendo:
loading
: O estado de carregamento.error
: O erro (se houver).course
: Os detalhes do curso.module
: Os detalhes do módulo, obtidos decourseModule
.lesson
: Os detalhes da lição.
8. Exportação do Hook 🔄
export { useCourseDetails }
Por fim, o hook useCourseDetails
é exportado para que possa ser utilizado em outros componentes da aplicação.
Código Completo 📜
'use client'
import { useCourses } from '@/components/context/CoursesContext'
export const useCourseDetails = ({ slug, moduleIndex, lessonIndex }) => {
const { getCourseDetails, loading, error } = useCourses()
if (loading || error) {
return { loading, error, course: null, module: null, lesson: null }
}
const adjustedModuleIndex = parseInt(moduleIndex) - 1
const adjustedLessonIndex = parseInt(lessonIndex) - 1
const { course, courseModule, lesson } = getCourseDetails({
slug,
moduleIndex: adjustedModuleIndex,
lessonIndex: adjustedLessonIndex,
})
return { loading, error, course, module: courseModule, lesson }
}