0.0.4 • Published 5 months ago
baeim-sdk_beta v0.0.4
安装
npm install baeim-sdk
打包
npm run build
本地运行
npm run dev
引入
import { BaeimSDK, RewardButton } from "baeim-sdk";
RewardButton
props:
- uid: 对方的 tgid;
- current_uid: 当前用户的 tgid;
- avatar: 对方的头像;
- username: 对方的用户名;
- isDev: 是否是开发环境;
- onError: 错误回调;
- onSuccess: 成功回调(打赏成功之后的回调);
<RewardButton
userInfo={{
uid: 123,
current_uid: 123,
avatar: "https://baeim.oss-cn-beijing.aliyuncs.com/avatar/123.png",
username: "test",
}}
isDev={true}
onError={() => {
console.log("error");
}}
onSuccess={() => {
console.log("success");
}}
></RewardButton>
初始化
const sdk = new BaeimSDK({
token, // 当前登录用户的token
userUid: String(currentUid), // 当前用户的tgid
serverAddr: "wss://chat-dev.anyconn.org:8210", // IM服务的websocket地址
syncConversationsCallback: async () => {
// 最近会话数据源的接口配置 前端自己配置接口地址 和查询参数
// 配置后 getAllConversation 才能用
const resp = await getConversationSync({
uid: String(currentUid), // 当前用户的tgid
msg_count: 30, // 查询最近会话的数量
});
return resp;
},
syncMessagesCallback: async (channel: Channel, opts: SyncOptions) => {
// 历史消息数据源的接口配置 前端自己配置接口地址 和查询参数
// 配置后 getMessages 才能用
const resp = await getMessagesSync({
uid: String(currentUid), // 当前用户的tgid
channel_id: channel.channelID,
channel_type: channel.channelType,
start_message_seq: opts.startMessageSeq,
end_message_seq: opts.endMessageSeq,
pull_mode: opts.pullMode,
limit: 30, // 查询消息的数量
});
return resp;
},
});
连接
sdk.start();
断开连接
sdk.stop();
监听连接状态变化 addConnectionStatusListener
sdk.addConnectionStatusListener((status: ConnectStatus)=>void)
获取所有会话 getAllConversation
// 需要先配置后端接口 然后将接口函数作为初始化参数(syncConversationsCallback)传入SDK
export const getConversationSync = (params: { uid: string; msg_count: number }) => {
// return post<Conversation[]>(`https://chat-dev.anyconn.org:5001/conversation/sync`, params)
return post<Conversation[]>(`https://imdev.anyconn.org/conversation/sync`, params, {
headers: { token: '662fd9dc8edae1de8cafb3822125f240' },
})
}
// 传参数
syncConversationsCallback: async () => {
const resp = await getConversationSync({
uid: String(currentUid), // 当前用户的tgid
msg_count: 30,
})
return resp
}
// 然后就可以使用
const res = await sdk.getAllConversation()
创建新的空会话 createEmptyConversation
createEmptyConversation(channelId: string): Promise<Conversation>
监听会话改变 addConversationListener
addConversationListener(
listener: (conversation: Conversation, action: ConversationAction) => () => void
)
发送消息 sendMessage
export enum MessageType {
TEXT = 'TEXT',
IMAGE = 'IMAGE',
VIDEO = 'VIDEO',
}
// IMAGE 和 VIDEO 时 就把上传文件后获得的媒体路径 放在url里面
// 目前url字段不是数组 所以多个媒体 就需要发多个消息。 一条消息对应一个媒体
export type Message = {
url?: string
text?: string
type: MessageType
}
// channelId 是receiver的 tgid
// content 是消息数据toString后的结果,消息的数据结构如上
sdk.sendMessage(content: string, channelId: string)
监听消息 addMessageListener
const handleMessage = (message: Message) => {
log("-------message from server-------- ", message);
try {
// 数据放在content 的 text里面 是字符串
if (message?.content?.text) {
// TODO 处理你接收到的消息 比如给他加上sender receiver channel 然后添加到消息列表
receiveMessage(JSON.parse(message.content.text));
}
} catch (error) {
logError("message from server parse error:", error);
}
};
sdk.addMessageListener(handleMessage);
清空消息队列
sdk.flush();
使用
// 每个监听函数会返回清除函数,可以在页面离开的时候清除当前订阅
// 初始化
const sdk = new BaeimSDK({
token,
userUid: String(currentUid),
serverAddr: "wss://chat-dev.anyconn.org:8210",
syncConversationsCallback: async () => {
const resp = await getConversationSync({
uid: String(currentUid),
msg_count: 30,
});
return resp;
},
syncMessagesCallback: async (channel: Channel, opts: SyncOptions) => {
// 历史消息数据源的接口配置 前端自己配置接口地址 和查询参数
// 配置后 getMessages 才能用
const resp = await getMessagesSync({
uid: String(currentUid), // 当前用户的tgid
channel_id: channel.channelID,
channel_type: channel.channelType,
start_message_seq: opts.startMessageSeq,
end_message_seq: opts.endMessageSeq,
pull_mode: opts.pullMode,
limit: 30, // 查询消息的数量
});
return resp;
},
});
// 开始连接
sdk.start();
sdk.addMessageListener(handleMessage); // 监听消息
setConnection(sdk);
// 添加状态监听
removeConnectionStatusListener = sdk.addConnectionStatusListener(
async (status) => {
if (status === ConnectStatus.Connected) {
try {
// 第一次加载 app 时 可以获取最近的会话 返回的结果里面有recents字段 包含这个会话最近的聊天数据
const res = await sdk.getAllConversation();
// TODO setChatList(res)
// 添加会话变化监听
removeSyncConversationListener = sdk.addConversationListener(
(conversation, action) => {
// 这里可以监听会话变化 然后自己处理前端逻辑
if (action === ConversationAction.add) {
addChatListItem(conversation);
} else if (action === ConversationAction.update) {
updateChatListItem(conversation);
} else if (action === ConversationAction.remove) {
deleteChatListItem(conversation.channel.channelID);
}
}
);
log("getAllConversation", res);
} catch (error) {
log("getAllConversation error", error);
}
} else if (
status === ConnectStatus.ConnectKick ||
status === ConnectStatus.Disconnect
) {
removeSyncConversationListener && removeSyncConversationListener();
}
}
);
处理会话的 unread 状态
需要自己配置后端接口 和最近会话和历史消息一样 只不过 unread 不用传给 sdk 前端自己处理 可以查看文档 设置最近会话未读数量
export const getMessagesSync = (params: {
uid: string;
channel_id: string;
channel_type: number;
start_message_seq: number;
end_message_seq: number;
pull_mode: number;
limit: number;
}) => {
return post<Message[]>(
`https://imdev.anyconn.org/channel/messagesync`,
params,
{
headers: { token: "662fd9dc8edae1de8cafb3822125f240" },
}
);
};
export const setUnread = (params: {
uid: string;
channel_id: string;
channel_type: number;
unread: number;
}) => {
return post<Message[]>(
`https://imdev.anyconn.org/conversations/setUnread`,
params,
{
headers: { token: "662fd9dc8edae1de8cafb3822125f240" },
}
);
};