Explicação do código 🧑💻
O código que vamos analisar faz parte de um layout para uma página de curso. O componente SidebarLayout organiza a navegação lateral e a exibição de breadcrumbs. Vamos explorar o que cada parte faz, passo a passo. 🚀
Importações 🔥
'use client'
import { AppSidebar } from '@/components/app-sidebar'
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from '@/components/ui/breadcrumb'
import { Separator } from '@/components/ui/separator'
import { SidebarInset, SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar'Aqui, o código importa componentes essenciais para a criação do layout.
AppSidebar: O componente que renderiza a barra lateral.- Os componentes do breadcrumb (navegação hierárquica) que ajudam a mostrar a sequência de páginas (Curso → Módulo → Aula).
- O
Separatorque adiciona uma linha para separar visualmente elementos. SidebarInset,SidebarProvidereSidebarTriggersão usados para configurar a lógica da barra lateral, como sua visibilidade e o comportamento de abertura.
Definição do componente SidebarLayout 🎨
export default function SidebarLayout({
children,
course,
module,
lesson,
moduleIndex,
lessonIndex,
}) {Aqui, o componente SidebarLayout é definido. Ele recebe as seguintes propriedades:
children: Conteúdo dinâmico que será exibido dentro do layout.course: Informações sobre o curso, como nome e slug.module: Informações sobre o módulo do curso.lesson: Dados sobre a aula atual.moduleIndex: O índice (número) do módulo.lessonIndex: O índice (número) da aula.
Essas propriedades permitem que o layout seja dinâmico, exibindo diferentes conteúdos conforme a estrutura do curso, módulo e aula.
Estrutura do layout 🏗️
return (
<SidebarProvider>
<AppSidebar />
<SidebarInset>
<header className="flex h-16 shrink-0 items-center gap-2">
<div className="flex items-center gap-2 px-4">
<SidebarTrigger className="-ml-1" />
<Separator orientation="vertical" className="mr-2 h-4" />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem className="hidden md:block">
<BreadcrumbLink href={`/cursos/${course.slug}`}>
{course.nomeCurso}
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator className="hidden md:block" />
<BreadcrumbItem className="hidden md:block">
<BreadcrumbLink href={`/cursos/${course.slug}/${moduleIndex}`}>
{moduleIndex}. {module.modulo.nomeModulo}
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator className="hidden md:block" />
<BreadcrumbItem>
<BreadcrumbPage>
{lessonIndex}. {lesson.nomeAula}
</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</div>
</header>
<div className="flex flex-1 flex-col gap-4 p-4 pt-0">{children}</div>
</SidebarInset>
</SidebarProvider>
)
}O JSX abaixo descreve a estrutura do layout:
SidebarProvider: Contexto que fornece a funcionalidade da barra lateral para seus componentes filhos.AppSidebar: Barra lateral com navegação.SidebarInset: Área onde o conteúdo será inserido.header: A parte superior da página que inclui a navegação e breadcrumbs.SidebarTrigger: Botão para abrir ou fechar a barra lateral.Separator: Linha vertical que separa o botão da navegação.Breadcrumb: Navegação hierárquica que mostra a posição atual no curso.- Cada
BreadcrumbItemrepresenta um nível da navegação. BreadcrumbPageexibe o nome da aula atual.
Finalmente, o children é renderizado dentro de um contêiner flexível para acomodar o conteúdo dinâmico da página.
Código Completo 📃
'use client'
import { AppSidebar } from '@/components/app-sidebar'
import {
Breadcrumb,
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
} from '@/components/ui/breadcrumb'
import { Separator } from '@/components/ui/separator'
import { SidebarInset, SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar'
export default function SidebarLayout({
children,
course,
module,
lesson,
moduleIndex,
lessonIndex,
}) {
return (
<SidebarProvider>
<AppSidebar />
<SidebarInset>
<header className="flex h-16 shrink-0 items-center gap-2">
<div className="flex items-center gap-2 px-4">
<SidebarTrigger className="-ml-1" />
<Separator orientation="vertical" className="mr-2 h-4" />
<Breadcrumb>
<BreadcrumbList>
<BreadcrumbItem className="hidden md:block">
<BreadcrumbLink href={`/cursos/${course.slug}`}>
{course.nomeCurso}
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator className="hidden md:block" />
<BreadcrumbItem className="hidden md:block">
<BreadcrumbLink href={`/cursos/${course.slug}/${moduleIndex}`}>
{moduleIndex}. {module.modulo.nomeModulo}
</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator className="hidden md:block" />
<BreadcrumbItem>
<BreadcrumbPage>
{lessonIndex}. {lesson.nomeAula}
</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumb>
</div>
</header>
<div className="flex flex-1 flex-col gap-4 p-4 pt-0">{children}</div>
</SidebarInset>
</SidebarProvider>
)
}Agora, o código está estruturado com uma explicação detalhada e fácil de seguir. As funcionalidades de navegação e layout estão bem integradas, com o uso de componentes reutilizáveis, tornando o código modular e organizado. 😎