/* Copyright 2026 Marimo. All rights reserved. */ import React from "react"; import { Button } from "@/components/ui/button"; import { AlertDialog, AlertDialogAction, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { CopyIcon } from "lucide-react"; import { toast } from "@/components/ui/use-toast"; import { renderHTML } from "@/plugins/core/RenderHTML"; import { sanitizeHtml } from "@/plugins/core/sanitize-html"; interface TracebackModalProps { isOpen: boolean; onClose: () => void; traceback: string; errorMessage: string; } export const TracebackModal: React.FC = ({ isOpen, onClose, traceback, errorMessage, }) => { const handleCopy = async () => { // Strip HTML tags for clipboard const tempDiv = document.createElement("div"); tempDiv.innerHTML = sanitizeHtml(traceback); const textContent = tempDiv.textContent || tempDiv.innerText || ""; try { await navigator.clipboard.writeText(textContent); toast({ title: "Copied to clipboard", description: "Traceback has been copied to your clipboard.", }); } catch { toast({ title: "Failed to copy", description: "Could not copy to clipboard.", variant: "danger", }); } }; return ( !open && onClose()}> {errorMessage} Click the traceback to select and copy.
Traceback
{renderHTML({ html: traceback })}
Close
); };