import { ExpandableText } from "@/components/ExpandableText"; import { Stars } from "@/components/Stars"; import type { GoogleReview, GoogleReviewSummary } from "@/lib/google-reviews"; import { formatRating, initialsOf, needsClamp, reviewCountLabel } from "@/lib/review-format"; const EXTERNAL = { target: "_blank", rel: "noopener noreferrer" } as const; function Attribution({ review }: { review: GoogleReview }) { return (
{/* Initialen statt Profilbild: kein Abruf von Google-Servern. */} {initialsOf(review.author)} {review.author} {review.relativeTime && <>{review.relativeTime}, } {review.authorUrl ? ( Auf Google ansehen (Rezension von {review.author}, öffnet in neuem Tab) ) : ( "auf Google" )}
); } function Summary({ data }: { data: GoogleReviewSummary }) { return (
{data.rating !== null && (

{formatRating(data.rating)} Durchschnitt {data.totalCount !== null && <> aus {reviewCountLabel(data.totalCount)}}

)}

Rezensionen von Google. Angezeigt werden die Rezensionen, die Google für diesen Eintrag ausliefert.

{data.mapsUrl && (

Alle Rezensionen auf Google Maps (öffnet in neuem Tab)

)}
); } /** * Echte Google-Rezensionen (Places API). Ohne Daten erscheint der Abschnitt * nicht; in Entwicklung/Staging steht dort ein Hinweis zur Einrichtung. * Keine Ersatz- oder Beispielstimmen. */ export function ReviewsSection({ data, showDrafts }: { data: GoogleReviewSummary | null; showDrafts: boolean }) { if (!data) { if (!showDrafts) return null; return (

Entwurf Google-Rezensionen erscheinen, sobald GOOGLE_PLACES_API_KEY und GOOGLE_PLACE_ID gesetzt sind.

); } const [lead, ...rest] = data.reviews; return (

Was andere über ARTISTA sagen

{lead && (
)} {rest.length > 0 && (
    {rest.map((review, index) => (
  • ))}
)}
); }