import { memo, useCallback, useEffect, useMemo, useState } from "react"; import { Check, Copy, PanelRightClose, Square } from "lucide-react"; import { Button } from "@/components/ui/button"; import type { CodePreviewPayload } from "@/components/chat/CodePreviewContext"; interface CodePreviewPanelProps { code: CodePreviewPayload | null; onClose: () => void; } export const CodePreviewPanel = memo(function CodePreviewPanel({ code, onClose }: CodePreviewPanelProps) { const [copied, setCopied] = useState(false); const [viewMode, setViewMode] = useState<"code" | "preview">("code"); const lines = useMemo(() => code?.code.replace(/\n$/, "").split("\n") ?? [], [code?.code]); const canPreview = code?.language === "html"; const isSubAgent = code?.kind === "subagent"; const handleCopy = useCallback(() => { if (!code) return; navigator.clipboard.writeText(code.code).then(() => { setCopied(true); window.setTimeout(() => setCopied(false), 1600); }); }, [code]); // Sync viewMode when code changes useEffect(() => { if (code?.previewMode) { setViewMode(code.previewMode); } }, [code?.previewMode]); return (