import type { OrganizerTrust } from "@/server/services/trust.service"; interface OrganizerStatsPanelProps { trust: OrganizerTrust; } /** * Panel reputasi organizer untuk halaman profil publik /u/[id]. * Tidak render kalau user belum punya history sebagai organizer. */ export function OrganizerStatsPanel({ trust }: OrganizerStatsPanelProps) { const { isVerified, isTripLeader, tripsCreated, tripsCompleted, totalParticipantsServed, completionRate, avgRating, reviewCount, ratingBreakdown, } = trust; if (tripsCreated === 0 && reviewCount === 0 && !isVerified) { return null; } const maxBreakdown = Math.max( ratingBreakdown[1], ratingBreakdown[2], ratingBreakdown[3], ratingBreakdown[4], ratingBreakdown[5], 1 ); return (

Reputasi sebagai organizer

{(isVerified || isTripLeader) && (
{isVerified && ( ✅ Verified Organizer )} {isTripLeader && ( Trip leader )}
)}
0 ? `${reviewCount} ulasan` : "Belum ada ulasan" } tone="amber" />
{reviewCount > 0 && (

Distribusi rating

{([5, 4, 3, 2, 1] as const).map((star) => { const count = ratingBreakdown[star]; const percent = (count / maxBreakdown) * 100; return (
{star} ★
{count}
); })}
)}
); } const TONE_CLASSES = { primary: { bg: "bg-primary-50", value: "text-primary-700" }, secondary: { bg: "bg-secondary-50", value: "text-secondary-700" }, neutral: { bg: "bg-neutral-50", value: "text-neutral-800" }, amber: { bg: "bg-amber-50", value: "text-amber-700" }, } as const; interface StatProps { label: string; value: string; subtitle?: string; tone: keyof typeof TONE_CLASSES; } function Stat({ label, value, subtitle, tone }: StatProps) { const cls = TONE_CLASSES[tone]; return (

{label}

{value}

{subtitle && (

{subtitle}

)}
); }