"use client"; import { useSafeIntl } from "@kopexa/i18n"; import { cn } from "@kopexa/shared-utils"; import { getScale, type ImpactLevel, type ImpactScaleConfig, type ImpactScalePreset, } from "./scales"; export interface ImpactBadgeProps { /** Impact level 0-5 */ level: ImpactLevel | number | null | undefined; /** Scale preset or custom scale config */ scale?: ImpactScalePreset | ImpactScaleConfig; /** Show numeric value before label */ showValue?: boolean; /** Additional class names */ className?: string; } /** * ImpactBadge displays an impact level as a colored badge. * * @example * ```tsx * * * ``` */ export function ImpactBadge({ level, scale = "risk", showValue = false, className, }: ImpactBadgeProps) { const intl = useSafeIntl(); // Normalize level to ImpactLevel const normalizedLevel: ImpactLevel = level === null || level === undefined ? 0 : ((Math.min(5, Math.max(0, Math.round(level))) as ImpactLevel) ?? 0); // Resolve scale config const scaleConfig: ImpactScaleConfig = typeof scale === "string" ? getScale(scale) : scale; const config = scaleConfig[normalizedLevel]; const isUnrated = normalizedLevel === 0; // Get label from i18n or fallback const label = intl.formatMessage(config.message); return ( {showValue && !isUnrated && ( {normalizedLevel} )} {label} ); }