mirror of
https://github.com/ruvnet/RuVector.git
synced 2026-05-29 19:33:34 +00:00
Major additions: - Complete Next.js studio application with 1600+ components - Docker support (Dockerfile.combined, docker-compose.yml) - GCP deployment documentation and benchmarks - SQL benchmark scripts for performance testing - Sentry integration for monitoring - Comprehensive test suite and mocks Studio features: - Dashboard and admin interfaces - Data visualization components - Authentication and user management - API integration with RuVector backend - Static data and public assets 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
35 lines
903 B
TypeScript
35 lines
903 B
TypeScript
import Image from 'next/image'
|
|
import { ReactNode, useState } from 'react'
|
|
|
|
import { User } from 'icons'
|
|
import { cn } from 'ui'
|
|
|
|
interface ProfileImageProps {
|
|
alt?: string
|
|
src?: string
|
|
placeholder?: ReactNode
|
|
className?: string
|
|
}
|
|
|
|
export const ProfileImage = ({ alt, src, placeholder, className }: ProfileImageProps) => {
|
|
const [hasInvalidImg, setHasInvalidImg] = useState(false)
|
|
|
|
return !!src && !hasInvalidImg ? (
|
|
<Image
|
|
alt={alt ?? ''}
|
|
src={src}
|
|
width="24"
|
|
height="24"
|
|
className={cn('aspect-square bg-foreground rounded-full object-cover', className)}
|
|
onError={() => setHasInvalidImg(true)}
|
|
/>
|
|
) : (
|
|
placeholder ?? (
|
|
<figure
|
|
className={cn('bg-foreground rounded-full flex items-center justify-center', className)}
|
|
>
|
|
<User size={18} strokeWidth={1.5} className="text-background" />
|
|
</figure>
|
|
)
|
|
)
|
|
}
|