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");
}
}