import type { InteractionIntervention } from "@opengeni/sdk/interaction"; import { CheckIcon, CircleAlertIcon, LoaderCircleIcon, XIcon } from "lucide-react"; import { cn } from "../lib/cn"; import { useOpenGeniText, type OpenGeniText } from "../messages/runtime"; export type InteractionInterventionBannerProps = { interventions: InteractionIntervention[]; activeTargetId?: string | null | undefined; mutating?: boolean | undefined; className?: string | undefined; onOpen?: ((intervention: InteractionIntervention) => void) | undefined; onResolve: (intervention: InteractionIntervention, outcome: "completed" | "dismissed") => void; }; /** Compact durable human-action prompt shared by Browser and Computer viewers. */ export function InteractionInterventionBanner({ interventions, activeTargetId, mutating = false, className, onOpen, onResolve, }: InteractionInterventionBannerProps) { const t = useOpenGeniText(); const intervention = interventions[0]; if (!intervention) return null; const targetOpen = activeTargetId === undefined || activeTargetId === intervention.targetId; return (
{interventionTitle(t, intervention.kind)} {interventions.length > 1 ? ( +{interventions.length - 1} ) : null} {intervention.reason} {!targetOpen && onOpen ? ( ) : ( )}
); } function interventionTitle(t: OpenGeniText, kind: InteractionIntervention["kind"]): string { switch (kind) { case "manual_login": return t("interactionInterventionBanner.signInNeeded"); case "mfa": return t("interactionInterventionBanner.verificationNeeded"); case "external_action": return t("interactionInterventionBanner.actionNeeded"); case "confirmation": return t("interactionInterventionBanner.confirmationNeeded"); case "other": return t("interactionInterventionBanner.agentNeedsYourHelp"); } }