{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "voice-chat-03", "description": "Voice chat 3", "dependencies": [ "@elevenlabs/react" ], "registryDependencies": [ "https://ui.elevenlabs.io/r/conversation-bar.json", "https://ui.elevenlabs.io/r/conversation.json", "https://ui.elevenlabs.io/r/message.json", "https://ui.elevenlabs.io/r/orb.json", "https://ui.elevenlabs.io/r/response.json", "tooltip", "card", "button" ], "files": [ { "path": "blocks/voice-chat-03/page.tsx", "content": "\"use client\"\n\nimport { useState } from \"react\"\nimport { ConversationProvider, useConversation } from \"@elevenlabs/react\"\nimport { CheckIcon, CopyIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Card, CardContent } from \"@/components/ui/card\"\nimport {\n Conversation,\n ConversationContent,\n ConversationEmptyState,\n ConversationScrollButton,\n} from \"@/components/ui/conversation\"\nimport { ConversationBar } from \"@/components/ui/conversation-bar\"\nimport { Message, MessageContent } from \"@/components/ui/message\"\nimport { Orb } from \"@/components/ui/orb\"\nimport { Response } from \"@/components/ui/response\"\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\nconst DEFAULT_AGENT_ID = process.env.NEXT_PUBLIC_ELEVENLABS_AGENT_ID!\n\ninterface ChatMessage {\n role: \"user\" | \"assistant\"\n content: string\n}\n\nexport default function Page() {\n return (\n \n \n \n )\n}\n\nexport function VoiceChat03() {\n const [messages, setMessages] = useState([])\n const [copiedIndex, setCopiedIndex] = useState(null)\n\n useConversation({\n onConnect: () => setMessages([]),\n onDisconnect: () => setMessages([]),\n onMessage: (message) => {\n if (message.message) {\n const newMessage: ChatMessage = {\n role: message.source === \"user\" ? \"user\" : \"assistant\",\n content: message.message,\n }\n setMessages((prev) => [...prev, newMessage])\n }\n },\n })\n\n return (\n \n \n \n \n \n {messages.length === 0 ? (\n }\n title=\"Start a conversation\"\n description=\"Tap the phone button or type a message\"\n />\n ) : (\n messages.map((message, index) => {\n return (\n \n \n \n \n {message.content}\n \n \n {message.role === \"assistant\" && (\n \n \n \n )}\n \n {message.role === \"assistant\" && (\n \n \n \n \n {\n navigator.clipboard.writeText(\n message.content\n )\n setCopiedIndex(index)\n setTimeout(() => setCopiedIndex(null), 2000)\n }}\n >\n {copiedIndex === index ? (\n \n ) : (\n \n )}\n \n {copiedIndex === index ? \"Copied!\" : \"Copy\"}\n \n \n \n \n \n {copiedIndex === index ? \"Copied!\" : \"Copy\"}\n \n \n \n \n \n )}\n \n )\n })\n )}\n \n \n \n \n {\n const userMessage: ChatMessage = {\n role: \"user\",\n content: message,\n }\n setMessages((prev) => [...prev, userMessage])\n }}\n />\n \n \n \n \n )\n}\n", "type": "registry:page", "target": "app/voice-chat/page.tsx" } ], "meta": { "iframeHeight": "800px", "container": "w-full bg-surface min-h-svh flex px-4 py-12 items-center md:py-20 justify-center min-w-0", "mobile": "component" }, "categories": [ "agents" ], "type": "registry:block" }
\n {copiedIndex === index ? \"Copied!\" : \"Copy\"}\n