@@ -2,11 +2,23 @@ import { ComponentRegistry } from '@object-ui/core';
22import { Chatbot , type ChatMessage } from '@/ui' ;
33import { useState } from 'react' ;
44
5+ /**
6+ * Chatbot component for Object UI
7+ *
8+ * @remarks
9+ * This component supports an optional `onSend` callback in the schema:
10+ * - Signature: `onSend(content: string, messages: ChatMessage[]): void`
11+ * - Parameters:
12+ * - content: The message text that was sent
13+ * - messages: Array of all messages including the newly added message
14+ * - Called when: User sends a message via the input field
15+ * - Use case: Connect to backend API or trigger custom actions on message send
16+ */
517ComponentRegistry . register ( 'chatbot' ,
618 ( { schema, className, ...props } ) => {
719 // Initialize messages from schema or use empty array
820 const [ messages , setMessages ] = useState < ChatMessage [ ] > (
9- schema . messages ?. map ( ( msg : any , idx : number ) => ( {
21+ schema . messages ?. map ( ( msg : Partial < ChatMessage > , idx : number ) => ( {
1022 id : msg . id || `msg-${ idx } ` ,
1123 role : msg . role || 'user' ,
1224 content : msg . content || '' ,
@@ -18,9 +30,9 @@ ComponentRegistry.register('chatbot',
1830
1931 // Handle sending new messages
2032 const handleSendMessage = ( content : string ) => {
21- // Create user message
33+ // Create user message with robust ID generation
2234 const userMessage : ChatMessage = {
23- id : `msg- ${ Date . now ( ) } ` ,
35+ id : crypto . randomUUID ( ) ,
2436 role : 'user' ,
2537 content,
2638 timestamp : schema . showTimestamp ? new Date ( ) . toLocaleTimeString ( ) : undefined ,
@@ -38,7 +50,7 @@ ComponentRegistry.register('chatbot',
3850 if ( schema . autoResponse ) {
3951 setTimeout ( ( ) => {
4052 const assistantMessage : ChatMessage = {
41- id : `msg- ${ Date . now ( ) } -response` ,
53+ id : crypto . randomUUID ( ) ,
4254 role : 'assistant' ,
4355 content : schema . autoResponseText || 'Thank you for your message!' ,
4456 timestamp : schema . showTimestamp ? new Date ( ) . toLocaleTimeString ( ) : undefined ,
@@ -55,9 +67,9 @@ ComponentRegistry.register('chatbot',
5567 onSendMessage = { handleSendMessage }
5668 disabled = { schema . disabled }
5769 showTimestamp = { schema . showTimestamp }
58- userAvatar = { schema . userAvatar }
70+ userAvatarUrl = { schema . userAvatarUrl }
5971 userAvatarFallback = { schema . userAvatarFallback }
60- assistantAvatar = { schema . assistantAvatar }
72+ assistantAvatarUrl = { schema . assistantAvatarUrl }
6173 assistantAvatarFallback = { schema . assistantAvatarFallback }
6274 maxHeight = { schema . maxHeight }
6375 className = { className }
@@ -93,26 +105,30 @@ ComponentRegistry.register('chatbot',
93105 defaultValue : false
94106 } ,
95107 {
96- name : 'userAvatar ' ,
108+ name : 'userAvatarUrl ' ,
97109 type : 'string' ,
98- label : 'User Avatar URL'
110+ label : 'User Avatar URL' ,
111+ description : 'URL of the user avatar image'
99112 } ,
100113 {
101114 name : 'userAvatarFallback' ,
102115 type : 'string' ,
103116 label : 'User Avatar Fallback' ,
104- defaultValue : 'You'
117+ defaultValue : 'You' ,
118+ description : 'Fallback text shown when user avatar image is not available'
105119 } ,
106120 {
107- name : 'assistantAvatar ' ,
121+ name : 'assistantAvatarUrl ' ,
108122 type : 'string' ,
109- label : 'Assistant Avatar URL'
123+ label : 'Assistant Avatar URL' ,
124+ description : 'URL of the assistant avatar image'
110125 } ,
111126 {
112127 name : 'assistantAvatarFallback' ,
113128 type : 'string' ,
114129 label : 'Assistant Avatar Fallback' ,
115- defaultValue : 'AI'
130+ defaultValue : 'AI' ,
131+ description : 'Fallback text shown when assistant avatar image is not available'
116132 } ,
117133 {
118134 name : 'maxHeight' ,
0 commit comments