import { useEffect, useRef, useState } from "react"; import { Button } from "@/src/components/ui/button"; import { usePlaygroundContext } from "../context"; import { ChatMessageRole, ChatMessageType } from "@langfuse/shared"; import { BracesIcon, Check, Copy, Plus } from "lucide-react"; import { ToolCallCard } from "@/src/components/ChatMessages/ToolCallCard"; import { copyTextToClipboard } from "@/src/utils/clipboard"; export const GenerationOutput = () => { const [isCopied, setIsCopied] = useState(false); const [isAdded, setIsAdded] = useState(false); const [isJson, setIsJson] = useState(false); const scrollAreaRef = useRef(null); const { output, outputJson, addMessage, outputToolCalls } = usePlaygroundContext(); const handleCopy = () => { setIsCopied(true); const textToCopy = isJson ? outputJson : output; void copyTextToClipboard(textToCopy); setTimeout(() => setIsCopied(false), 1000); }; const handleAddAssistantMessage = () => { setIsAdded(true); if (outputToolCalls.length > 0) { addMessage({ type: ChatMessageType.AssistantToolCall, role: ChatMessageRole.Assistant, content: output, toolCalls: outputToolCalls, }); } else { addMessage({ type: ChatMessageType.AssistantText, role: ChatMessageRole.Assistant, content: output, }); } setTimeout(() => setIsAdded(false), 1000); }; useEffect(() => { if (scrollAreaRef.current) { const scrollElement = scrollAreaRef.current; scrollElement.scrollTop = scrollElement.scrollHeight; } }, [output]); const checkIcon = ; const copyIcon = ; const plusIcon = ; const copyButton = output || outputToolCalls.length ? (
) : null; return (

Output

{copyButton}
            {isJson ? outputJson : output}
          
{outputToolCalls.length > 0 ? outputToolCalls.map((toolCall) => (
)) : null}
); };