diff --git a/src/im/ImClient.ts b/src/im/ImClient.ts index 0dfc597..cf6d5c5 100644 --- a/src/im/ImClient.ts +++ b/src/im/ImClient.ts @@ -123,6 +123,8 @@ export class ImClient { this.ws?.send(buildStompFrame('SUBSCRIBE', { id, destination: dest })) } }) + // Sync offline messages + this.sendSync() this.emit('connected') break } @@ -210,6 +212,22 @@ export class ImClient { ) } + sync(): void { + this.sendSync() + } + + private sendSync(): void { + if (this.ws?.readyState !== WebSocket.OPEN) return + const config = getConfig() + this.ws.send( + buildStompFrame( + 'SEND', + { destination: '/app/chat.sync', 'content-type': 'application/json' }, + JSON.stringify({ appId: config.appKey }) + ) + ) + } + subscribe(destination: string): void { if (this.subscriptions.has(destination)) return this.sendSubscribe(destination) diff --git a/src/im/api.ts b/src/im/api.ts index 4d0c699..3a05062 100644 --- a/src/im/api.ts +++ b/src/im/api.ts @@ -360,3 +360,51 @@ export function adminGroupReadReceipts(groupId: string, messageIds: string[]): P appQuery(), ) } + +/* ---------- 批量操作 ---------- */ +export function batchAddFriends(friendIds: string[]): Promise { + return http.post('/api/im/friends/batch', { friendIds }, appQuery()) +} + +export function batchRemoveFriends(friendIds: string[]): Promise { + return http.post('/api/im/friends/batch/remove', { friendIds }, appQuery()) +} + +export function batchAcceptFriendRequests(requestIds: string[]): Promise { + return http.post('/api/im/friend-requests/batch/accept', { requestIds }, appQuery()) +} + +export function batchRejectFriendRequests(requestIds: string[]): Promise { + return http.post('/api/im/friend-requests/batch/reject', { requestIds }, appQuery()) +} + +export function batchAddGroupMembers(groupId: string, userIds: string[]): Promise { + return http.post(`/api/im/groups/${encodeURIComponent(groupId)}/members/batch`, { userIds }, appQuery()) +} + +export function batchRemoveGroupMembers(groupId: string, userIds: string[]): Promise { + return http.post(`/api/im/groups/${encodeURIComponent(groupId)}/members/batch/remove`, { userIds }, appQuery()) +} + +export function batchAcceptGroupJoinRequests(groupId: string, requestIds: string[]): Promise { + return http.post(`/api/im/groups/${encodeURIComponent(groupId)}/join-requests/batch/accept`, { requestIds }, appQuery()) +} + +export function batchRejectGroupJoinRequests(groupId: string, requestIds: string[]): Promise { + return http.post(`/api/im/groups/${encodeURIComponent(groupId)}/join-requests/batch/reject`, { requestIds }, appQuery()) +} + +export function modifyGroupMemberInfo(groupId: string, userId: string, nickname?: string, role?: string): Promise { + const body: Record = {} + if (nickname !== undefined) body.nickname = nickname + if (role !== undefined) body.role = role + return http.put(`/api/im/groups/${encodeURIComponent(groupId)}/members/${encodeURIComponent(userId)}/info`, body, appQuery()) +} + +export function offlineMessageCount(): Promise<{ count: number }> { + return http.get<{ count: number }>('/api/im/messages/offline/count', appQuery()) +} + +export function syncOfflineMessages(): Promise { + return http.post('/api/im/messages/offline', undefined, appQuery()) +} diff --git a/src/index.ts b/src/index.ts index 7b5aa2c..7a79124 100644 --- a/src/index.ts +++ b/src/index.ts @@ -50,6 +50,17 @@ export { transferGroupOwner, updateGroupAttributes, updateProfile, + batchAddFriends, + batchRemoveFriends, + batchAcceptFriendRequests, + batchRejectFriendRequests, + batchAddGroupMembers, + batchRemoveGroupMembers, + batchAcceptGroupJoinRequests, + batchRejectGroupJoinRequests, + modifyGroupMemberInfo, + offlineMessageCount, + syncOfflineMessages, } from './im/api' export { useIm } from './im/useIm' export type {