refactor: replace custom message merging logic with centralized mergeImMessagesByIdAsc function
This commit is contained in:
@@ -15,6 +15,7 @@ import {
|
||||
type AgentMessage,
|
||||
} from "@/lib/api/agent"
|
||||
import type { RealtimeConnectionStatusValue } from "@/components/realtime-connection-status"
|
||||
import { mergeImMessagesByIdAsc } from "@/lib/im-message-merge"
|
||||
import { summarizeIMMessage } from "@/lib/im-message"
|
||||
import { generateUUID } from "@/lib/utils"
|
||||
|
||||
@@ -48,20 +49,6 @@ function ensureArray<T>(value: T[] | null | undefined): T[] {
|
||||
return Array.isArray(value) ? value : []
|
||||
}
|
||||
|
||||
function mergeMessagesByIdAsc(
|
||||
a: AgentMessage[],
|
||||
b: AgentMessage[]
|
||||
): AgentMessage[] {
|
||||
const byId = new Map<number, AgentMessage>()
|
||||
for (const m of a) {
|
||||
byId.set(m.id, m)
|
||||
}
|
||||
for (const m of b) {
|
||||
byId.set(m.id, m)
|
||||
}
|
||||
return Array.from(byId.values()).sort((x, y) => x.id - y.id)
|
||||
}
|
||||
|
||||
function parseCursorId(cursor: string): number {
|
||||
const n = Number.parseInt(cursor, 10)
|
||||
return Number.isFinite(n) && n > 0 ? n : 0
|
||||
@@ -344,7 +331,7 @@ export const useAgentConversationsStore = create<AgentConversationsStore>((set,
|
||||
}
|
||||
const incoming = ensureArray(data.results)
|
||||
set((state) => {
|
||||
const merged = mergeMessagesByIdAsc(incoming, state.messages)
|
||||
const merged = mergeImMessagesByIdAsc(state.messages, incoming)
|
||||
return {
|
||||
messages: merged,
|
||||
messagesCursor:
|
||||
@@ -376,10 +363,8 @@ export const useAgentConversationsStore = create<AgentConversationsStore>((set,
|
||||
if (batch.length === 0) {
|
||||
return
|
||||
}
|
||||
const firstId = batch[0]!.id
|
||||
set((state) => {
|
||||
const preserved = state.messages.filter((m) => m.id < firstId)
|
||||
const merged = mergeMessagesByIdAsc(preserved, batch)
|
||||
const merged = mergeImMessagesByIdAsc(state.messages, batch)
|
||||
return {
|
||||
messages: merged,
|
||||
messagesCursor:
|
||||
@@ -425,14 +410,12 @@ export const useAgentConversationsStore = create<AgentConversationsStore>((set,
|
||||
}
|
||||
return {
|
||||
readingMessageId: 0,
|
||||
messages: current.messages.map((item) =>
|
||||
item.seqNo <= lastMessage.seqNo
|
||||
? {
|
||||
...item,
|
||||
agentRead: true,
|
||||
}
|
||||
: item
|
||||
),
|
||||
messages: current.messages.map((item) => {
|
||||
if (item.seqNo > lastMessage.seqNo) {
|
||||
return item
|
||||
}
|
||||
return item.agentRead ? item : { ...item, agentRead: true }
|
||||
}),
|
||||
conversations: current.conversations.map((item) =>
|
||||
item.id === conversationId
|
||||
? {
|
||||
|
||||
+12
-20
@@ -20,6 +20,7 @@ import {
|
||||
createImRealtimeConnection,
|
||||
type ImRealtimeEnvelope,
|
||||
} from "@/lib/im-realtime"
|
||||
import { mergeImMessagesByIdAsc } from "@/lib/im-message-merge"
|
||||
import { summarizeIMMessage } from "@/lib/im-message"
|
||||
import { generateUUID } from "@/lib/utils"
|
||||
|
||||
@@ -61,17 +62,6 @@ function showNotification(title: string, body: string, onClick?: () => void) {
|
||||
}
|
||||
}
|
||||
|
||||
function mergeMessagesByIdAsc(a: ImMessage[], b: ImMessage[]): ImMessage[] {
|
||||
const byId = new Map<number, ImMessage>()
|
||||
for (const message of a) {
|
||||
byId.set(message.id, message)
|
||||
}
|
||||
for (const message of b) {
|
||||
byId.set(message.id, message)
|
||||
}
|
||||
return Array.from(byId.values()).sort((x, y) => x.id - y.id)
|
||||
}
|
||||
|
||||
function ensureMessageList(value: ImMessage[] | null | undefined): ImMessage[] {
|
||||
return Array.isArray(value) ? value : []
|
||||
}
|
||||
@@ -424,10 +414,8 @@ export const useKefuChatStore = create<KefuChatStore>((set, get) => {
|
||||
if (batch.length === 0) {
|
||||
return
|
||||
}
|
||||
const firstId = batch[0]!.id
|
||||
set((state) => {
|
||||
const preserved = state.messages.filter((message) => message.id < firstId)
|
||||
const merged = mergeMessagesByIdAsc(preserved, batch)
|
||||
const merged = mergeImMessagesByIdAsc(state.messages, batch)
|
||||
return {
|
||||
messages: merged,
|
||||
messagesCursor: cursorFromLoadedMessages(merged) || page.cursor || "",
|
||||
@@ -470,7 +458,10 @@ export const useKefuChatStore = create<KefuChatStore>((set, get) => {
|
||||
})
|
||||
const results = ensureMessageList(page.results)
|
||||
set((state) => {
|
||||
const merged = mergeMessagesByIdAsc(results, ensureMessageList(state.messages))
|
||||
const merged = mergeImMessagesByIdAsc(
|
||||
ensureMessageList(state.messages),
|
||||
results
|
||||
)
|
||||
return {
|
||||
messages: merged,
|
||||
messagesCursor: cursorFromLoadedMessages(merged) || page.cursor || "",
|
||||
@@ -510,11 +501,12 @@ export const useKefuChatStore = create<KefuChatStore>((set, get) => {
|
||||
await markImMessageRead(conversation.id, lastMessage.id)
|
||||
set((current) => ({
|
||||
readingMessageId: 0,
|
||||
messages: current.messages.map((item) =>
|
||||
(item.seqNo ?? 0) <= (lastMessage.seqNo ?? 0)
|
||||
? { ...item, customerRead: true }
|
||||
: item
|
||||
),
|
||||
messages: current.messages.map((item) => {
|
||||
if ((item.seqNo ?? 0) > (lastMessage.seqNo ?? 0)) {
|
||||
return item
|
||||
}
|
||||
return item.customerRead ? item : { ...item, customerRead: true }
|
||||
}),
|
||||
conversation: current.conversation
|
||||
? {
|
||||
...current.conversation,
|
||||
|
||||
Reference in New Issue
Block a user