diff --git a/src/im/api.ts b/src/im/api.ts index de938e8..602feb6 100644 --- a/src/im/api.ts +++ b/src/im/api.ts @@ -187,6 +187,14 @@ export function getGroupInfo(groupId: string): Promise { return http.get(`/api/im/groups/${encodeURIComponent(groupId)}`, appQuery()) } +export function listGroupMembers(groupId: string): Promise { + return http.get(`/api/im/groups/${encodeURIComponent(groupId)}/members`, appQuery()) +} + +export function searchGroupMembers(groupId: string, keyword: string, size = 20): Promise { + return http.get(`/api/im/groups/${encodeURIComponent(groupId)}/members/search`, appQuery({ keyword, size })) +} + export function sendFriendRequest(toUserId: string, remark?: string): Promise { return http.post( '/api/im/friend-requests', diff --git a/src/im/useIm.ts b/src/im/useIm.ts index 2862d53..512602a 100644 --- a/src/im/useIm.ts +++ b/src/im/useIm.ts @@ -52,6 +52,20 @@ export function useIm() { messages.value = [...messages.value, message] } + function markMessageRevoked(msgId: string) { + const index = messages.value.findIndex((item) => item.id === msgId) + if (index < 0) return + const next = [...messages.value] + next[index] = { + ...next[index], + status: 'REVOKED', + msgType: 'REVOKED', + revoked: true, + content: '', + } + messages.value = next + } + async function refreshConversations() { const items = await listConversations() conversations.value = [...items].sort((a, b) => { @@ -60,6 +74,14 @@ export function useIm() { }) } + function markConversationRead(targetId: string, chatType: ChatType = 'SINGLE') { + conversations.value = conversations.value.map((item) => + item.targetId === targetId && item.chatType === chatType + ? { ...item, unreadCount: 0 } + : item, + ) + } + async function loadHistory(toId: string, query: HistoryQuery = {}): Promise> { return fetchHistory(toId, query) } @@ -91,6 +113,10 @@ export function useIm() { upsertMessage(msg) void refreshConversations().catch(() => {}) }) + im.on('revoke', ({ msgId }) => { + markMessageRevoked(msgId) + void refreshConversations().catch(() => {}) + }) im.on('error', (e) => { error.value = e }) im.connect() client.value = im @@ -105,11 +131,19 @@ export function useIm() { } function revoke(msgId: string) { - return revokeMessage(msgId) + return revokeMessage(msgId).then((message) => { + upsertMessage(message) + void refreshConversations().catch(() => {}) + return message + }) } function edit(msgId: string, content: string) { - return editMessage(msgId, content) + return editMessage(msgId, content).then((message) => { + upsertMessage(message) + void refreshConversations().catch(() => {}) + return message + }) } function disconnect() { @@ -119,6 +153,8 @@ export function useIm() { } function setConversationRead(targetId: string, chatType: ChatType = 'SINGLE') { + markConversationRead(targetId, chatType) + void refreshConversations().catch(() => {}) return markRead(targetId, chatType) }