'use client'; import { useState, useCallback } from 'react'; import Image from 'next/image'; import { ChatDropdownMenu, type DropdownMenuItem } from './ChatDropdownMenu'; interface ChatHeaderProps { name: string; role: string; lastSeen: string; avatar: string; isOnline?: boolean; pronouns?: string; expertise?: string[]; isTyping?: boolean; typingText?: string; isMuted?: boolean; isStarred?: boolean; onClearChat?: () => void; onDeleteConversation?: () => void; onReportUser?: () => void; onToggleMute?: (muted: boolean) => void; onToggleStar?: (starred: boolean) => void; } export function ChatHeader({ name, role, lastSeen, avatar, isOnline = false, pronouns, expertise = [], isTyping = false, typingText, isMuted = false, isStarred = false, onClearChat, onDeleteConversation, onReportUser, onToggleMute, onToggleStar, }: ChatHeaderProps) { const [isMenuOpen, setIsMenuOpen] = useState(false); const [avatarLoaded, setAvatarLoaded] = useState(false); const placeholder = '/assets/icons/user-placeholder-icon.svg'; const isPlaceholderAvatar = !avatar || avatar === placeholder; const menuItems: DropdownMenuItem[] = [ { label: 'Clear Chat', onClick: () => onClearChat?.(), }, { label: isMuted ? 'Unmute Notifications' : 'Mute Notifications', onClick: () => onToggleMute?.(!isMuted), }, { label: 'Report User', onClick: () => onReportUser?.(), }, { label: 'Delete Conversation', onClick: () => onDeleteConversation?.(), danger: true, }, ]; const handleToggleMenu = useCallback(() => { setIsMenuOpen((prev) => !prev); }, []); const handleCloseMenu = useCallback(() => { setIsMenuOpen(false); }, []); return (
{/* Top row - Name, status, actions */}

{name}

{role} {isTyping ? ( {typingText} ) : ( lastSeen )}
{/* Mute indicator */} {isMuted && (
Muted
)}
{/* User profile row */}
{/* Avatar */}
{(!avatar || !avatarLoaded || isPlaceholderAvatar) && (
)} {avatar && !isPlaceholderAvatar && ( { if (el?.complete && el.naturalWidth > 0) setAvatarLoaded(true); }} src={avatar} alt={name} className={`absolute inset-0 w-full h-full object-cover transition-opacity duration-300 ${avatarLoaded ? 'opacity-100' : 'opacity-0'}`} onLoad={() => setAvatarLoaded(true)} /> )}
{isOnline && (
)}
{/* User info */}
{name} Verified {pronouns && ( ({pronouns}) )}
{/* Expertise tags */} {expertise.length > 0 && (
{expertise.map((tag, index) => ( {tag} {index < expertise.length - 1 && ( | )} ))}
)}
); }