Skip to content

Commit de96ddb

Browse files
author
James
committed
fix(#591): prevent duplicate message id issue
Signed-off-by: James <[email protected]>
1 parent 21a616e commit de96ddb

File tree

9 files changed

+41
-36
lines changed

9 files changed

+41
-36
lines changed

web/containers/Providers/EventHandler.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
import { downloadingModelsAtom } from '@/helpers/atoms/Model.atom'
2525
import { MessageStatus, toChatMessage } from '@/models/ChatMessage'
2626
import { pluginManager } from '@/plugin'
27+
import { ChatMessage, Conversation } from '@/types/chatMessage'
2728

2829
let currentConversation: Conversation | undefined = undefined
2930

web/helpers/atoms/ChatMessage.atom.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { atom } from 'jotai'
22

33
import { getActiveConvoIdAtom } from './Conversation.atom'
44

5-
import { MessageStatus } from '@/models/ChatMessage'
5+
import { ChatMessage, MessageStatus } from '@/models/ChatMessage'
66

77
/**
88
* Stores all chat messages for all conversations

web/helpers/atoms/Conversation.atom.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Conversation, ConversationState } from '@/types/chatMessage'
12
import { atom } from 'jotai'
23

34
// import { MainViewState, setMainViewStateAtom } from './MainView.atom'

web/hooks/useCreateConversation.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
addNewConversationStateAtom,
1313
} from '@/helpers/atoms/Conversation.atom'
1414
import { pluginManager } from '@/plugin'
15+
import { Conversation } from '@/types/chatMessage'
1516

1617
export const useCreateConversation = () => {
1718
const [userConversations, setUserConversations] = useAtom(

web/hooks/useGetInputState.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { useActiveModel } from './useActiveModel'
77
import { useGetDownloadedModels } from './useGetDownloadedModels'
88

99
import { currentConversationAtom } from '@/helpers/atoms/Conversation.atom'
10+
import { Conversation } from '@/types/chatMessage'
1011

1112
export default function useGetInputState() {
1213
const [inputState, setInputState] = useState<InputType>('loading')

web/hooks/useGetUserConversations.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
} from '@/helpers/atoms/Conversation.atom'
1111
import { toChatMessage } from '@/models/ChatMessage'
1212
import { pluginManager } from '@/plugin/PluginManager'
13+
import { ChatMessage, ConversationState } from '@/types/chatMessage'
1314

1415
const useGetUserConversations = () => {
1516
const setConversationStates = useSetAtom(conversationStatesAtom)

web/hooks/useSendChatMessage.ts

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ import {
2424
updateConversationAtom,
2525
updateConversationWaitingForResponseAtom,
2626
} from '@/helpers/atoms/Conversation.atom'
27-
import { toChatMessage } from '@/models/ChatMessage'
27+
import { MessageSenderType, toChatMessage } from '@/models/ChatMessage'
2828

2929
import { pluginManager } from '@/plugin/PluginManager'
30+
import { ChatMessage, Conversation } from '@/types/chatMessage'
3031

3132
export default function useSendChatMessage() {
3233
const currentConvo = useAtomValue(currentConversationAtom)
@@ -73,16 +74,13 @@ export default function useSendChatMessage() {
7374
...updatedConv,
7475
name: updatedConv.name ?? '',
7576
message: updatedConv.lastMessage ?? '',
76-
messages: currentMessages.map<Message>((e: ChatMessage) => {
77-
return {
78-
// eslint-disable-next-line @typescript-eslint/naming-convention
79-
_id: e.id,
80-
message: e.text,
81-
user: e.senderUid,
82-
updatedAt: new Date(e.createdAt).toISOString(),
83-
createdAt: new Date(e.createdAt).toISOString(),
84-
}
85-
}),
77+
messages: currentMessages.map<Message>((e: ChatMessage) => ({
78+
_id: e.id,
79+
message: e.text,
80+
user: e.senderUid,
81+
updatedAt: new Date(e.createdAt).toISOString(),
82+
createdAt: new Date(e.createdAt).toISOString(),
83+
})),
8684
})
8785
}
8886
}, 1000)
@@ -98,16 +96,14 @@ export default function useSendChatMessage() {
9896

9997
const prompt = currentPrompt.trim()
10098
const messageHistory: MessageHistory[] = currentMessages
101-
.map((msg) => {
102-
return {
103-
role: msg.senderUid === 'user' ? 'user' : 'assistant',
104-
content: msg.text ?? '',
105-
}
106-
})
99+
.map((msg) => ({
100+
role: msg.senderUid,
101+
content: msg.text ?? '',
102+
}))
107103
.reverse()
108104
.concat([
109105
{
110-
role: 'user',
106+
role: MessageSenderType.User,
111107
content: prompt,
112108
} as MessageHistory,
113109
])
@@ -116,14 +112,19 @@ export default function useSendChatMessage() {
116112
_id: generateMessageId(),
117113
conversationId: convoId,
118114
message: prompt,
119-
user: 'user',
115+
user: MessageSenderType.User,
120116
createdAt: new Date().toISOString(),
121117
history: messageHistory,
122118
}
123119

124120
const newChatMessage = toChatMessage(newMessage)
125121
addNewMessage(newChatMessage)
126122

123+
// delay randomly from 50 - 100ms
124+
// to prevent duplicate message id
125+
const delay = Math.floor(Math.random() * 50) + 50
126+
await new Promise((resolve) => setTimeout(resolve, delay))
127+
127128
events.emit(EventName.OnNewMessageRequest, newMessage)
128129
if (!currentConvo?.summary && currentConvo) {
129130
const updatedConv: Conversation = {
Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
11
import React, { forwardRef } from 'react'
22

33
import SimpleTextMessage from '../SimpleTextMessage'
4+
import { ChatMessage } from '@/types/chatMessage'
45

56
type Props = {
67
message: ChatMessage
78
}
89

910
type Ref = HTMLDivElement
1011

11-
const ChatItem = forwardRef<Ref, Props>(({ message }, ref) => {
12-
return (
13-
<div ref={ref} className="py-4 even:bg-secondary dark:even:bg-secondary/20">
14-
<SimpleTextMessage
15-
status={message.status}
16-
key={message.id}
17-
avatarUrl={message.senderAvatarUrl}
18-
senderName={message.senderName}
19-
createdAt={message.createdAt}
20-
senderType={message.messageSenderType}
21-
text={message.text}
22-
/>
23-
</div>
24-
)
25-
})
12+
const ChatItem = forwardRef<Ref, Props>(({ message }, ref) => (
13+
<div ref={ref} className="py-4 even:bg-secondary dark:even:bg-secondary/20">
14+
<SimpleTextMessage
15+
status={message.status}
16+
key={message.id}
17+
avatarUrl={message.senderAvatarUrl}
18+
senderName={message.senderName}
19+
createdAt={message.createdAt}
20+
senderType={message.messageSenderType}
21+
text={message.text}
22+
/>
23+
</div>
24+
))
2625

2726
export default ChatItem

web/types/chatMessage.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ enum MessageType {
66
Error = 'Error',
77
}
88

9-
enum MessageSenderType {
9+
export enum MessageSenderType {
1010
Ai = 'assistant',
1111
User = 'user',
1212
}

0 commit comments

Comments
 (0)