79 lines
2.2 KiB
TypeScript
79 lines
2.2 KiB
TypeScript
'use client';
|
|
|
|
import React from 'react';
|
|
import Image from 'next/image';
|
|
import Link from 'next/link';
|
|
import type { DriverViewModel } from '@/lib/view-models/DriverViewModel';
|
|
import DriverRating from '@/components/profile/DriverRatingPill';
|
|
import PlaceholderImage from '@/ui/PlaceholderImage';
|
|
|
|
export interface DriverSummaryPillProps {
|
|
driver: DriverViewModel;
|
|
rating: number | null;
|
|
rank: number | null;
|
|
avatarSrc?: string | null;
|
|
onClick?: () => void;
|
|
href?: string;
|
|
}
|
|
|
|
export default function DriverSummaryPill(props: DriverSummaryPillProps) {
|
|
const { driver, rating, rank, avatarSrc, onClick, href } = props;
|
|
|
|
const resolvedAvatar = avatarSrc;
|
|
|
|
const content = (
|
|
<>
|
|
<div className="w-8 h-8 rounded-full overflow-hidden bg-charcoal-outline flex items-center justify-center border border-charcoal-outline/80">
|
|
{resolvedAvatar ? (
|
|
<Image
|
|
src={resolvedAvatar}
|
|
alt={driver.name}
|
|
width={32}
|
|
height={32}
|
|
className="w-full h-full object-cover"
|
|
/>
|
|
) : (
|
|
<PlaceholderImage size={32} />
|
|
)}
|
|
</div>
|
|
|
|
<div className="flex flex-col leading-tight text-left">
|
|
<span className="text-xs font-semibold text-white truncate max-w-[140px]">
|
|
{driver.name}
|
|
</span>
|
|
|
|
<DriverRating rating={rating} rank={rank} />
|
|
</div>
|
|
</>
|
|
);
|
|
|
|
if (href) {
|
|
return (
|
|
<Link
|
|
href={href}
|
|
className="flex items-center gap-3 rounded-full bg-iron-gray/70 px-3 py-1.5 border border-charcoal-outline/80 shadow-[0_0_18px_rgba(0,0,0,0.45)] hover:border-primary-blue/60 hover:bg-iron-gray transition-colors"
|
|
>
|
|
{content}
|
|
</Link>
|
|
);
|
|
}
|
|
|
|
if (onClick) {
|
|
return (
|
|
<button
|
|
type="button"
|
|
onClick={onClick}
|
|
className="flex items-center gap-3 rounded-full bg-iron-gray/70 px-3 py-1.5 border border-charcoal-outline/80 shadow-[0_0_18px_rgba(0,0,0,0.45)] hover:border-primary-blue/60 hover:bg-iron-gray transition-colors"
|
|
>
|
|
{content}
|
|
</button>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<div className="flex items-center gap-3 rounded-full bg-iron-gray/70 px-3 py-1.5 border border-charcoal-outline/80">
|
|
{content}
|
|
</div>
|
|
);
|
|
}
|