"use client"; import { useCallback, useRef, useState } from "react"; import Image from "next/image"; import type { LastYearWinner } from "@/content/last-year-winners"; import { LastYearWinnerTip } from "@/components/home/LastYearWinnerTip"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { cn } from "@/lib/utils"; const GRV_LOGO = "/branding/logo-icon.png"; type Props = { company: LastYearWinner; tipKey: string; isOpen: boolean; isPinned: boolean; onPin: () => void; onUnpin: () => void; onHover: (key: string | null) => void; variant?: "on-green" | "on-light"; className?: string; }; export function LastYearWinnerMark({ company, tipKey, isOpen, isPinned, onPin, onUnpin, onHover, variant = "on-light", className, }: Props) { const leaveTimer = useRef | null>(null); const [failed, setFailed] = useState(false); const src = company.logoSrc ?? GRV_LOGO; const showImage = !failed && src; const logoOnly = !company.name; const onLight = variant === "on-light"; const clearLeaveTimer = useCallback(() => { if (leaveTimer.current) { clearTimeout(leaveTimer.current); leaveTimer.current = null; } }, []); const handleEnter = useCallback(() => { clearLeaveTimer(); onHover(tipKey); }, [clearLeaveTimer, onHover, tipKey]); const handleLeave = useCallback(() => { if (isPinned) return; clearLeaveTimer(); leaveTimer.current = setTimeout(() => onHover(null), 120); }, [clearLeaveTimer, isPinned, onHover]); const handleClick = useCallback( (e: React.MouseEvent) => { e.stopPropagation(); onPin(); }, [onPin] ); const handleOpenChange = useCallback( (open: boolean) => { if (!open && !isPinned) onHover(null); }, [isPinned, onHover] ); return ( {isOpen ? ( e.preventDefault()} onPointerDownOutside={(e) => { if (isPinned) e.preventDefault(); }} onInteractOutside={(e) => { if (isPinned) e.preventDefault(); }} > ) : null} ); }