feat: implement Kefu message list component and related functionality

- Add KefuMessageList component for displaying chat messages with support for loading older messages and scrolling behavior.
- Introduce ImWidgetConfig type and fetchImWidgetConfig function for retrieving widget configuration.
- Create im-realtime module for managing WebSocket connections and handling real-time events.
- Implement kefu-host-bridge for communication between the chat widget and the host application.
- Establish kefu-chat store using Zustand for managing chat state, including message handling, socket connection, and notifications.
- Enhance message handling with support for image uploads and attachments.
This commit is contained in:
mlogclub
2026-04-24 14:34:21 +08:00
parent 6616b66e72
commit 4bcfd36620
9 changed files with 1871 additions and 0 deletions
+28
View File
@@ -10,6 +10,8 @@ export type Paging = {
export type PageResult<T> = {
results: T[]
page: Paging
cursor?: string
hasMore?: boolean
}
export type ImConversationTag = {
@@ -99,6 +101,13 @@ export type ImAsset = {
updateUserName: string
}
export type ImWidgetConfig = {
title?: string
subtitle?: string
welcomeText?: string
themeColor?: string
}
const VISITOR_STORAGE_KEY = "cs_agent_im_visitor_id"
const API_BASE_URL =
process.env.NEXT_PUBLIC_API_BASE_URL?.trim() || ""
@@ -171,6 +180,25 @@ export function createOrMatchImConversation() {
})
}
export function fetchImWidgetConfig() {
return request<ImWidgetConfig>(
`/api/open/im/widget/config${toQueryString({
channelId: OPEN_IM_CHANNEL_ID,
})}`,
{
headers: createImHeaders(),
}
)
}
export function closeImConversation(conversationId: number) {
return request<void>("/api/open/im/conversation/close", {
method: "POST",
headers: createImHeaders(),
body: JSON.stringify({ conversationId }),
})
}
export function sendImMessage(payload: {
conversationId: number
messageType: string