import { Link, useNavigate } from 'react-router-dom'; import { nip19 } from 'nostr-tools'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; import { Button } from '@/components/ui/button'; import { useWhosSkatingAtSpot, SKATING_STATUSES } from '@/hooks/useUserStatus'; import { useAuthor } from '@/hooks/useAuthor'; import { genUserName } from '@/lib/genUserName'; import { formatDistanceToNow } from 'date-fns'; import { Users, MessageCircle, Zap } from 'lucide-react'; import { cn } from '@/lib/utils'; interface WhosSkatingProps { spotPubkey: string; spotIdentifier: string; className?: string; } function SkaterCard({ pubkey, status, emoji }: { pubkey: string; status: string; emoji?: string }) { const navigate = useNavigate(); const { data: authorData, isLoading } = useAuthor(pubkey); const metadata = authorData?.metadata; const displayName = metadata?.name ?? genUserName(pubkey); const npub = nip19.npubEncode(pubkey); if (isLoading) { return (
); } return (
{displayName.slice(0, 2).toUpperCase()} {/* Online indicator */}

{displayName}

{emoji} {status}

); } export function WhosSkating({ spotPubkey, spotIdentifier, className }: WhosSkatingProps) { const { data: skatersAtSpot, isLoading } = useWhosSkatingAtSpot(spotPubkey, spotIdentifier); // Don't show if no one is skating if (!isLoading && (!skatersAtSpot || skatersAtSpot.length === 0)) { return null; } return ( Who's Skating {skatersAtSpot && skatersAtSpot.length > 0 && ( {skatersAtSpot.length} )} {isLoading ? ( <> ) : skatersAtSpot && skatersAtSpot.length > 0 ? ( <> {skatersAtSpot.slice(0, 5).map((skater) => { const preset = skater.statusId ? SKATING_STATUSES.find(s => s.id === skater.statusId) : null; return ( ); })} {skatersAtSpot.length > 5 && (

+{skatersAtSpot.length - 5} more

)} ) : null}
); }