Skip to content

Commit fd792f0

Browse files
Copilothuangyiirene
andcommitted
Address PR review feedback: rename avatar props, improve type safety, document onSend callback, use crypto.randomUUID()
Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
1 parent a33180d commit fd792f0

3 files changed

Lines changed: 42 additions & 26 deletions

File tree

packages/components/src/renderers/complex/chatbot.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ describe('Chatbot Component', () => {
2727
expect(inputNames).toContain('messages');
2828
expect(inputNames).toContain('placeholder');
2929
expect(inputNames).toContain('showTimestamp');
30-
expect(inputNames).toContain('userAvatar');
31-
expect(inputNames).toContain('assistantAvatar');
30+
expect(inputNames).toContain('userAvatarUrl');
31+
expect(inputNames).toContain('assistantAvatarUrl');
3232
});
3333

3434
it('should have sensible default props', () => {

packages/components/src/renderers/complex/chatbot.tsx

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,23 @@ import { ComponentRegistry } from '@object-ui/core';
22
import { Chatbot, type ChatMessage } from '@/ui';
33
import { 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+
*/
517
ComponentRegistry.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',

packages/components/src/ui/chatbot.tsx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ export interface ChatbotProps extends React.HTMLAttributes<HTMLDivElement> {
2323
onSendMessage?: (message: string) => void
2424
disabled?: boolean
2525
showTimestamp?: boolean
26-
userAvatar?: string
26+
userAvatarUrl?: string
2727
userAvatarFallback?: string
28-
assistantAvatar?: string
28+
assistantAvatarUrl?: string
2929
assistantAvatarFallback?: string
3030
maxHeight?: string
3131
}
@@ -40,9 +40,9 @@ const Chatbot = React.forwardRef<HTMLDivElement, ChatbotProps>(
4040
onSendMessage,
4141
disabled = false,
4242
showTimestamp = false,
43-
userAvatar,
43+
userAvatarUrl,
4444
userAvatarFallback = "You",
45-
assistantAvatar,
45+
assistantAvatarUrl,
4646
assistantAvatarFallback = "AI",
4747
maxHeight = "500px",
4848
...props
@@ -101,9 +101,9 @@ const Chatbot = React.forwardRef<HTMLDivElement, ChatbotProps>(
101101
key={message.id}
102102
message={message}
103103
showTimestamp={showTimestamp}
104-
userAvatar={userAvatar}
104+
userAvatarUrl={userAvatarUrl}
105105
userAvatarFallback={userAvatarFallback}
106-
assistantAvatar={assistantAvatar}
106+
assistantAvatarUrl={assistantAvatarUrl}
107107
assistantAvatarFallback={assistantAvatarFallback}
108108
/>
109109
))
@@ -142,18 +142,18 @@ Chatbot.displayName = "Chatbot"
142142
export interface ChatMessageProps {
143143
message: ChatMessage
144144
showTimestamp?: boolean
145-
userAvatar?: string
145+
userAvatarUrl?: string
146146
userAvatarFallback?: string
147-
assistantAvatar?: string
147+
assistantAvatarUrl?: string
148148
assistantAvatarFallback?: string
149149
}
150150

151151
const ChatMessage: React.FC<ChatMessageProps> = ({
152152
message,
153153
showTimestamp,
154-
userAvatar,
154+
userAvatarUrl,
155155
userAvatarFallback,
156-
assistantAvatar,
156+
assistantAvatarUrl,
157157
assistantAvatarFallback,
158158
}) => {
159159
const isUser = message.role === "user"
@@ -170,8 +170,8 @@ const ChatMessage: React.FC<ChatMessageProps> = ({
170170
}
171171

172172
const avatar = isUser
173-
? (message.avatar || userAvatar)
174-
: (message.avatar || assistantAvatar)
173+
? (message.avatar || userAvatarUrl)
174+
: (message.avatar || assistantAvatarUrl)
175175

176176
const avatarFallback = isUser
177177
? (message.avatarFallback || userAvatarFallback)

0 commit comments

Comments
 (0)