gohorsejobs/frontend/src/components/navbar.tsx
NANDO9322 9a1fca0c36 feat: (TASK: Mudança na forma de operar os usuarios)
refatoração fluxo de vagas e correção login automático
- Frontend:
  - Implementa componente JobFormBuilder para perguntas dinâmicas
  - Atualiza página /post-job com fluxo de 3 etapas e integração do builder
  - Corrige payload de registro (auth.ts) enviando campo password corretamente
  - Implementa auto-login após cadastro da empresa (redirecionamento e token)
  - Remove páginas obsoletas de registro de candidato
- Backend:
  - Atualiza CreateCompanyUseCase para retornar token JWT
  - Ajusta JobService para persistência correta de campos JSON (Questions, Benefits)
  - Atualiza DTOs de Job e Company para refletir novas estruturas
  - Adiciona migração (033) para novas colunas de refatoração
  - Ajustes nos repositórios para suporte aos novos modelos
Ref: #refactor-jobs #fix-auth
2026-01-17 17:07:35 -03:00

133 lines
5.1 KiB
TypeScript

"use client"
import { useState } from "react"
import Link from "next/link"
import Image from "next/image"
import { Button } from "@/components/ui/button"
import { Sheet, SheetContent, SheetTrigger } from "@/components/ui/sheet"
import { Menu, User, LogIn } from "lucide-react"
import { getCurrentUser } from "@/lib/auth"
import { useTranslation } from "@/lib/i18n"
import { LanguageSwitcher } from "@/components/language-switcher"
export function Navbar() {
const [isOpen, setIsOpen] = useState(false)
const user = getCurrentUser()
const { t } = useTranslation()
const navigationItems = [
{ href: "/jobs", label: t('nav.jobs') },
{ href: "/about", label: t('nav.about') },
{ href: "/contact", label: t('nav.contact') },
]
return (
<nav className="border-b border-border bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60 sticky top-0 z-50">
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
<div className="flex h-16 items-center justify-between">
{/* Logo */}
<Link href="/" className="flex items-center gap-3 hover:opacity-80 transition-opacity">
<Image src="/logohorse.png" alt="GoHorse Jobs" width={48} height={48} />
<span className="text-xl font-bold tracking-tight">GoHorse Jobs</span>
</Link>
{/* Desktop Navigation */}
<div className="hidden md:flex items-center gap-6">
{navigationItems.map((item) => (
<Link
key={item.href}
href={item.href}
className="text-sm text-muted-foreground hover:text-foreground transition-colors relative group"
>
{item.label}
<span className="absolute -bottom-1 left-0 w-0 h-0.5 bg-primary transition-all group-hover:w-full" />
</Link>
))}
</div>
{/* Desktop Auth Buttons + Language Switcher */}
<div className="hidden md:flex items-center gap-4">
<LanguageSwitcher />
{user ? (
<Link href="/dashboard">
<Button variant="ghost" className="gap-2">
<User className="w-4 h-4" />
Dashboard
</Button>
</Link>
) : (
<>
<Link href="/login">
<Button variant="ghost" className="gap-2">
<LogIn className="w-4 h-4" />
{t('nav.login')}
</Button>
</Link>
<Link href="/register">
<Button className="gap-2">
<User className="w-4 h-4" />
{t('nav.register')}
</Button>
</Link>
</>
)}
</div>
{/* Mobile Menu */}
<Sheet open={isOpen} onOpenChange={setIsOpen}>
<SheetTrigger asChild className="md:hidden">
<Button variant="ghost" size="icon">
<Menu className="w-5 h-5" />
</Button>
</SheetTrigger>
<SheetContent side="right" className="w-80">
<div className="flex flex-col gap-4 mt-6">
<div className="flex items-center gap-2 pb-4 border-b justify-center">
<Image src="/logohorse.png" alt="GoHorse Jobs" width={48} height={48} />
<span className="text-lg font-bold">GoHorse Jobs</span>
</div>
{navigationItems.map((item) => (
<Link
key={item.href}
href={item.href}
className="text-sm text-muted-foreground hover:text-foreground transition-colors p-2 rounded-lg hover:bg-muted"
onClick={() => setIsOpen(false)}
>
{item.label}
</Link>
))}
<div className="flex flex-col gap-2 mt-4 pt-4 border-t">
{user ? (
<Link href="/dashboard" onClick={() => setIsOpen(false)}>
<Button variant="ghost" className="w-full justify-start gap-2">
<User className="w-4 h-4" />
Dashboard
</Button>
</Link>
) : (
<>
<Link href="/login" onClick={() => setIsOpen(false)}>
<Button variant="ghost" className="w-full justify-start gap-2">
<LogIn className="w-4 h-4" />
{t('nav.login')}
</Button>
</Link>
<Link href="/register" onClick={() => setIsOpen(false)}>
<Button className="w-full justify-start gap-2">
<User className="w-4 h-4" />
{t('nav.register')}
</Button>
</Link>
</>
)}
</div>
</div>
</SheetContent>
</Sheet>
</div>
</div>
</nav>
)
}