XuqmGroup-RNSDK/src/im/imSDK.ts
XuqmGroup 3d488250ee feat(rn): add xuqm_release Node.js script, expand IM SDK with friends/groups/conversations
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 00:37:10 +08:00

136 行
3.8 KiB
TypeScript

import { getConfig } from '../core/config'
import { apiRequest, getToken, saveToken } from '../core/http'
import { ImClient } from './imClient'
import type { ChatType, ImEventListener, ImGroup, ImMessage, MsgType } from './types'
let client: ImClient | null = null
export const ImSDK = {
async login(userId: string, nickname?: string, avatar?: string): Promise<void> {
const config = getConfig()
const res = await apiRequest<{ token: string }>('/api/im/auth/login', {
method: 'POST',
params: {
appId: config.appId,
userId,
...(nickname ? { nickname } : {}),
...(avatar ? { avatar } : {}),
},
})
await saveToken(res.token)
client = new ImClient(config.imWsUrl, res.token, config.appId)
client.connect()
},
async reconnect(): Promise<void> {
const config = getConfig()
const token = await getToken()
if (!token) throw new Error('ImSDK: token not found')
client = new ImClient(config.imWsUrl, token, config.appId)
client.connect()
},
async fetchHistory(toId: string, page = 0, size = 20): Promise<ImMessage[]> {
const config = getConfig()
const res = await apiRequest<{ content?: ImMessage[] } | ImMessage[]>(`/api/im/messages/history/${encodeURIComponent(toId)}`, {
params: {
appId: config.appId,
page: String(page),
size: String(size),
},
})
return Array.isArray(res) ? res : (res.content ?? [])
},
async sendMessage(
toId: string,
chatType: ChatType,
msgType: MsgType,
content: string,
mentionedUserIds?: string,
): Promise<ImMessage> {
const config = getConfig()
return apiRequest<ImMessage>('/api/im/messages/send', {
method: 'POST',
params: { appId: config.appId },
body: {
toId,
chatType,
msgType,
content,
mentionedUserIds: mentionedUserIds ?? '',
},
})
},
async revokeMessage(messageId: string): Promise<ImMessage> {
const config = getConfig()
return apiRequest<ImMessage>(`/api/im/messages/${encodeURIComponent(messageId)}/revoke`, {
method: 'POST',
params: { appId: config.appId },
})
},
async editMessage(messageId: string, content: string): Promise<ImMessage> {
const config = getConfig()
return apiRequest<ImMessage>(`/api/im/messages/${encodeURIComponent(messageId)}`, {
method: 'PUT',
params: { appId: config.appId },
body: { content },
})
},
addListener(listener: ImEventListener) {
client?.addListener(listener)
},
removeListener(listener: ImEventListener) {
client?.removeListener(listener)
},
disconnect() {
client?.disconnect()
client = null
},
subscribeGroup(groupId: string) {
client?.subscribeGroup(groupId)
},
isConnected() {
return client?.isConnected() ?? false
},
async createGroup(name: string, memberIds: string[]): Promise<ImGroup> {
const config = getConfig()
return apiRequest<ImGroup>('/api/im/groups', {
method: 'POST',
params: { appId: config.appId },
body: { name, memberIds },
})
},
async listGroups(): Promise<ImGroup[]> {
const config = getConfig()
const res = await apiRequest<ImGroup[] | { content?: ImGroup[] }>('/api/im/groups', {
params: { appId: config.appId },
})
return Array.isArray(res) ? res : (res.content ?? [])
},
async fetchGroupHistory(groupId: string, page = 0, size = 50): Promise<ImMessage[]> {
const config = getConfig()
const res = await apiRequest<{ content?: ImMessage[] } | ImMessage[]>(
`/api/im/messages/history/${encodeURIComponent(groupId)}`,
{
params: {
appId: config.appId,
page: String(page),
size: String(size),
},
},
)
return Array.isArray(res) ? res : (res.content ?? [])
},
}