| "use client"; |
|
|
| import { useAuth } from "@/composables/useAuth"; |
| import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@radix-ui/react-dropdown-menu"; |
| import { LogOut } from "lucide-react"; |
|
|
| function getInitials(name: string) { |
| return name |
| .split(" ") |
| .map((n) => n[0]) |
| .join("") |
| .toUpperCase() |
| .slice(0, 2) |
| } |
|
|
| export function Header() { |
| const { user, logout, isLoadingUser } = useAuth(); |
|
|
| const initials = user ? getInitials(user.full_name || user.username) : "?"; |
| const displayName = user?.full_name || user?.username || "Loading..."; |
| const displayRole = user?.role || ""; |
|
|
| const handleLogout = async () => { |
| try { |
| await logout(); |
| } catch (error) { |
| console.error("Logout failed:", error); |
| } |
| }; |
|
|
| return ( |
| <header className="h-16 bg-white border-b border-gray-200 px-8 flex items-center justify-between"> |
| <div></div> |
| <DropdownMenu> |
| <DropdownMenuTrigger asChild> |
| <div className="flex items-center gap-2 mt-0 cursor-pointer"> |
| <div className="w-8 h-8 bg-gradient-to-br from-pink-300 to-orange-300 rounded-full flex items-center justify-center text-white text-sm font-semibold"> |
| {initials} |
| </div> |
| <div className="flex items-start flex-col"> |
| <span className="text-sm">{displayName}</span> |
| <span className="text-xs text-gray-500">{displayRole}</span> |
| </div> |
| </div> |
| </DropdownMenuTrigger> |
| <DropdownMenuContent align="end" className="bg-white border border-gray-200 rounded-md shadow-lg"> |
| <DropdownMenuItem |
| disabled={isLoadingUser} |
| onClick={handleLogout} |
| className="px-4 py-2 text-sm text-red-600 hover:bg-red-50 flex items-center gap-2 cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed" |
| > |
| <LogOut className="w-4 h-4" /> |
| Logout |
| </DropdownMenuItem> |
| </DropdownMenuContent> |
| </DropdownMenu> |
| </header> |
| ); |
| } |