import React from 'react' interface PersonSnapshot { name: string photo?: string | null role?: string } interface CreatorAvatarProps { creatorId?: string crewSnapshotsById?: Record fallbackName?: string size?: number } const colors = [ '#2563eb', // blue '#059669', // emerald '#d97706', // amber '#dc2626', // red '#7c3aed', // violet '#db2777', // pink '#0891b2', // cyan '#4f46e5', // indigo '#0f766e', // teal '#9333ea', // purple ] function getAvatarColor(name: string): string { let hash = 0 for (let i = 0; i < name.length; i++) { hash = name.charCodeAt(i) + ((hash << 5) - hash) } const index = Math.abs(hash) % colors.length return colors[index] } export default function CreatorAvatar({ creatorId, crewSnapshotsById, fallbackName, size = 28 }: CreatorAvatarProps) { let name = '' let photo: string | null = null let role = '' if (creatorId && crewSnapshotsById) { let snap: PersonSnapshot | undefined = crewSnapshotsById[creatorId] // Fallback: If not found directly by key, search by role or name or active user if (!snap) { if (creatorId === 'skipper') { snap = Object.values(crewSnapshotsById).find((s) => s.role === 'skipper') } else { // Try to match name case-insensitively snap = Object.values(crewSnapshotsById).find( (s) => (s.name || '').trim().toLowerCase() === creatorId.trim().toLowerCase() ) // Try to match active username/userid to the skipper snapshot if (!snap) { const activeUsername = localStorage.getItem('active_username') const activeUserId = localStorage.getItem('active_userid') if ( (activeUsername && creatorId.toLowerCase() === activeUsername.toLowerCase()) || (activeUserId && creatorId === activeUserId) ) { snap = Object.values(crewSnapshotsById).find((s) => s.role === 'skipper') } } } } if (snap) { name = snap.name || '' photo = snap.photo || null role = snap.role || '' } } // Fallback to active username if owner or no crew pool matches if (!name) { if (creatorId === 'skipper') { name = fallbackName || localStorage.getItem('active_username') || 'Skipper' role = 'skipper' } else if (fallbackName) { name = fallbackName } else if (creatorId) { // If creatorId is a username itself (fallback from LiveLogView) name = creatorId } else { name = '?' } } const initial = name ? name.trim().split(/\s+/)[0]?.charAt(0).toUpperCase() || '?' : '?' const bgColor = name === '?' ? '#64748b' : getAvatarColor(name) const style: React.CSSProperties = { width: `${size}px`, height: `${size}px`, borderRadius: '50%', display: 'inline-flex', alignItems: 'center', justifyContent: 'center', fontSize: `${Math.round(size * 0.45)}px`, fontWeight: 'bold', color: '#ffffff', backgroundColor: bgColor, flexShrink: 0, verticalAlign: 'middle', overflow: 'hidden', border: '1px solid rgba(255, 255, 255, 0.15)', boxSizing: 'border-box' } const roleText = role ? (role === 'skipper' ? 'Skipper' : 'Crew') : '' const tooltip = name + (roleText ? ` (${roleText})` : '') if (photo) { return ( {name} ) } return (
{initial}
) }