"use client"
import { AlertTriangle, BadgeCheck, Handshake, UserRoundCheck } from "lucide-react"
import { useAudienceMode } from "@/components/audience-mode-provider"
import { Badge } from "@/components/ui/badge"
import type { Provenance, ProvenanceSourceType } from "@/lib/backend-artifacts"
import { cn } from "@/lib/utils"
import { SignalTooltip } from "./signal-tooltip"
export function getRelationshipDisplayName(value: string | null | undefined) {
const normalized = value?.replace(/_/g, " ").trim()
if (!normalized) {
return "Unknown"
}
return normalized
.split(/\s+/)
.map((token) => `${token.charAt(0).toUpperCase()}${token.slice(1).toLowerCase()}`)
.join(" ")
}
export function getRelationshipShortLabel(value: string | null | undefined, mode: "research" | "policy" = "research") {
switch ((value ?? "").toLowerCase()) {
case "first_party":
return mode === "policy" ? "Reported by model developer" : "1st party"
case "third_party":
return mode === "policy" ? "Independently reported" : "3rd party"
case "collaborative":
return mode === "policy" ? "Joint report" : "Collaborative"
case "other":
return "Other"
default:
return getRelationshipDisplayName(value)
}
}
export function getRelationshipBadgeTone(value: string | null | undefined): string {
switch ((value ?? "").toLowerCase()) {
case "first_party":
return "border-amber-300 bg-amber-50 text-amber-900 dark:border-amber-900/60 dark:bg-amber-950/40 dark:text-amber-100"
case "third_party":
return "border-emerald-300 bg-emerald-50 text-emerald-900 dark:border-emerald-900/60 dark:bg-emerald-950/40 dark:text-emerald-100"
case "collaborative":
return "border-sky-300 bg-sky-50 text-sky-900 dark:border-sky-900/60 dark:bg-sky-950/40 dark:text-sky-100"
default:
return "border-border/70 bg-muted/40 text-muted-foreground"
}
}
function normalizeSourceType(value: string | null | undefined): ProvenanceSourceType | "other" | null {
switch ((value ?? "").toLowerCase()) {
case "first_party":
case "third_party":
case "collaborative":
case "unspecified":
return value?.toLowerCase() as ProvenanceSourceType
case "other":
return "other"
default:
return null
}
}
function ProvenanceIcon({ sourceType }: { sourceType: ProvenanceSourceType | "other" }) {
if (sourceType === "third_party") {
return
}
if (sourceType === "collaborative") {
return
}
return
}
export function ProvenanceBadge({
provenance,
relationship,
sourceOrganizationName,
showOther = false,
className,
}: {
provenance?: Provenance | null
relationship?: string | null
sourceOrganizationName?: string | null
showOther?: boolean
className?: string
}) {
const { mode } = useAudienceMode()
const sourceType = provenance?.source_type ?? normalizeSourceType(relationship)
if (!sourceType || sourceType === "unspecified" || (!showOther && sourceType === "other")) {
return null
}
const firstPartyOnly = provenance?.first_party_only === true
const label = firstPartyOnly
? mode === "policy"
? "Only model developer reported"
: "1st party only"
: getRelationshipShortLabel(sourceType, mode)
const tooltip = firstPartyOnly
? mode === "policy"
? "Only the model developer reported this score; no independent replication is recorded."
: "First-party only - no independent replication is recorded for this group."
: sourceOrganizationName
? `Reported by ${sourceOrganizationName}.`
: getRelationshipDisplayName(sourceType)
return (
{label}
{firstPartyOnly && }
)
}