"use client"; import Link from "next/link"; import { DiveSiteSummary } from "@/lib/api/dives"; import { useWithReturnTo } from "@/hooks/useReturnTo"; import { TextHint } from "@/components/ui/tooltip"; export interface DiveSitesLabelProps { sites: DiveSiteSummary[]; // Wrap the primary site's name in a link to its detail page. linked?: boolean; className?: string; } // Renders a dive's site(s) as its primary (first-visited) site, plus a // "+N" suffix when the dive includes additional sites (e.g. a drift dive that // crosses several named sites). Every name is available as a hint on the whole // label whenever the "+N" is hiding some of them - a hover's, or a tap's. export function DiveSitesLabel({ sites, linked = false, className, }: DiveSitesLabelProps) { const withReturnTo = useWithReturnTo(); if (sites.length === 0) { return -; } const [primary, ...extra] = sites; return ( // The whole list, not just the hidden tail: the hint reads as the expansion // of what is on screen, and a diver asking what "+2" stands for gets the // same answer as one asking the name. Left off entirely for a single site, // where it would only repeat the label - and `title` on the wrapper still // shows over the primary site's link, since the link carries none of its // own. // // Joined without the blank-dropping `TripLocationsLabel` needs: a dive site // is a saved row whose `name` the API holds to `min_length=1`, while a trip // location is a snapshot that can arrive as free text. 0 ? sites.map((site) => site.name).join(", ") : undefined } > {linked ? ( {primary.name} ) : ( primary.name )} {extra.length > 0 && ( +{extra.length} )} ); }