Ctrl K
ComunidadGuías…

components/NavHeader.tsx

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
'use client';

import Link from 'next/link';
import NavThemeToggle from './NavThemeToggle';
import NavSearch from './NavSearch';
import LocaleSwitcher from './LocaleSwitcher';
import UserAvatar from './UserAvatar';
import {
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuLabel,
  DropdownMenuSeparator,
  DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu';
import {
  UserIcon,
  ArrowRightStartOnRectangleIcon,
  ShieldCheckIcon,
} from '@heroicons/react/24/outline';
import { signout } from '@/app/(authenticated)/lib/actions';
import { useTranslations } from 'next-intl';

import { User } from '@/prisma/generated/client';
import type { AvailableUpdate } from '@/app/(authenticated)/lib/version';
import UpdateAvailableMenuItem, { UpdateBadge } from './UpdateAvailableMenuItem';

interface NavHeaderProps {
  user: User;
  update?: AvailableUpdate | null;
}

export default function NavHeader({ user, update }: NavHeaderProps) {
  const t = useTranslations('Navigation');
  const tRole = useTranslations('Roles');

  if (!user) {
    return null;
  }

  return (
    <header className="hidden md:flex flex-shrink-0 items-center justify-between h-20 px-6 border-b border-border bg-background">
      <div className="flex-1 max-w-md">
        <NavSearch />
      </div>
      <div className="flex items-center gap-2">
        <LocaleSwitcher />
        <NavThemeToggle />
        <DropdownMenu>
          <DropdownMenuTrigger asChild>
            <button className="relative flex items-center gap-3 px-3 py-2 rounded-xl hover:bg-muted transition-colors outline-none">
              <UserAvatar
                name={user.name}
                email={user.email}
                userId={user.id}
                profileImage={user.profileImage}
                className="h-8 w-8"
                fallbackClassName="bg-primary text-xs font-bold text-primary-foreground"
              />
              <div className="flex flex-col text-left">
                <span className="text-[16px] font-[500] text-foreground">
                  {user?.name}
                </span>
                <span className="text-[12px] font-[500] uppercase text-muted-foreground/70">
                  {tRole(user.role)}
                </span>
              </div>
              {update && <UpdateBadge />}
            </button>
          </DropdownMenuTrigger>
          <DropdownMenuContent align="end" className="w-56">
            <DropdownMenuLabel>{t('myAccount')}</DropdownMenuLabel>
            <DropdownMenuSeparator />
            <DropdownMenuItem asChild>
              <Link
                href={`/profile/${user?.id}`}
                className="flex items-center cursor-pointer"
              >
                <UserIcon className="mr-2 h-4 w-4" />
                <span>{t('profile')}</span>
              </Link>
            </DropdownMenuItem>
            {user?.role === 'admin' && (
              <DropdownMenuItem asChild>
                <Link
                  href="/admin"
                  className="flex items-center cursor-pointer"
                >
                  <ShieldCheckIcon className="mr-2 h-4 w-4" />
                  <span>{t('administration')}</span>
                </Link>
              </DropdownMenuItem>
            )}
            {update && (
              <>
                <DropdownMenuSeparator />
                <UpdateAvailableMenuItem update={update} />
              </>
            )}
            <DropdownMenuSeparator />
            <DropdownMenuItem
              onClick={() => signout()}
              className="flex items-center text-destructive focus:text-destructive cursor-pointer"
            >
              <ArrowRightStartOnRectangleIcon className="mr-2 h-4 w-4" />
              <span>{t('logout')}</span>
            </DropdownMenuItem>
          </DropdownMenuContent>
        </DropdownMenu>
      </div>
    </header>
  );
}