From 966740fb941bafb03944db3a59a79c2b6c9a053a Mon Sep 17 00:00:00 2001 From: Ualerson Date: Sun, 5 Oct 2025 10:19:39 -0300 Subject: [PATCH] Envolver rotas autenticadas com o Layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit O que mudou: em Front-End/git-genius-commit/src/App.tsx, o Layout foi importado e as rotas autenticadas passaram a ficar dentro de ..., envolvendo as rotas /home e /. Por quê: aplicar o Layout de forma consistente às rotas protegidas, garantindo a barra lateral, header e demais elementos de UI padronizados. Impacto: não altera o fluxo de autenticação; apenas centraliza o layout para as rotas protegidas. Observação: revise se o uso de '/' dentro do Layout continua como esperado para usuários autenticados. --- Front-End/git-genius-commit/src/App.tsx | 13 +- .../src/components/app-sidebar.tsx | 181 ++++++++++++++++++ .../src/components/layout.tsx | 36 ++++ 3 files changed, 225 insertions(+), 5 deletions(-) create mode 100644 Front-End/git-genius-commit/src/components/app-sidebar.tsx create mode 100644 Front-End/git-genius-commit/src/components/layout.tsx diff --git a/Front-End/git-genius-commit/src/App.tsx b/Front-End/git-genius-commit/src/App.tsx index d8edb38a..3b31c9e9 100644 --- a/Front-End/git-genius-commit/src/App.tsx +++ b/Front-End/git-genius-commit/src/App.tsx @@ -9,6 +9,7 @@ import Index from "./pages/Index"; import { AuthProvider, useAuth } from "./contexts/AuthContext"; import ProtectedRoute from "./components/ProtectedRoute"; +import Layout from "./components/layout"; const queryClient = new QueryClient(); @@ -18,11 +19,13 @@ const AppRoutes = () => { return ( {isAuthenticated ? ( - - } /> - } /> - {/* } /> */} - + + + } /> + } /> + {/* } /> */} + + ) : ( } /> diff --git a/Front-End/git-genius-commit/src/components/app-sidebar.tsx b/Front-End/git-genius-commit/src/components/app-sidebar.tsx new file mode 100644 index 00000000..832e60d5 --- /dev/null +++ b/Front-End/git-genius-commit/src/components/app-sidebar.tsx @@ -0,0 +1,181 @@ +import { + Activity, + Bot, + GitPullRequest, + GitBranch, + ScrollText, + Settings, + Zap, + User, + CreditCard, + FileText +} from "lucide-react" +import { NavLink, useLocation } from "react-router-dom" + +import { + Sidebar, + SidebarContent, + SidebarGroup, + SidebarGroupContent, + SidebarGroupLabel, + SidebarMenu, + SidebarMenuButton, + SidebarMenuItem, + SidebarHeader, + useSidebar, +} from "@/components/ui/sidebar" + +import { LogOut } from "lucide-react" +import { useNavigate } from "react-router-dom" +import { useAuth } from '@/contexts/AuthContext'; + +const navigationItems = [ + { + title: "Dashboard", + url: "/home", + icon: Activity, + description: "Visão geral do sistema" + }, + { + title: "Pull Requests", + url: "/prs", + icon: GitPullRequest, + description: "Monitoramento de PRs" + }, + { + title: "Commits", + url: "/commits", + icon: GitPullRequest, + description: "Monitoramento de Commits" + }, + + { + title: "Workflows", + url: "/workflows", + icon: GitBranch, + description: "Git Workflows de Processamento" + }, + { + title: "Logs", + url: "/logs", + icon: ScrollText, + description: "Logs do sistema" + }, + { + title: "Controles", + url: "/controls", + icon: Zap, + description: "Ações e controles" + }, + { + title: "Configurações", + url: "/settings", + icon: Settings, + description: "Configurações do sistema" + }, + { + title: "Conta", + url: "/myaccount", + icon: User, + description: "Configurações da conta" + }, + { + title: "Billing", + url: "/billing", + icon: CreditCard, + description: "Configurações de faturamento" + }, + { + title: "Invoices", + url: "/billing/invoices", + icon: FileText, + description: "Relatório de Faturas" + }, +] + +// Dentro do componente AppSidebar +export function AppSidebar() { + const { state } = useSidebar() + const location = useLocation() + const currentPath = location.pathname + const isCollapsed = state === "collapsed" + const navigate = useNavigate() + const { logout } = useAuth(); + + const isActive = (path: string) => { + if (path === "/") return currentPath === "/" + return currentPath.startsWith(path) + } + + const getNavClassName = (path: string) => { + const baseClasses = "w-full justify-start transition-all duration-200" + return isActive(path) + ? `${baseClasses} bg-gradient-primary text-primary-foreground shadow-glow` + : `${baseClasses} text-sidebar-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground` + } + + const handleLogout = () => { + logout(); + // navigate("/") + window.location.reload() + + } + + return ( + + +
+ + {!isCollapsed && ( +
+

PR AI

+

Equipe de DevOps

+
+ )} +
+
+ + + + + Navegação + + + + {navigationItems.map((item) => ( + + + + + {!isCollapsed && ( +
+ {item.title} + {item.description} +
+ )} +
+
+
+ ))} + + {/* Botão de Logout */} + + +
+ + {!isCollapsed && Logout} +
+
+
+ +
+
+
+
+
+ ) +} diff --git a/Front-End/git-genius-commit/src/components/layout.tsx b/Front-End/git-genius-commit/src/components/layout.tsx new file mode 100644 index 00000000..1f2e2e77 --- /dev/null +++ b/Front-End/git-genius-commit/src/components/layout.tsx @@ -0,0 +1,36 @@ +import { ReactNode } from "react" +import { SidebarProvider, SidebarTrigger, SidebarInset } from "@/components/ui/sidebar" +import { AppSidebar } from "@/components/app-sidebar" + +interface LayoutProps { + children: ReactNode +} + +const Layout = ({ children }: LayoutProps) => { + return ( + +
+ + + {/* Header with sidebar trigger */} +
+ +
+
+
+
+ Sistema Online +
+
+
+ {/* Main content */} +
+ {children} +
+
+
+
+ ) +} + +export default Layout \ No newline at end of file