chat.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. import {
  2. YeIMUniSDK,
  3. YeIMUniSDKDefines
  4. } from '@/uni_modules/wzJun1-YeIM-Uni-SDK/js_sdk/yeim-uni-sdk.min.js'
  5. import {
  6. login
  7. } from '@/request/api/chat.js'
  8. import md5 from '@/js_sdk/js-md5/build/md5.min.js';
  9. import config from "@/config";
  10. let userIds, isListenerChatList = false;
  11. const connect = success => {
  12. if (!userIds) return;
  13. let code = YeIMUniSDK.getInstance().readyState();
  14. if (code === 0) return setTimeout(() => {
  15. if (success) success();
  16. }, 5000)
  17. if (code === 1) {
  18. if (success) success();
  19. return;
  20. }
  21. YeIMUniSDK.getInstance().connect({
  22. userId: userIds,
  23. token: uni.getStorageSync('chatToken'),
  24. success: (response) => {
  25. if (response.code === 200) {
  26. $chat.listenerList();
  27. if (success) success();
  28. }
  29. },
  30. fail: (err) => {
  31. console.log(err);
  32. logins();
  33. }
  34. });
  35. }
  36. const logins = () => {
  37. let timestamp = (new Date()).getTime() + 86400 * 1000; //1000天后过期
  38. let sign = md5(String(userIds) + timestamp + "50abd47112ebe8c5a73f4694c96a49ce");
  39. login({
  40. userId: userIds,
  41. timestamp: timestamp,
  42. sign: sign
  43. }).then(res => {
  44. if (res.state) {
  45. uni.setStorageSync('chatToken', res.data.token);
  46. connect();
  47. }
  48. })
  49. }
  50. const $chat = {
  51. init() {
  52. //初始化YeIMUniSDK
  53. uni.$YeIMUniSDKDefines = YeIMUniSDKDefines;
  54. uni.$YeIM = YeIMUniSDK.init({
  55. baseURL: config.baseUrl + '/im', // YeIMServer http url (如无特殊需求,服务端启动后仅需修改ip或者域名即可)
  56. socketURL: config.socketURL, // YeIMServer socket url(如无特殊需求,服务端启动后仅需修改ip或者域名即可)
  57. /**
  58. * 日志等级
  59. * 0 普通日志,日志量较多,接入时建议使用
  60. * 1 关键性日志,日志量较少,生产环境时建议使用
  61. * 2 无日志级别,SDK 将不打印任何日志
  62. */
  63. logLevel: 2, // 日志等级,
  64. reConnectInterval: 3000, // 重连时间间隔
  65. reConnectTotal: 99, // 最大重连次数,0不限制一直重连
  66. heartInterval: 35000, //心跳时间间隔(默认30s)
  67. });
  68. },
  69. connect(userId) {
  70. userIds = userId;
  71. if (!userId) return;
  72. if (!uni.getStorageSync('chatToken')) {
  73. logins()
  74. } else {
  75. connect();
  76. }
  77. },
  78. getConversationList(success) {
  79. connect(() => {
  80. YeIMUniSDK.getInstance().getConversationList({
  81. page: 1, //页码
  82. limit: 100, //每页数量
  83. success: success,
  84. fail: (err) => {
  85. console.log(err);
  86. }
  87. });
  88. });
  89. },
  90. getHistoryMessageList(nextMessageId, userId, success, fail) {
  91. connect(() => {
  92. YeIMUniSDK.getInstance().getHistoryMessageList({
  93. nextMessageId: nextMessageId,
  94. conversationId: userId,
  95. success: success,
  96. fail: fail
  97. });
  98. });
  99. },
  100. sendImage(userId, success) {
  101. connect(() => {
  102. uni.chooseImage({
  103. count: 1, //图片数量
  104. sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
  105. sourceType: ['album'], //从相册选择
  106. success: res => {
  107. uni.getImageInfo({
  108. src: res.tempFilePaths[0],
  109. success: image => {
  110. //创建图片消息
  111. let message = YeIMUniSDK.getInstance()
  112. .createImageMessage({
  113. toId: userId, //接收者用户ID字符串
  114. conversationType: YeIMUniSDKDefines
  115. .CONVERSATION_TYPE
  116. .PRIVATE, //会话类型:私聊
  117. body: {
  118. file: {
  119. tempFilePath: res.tempFilePaths[
  120. 0], //本地图片临时路径
  121. width: image.width, //图片宽度
  122. height: image.height //图片高度
  123. }
  124. },
  125. extra: "",
  126. onProgress: (progress) => {
  127. // console.log(progress);
  128. }
  129. });
  130. //发送消息
  131. uni.showLoading();
  132. YeIMUniSDK.getInstance().sendMessage({
  133. message: message,
  134. success: success,
  135. fail: (err) => {
  136. uni.hideLoading();
  137. uni.showToast({
  138. title: '发送失败',
  139. icon: "none"
  140. });
  141. }
  142. });
  143. }
  144. });
  145. }
  146. });
  147. });
  148. },
  149. sendText(userId, content, success) {
  150. connect(() => {
  151. //创建文字消息
  152. let message = YeIMUniSDK.getInstance().createTextMessage({
  153. toId: userId, //接收者用户ID字符串
  154. conversationType: YeIMUniSDKDefines.CONVERSATION_TYPE.PRIVATE, //会话类型:私聊
  155. body: {
  156. text: content //文本消息内容字符串
  157. },
  158. extra: ""
  159. });
  160. //发送消息
  161. YeIMUniSDK.getInstance().sendMessage({
  162. message: message,
  163. success: success,
  164. fail: (err) => {
  165. uni.hideLoading();
  166. uni.showToast({
  167. title: '发送失败',
  168. icon: "none"
  169. });
  170. }
  171. });
  172. });
  173. },
  174. disConnect() {
  175. let code = YeIMUniSDK.getInstance().readyState();
  176. if (code === 1) YeIMUniSDK.getInstance().disConnect();
  177. },
  178. listenerList() {
  179. if (isListenerChatList) return;
  180. connect(() => {
  181. isListenerChatList = true;
  182. //监听会话列表更新
  183. YeIMUniSDK.getInstance().addEventListener(YeIMUniSDKDefines.EVENT.CONVERSATION_LIST_CHANGED, (
  184. list) => {
  185. uni.$emit('changeChatList', list);
  186. let chatList = list.filter(node => node.conversationId !== 'system');
  187. let badge = 0;
  188. for (let i = 0; i < chatList.length; i++) {
  189. badge += chatList[i].unread
  190. }
  191. if (!badge) {
  192. uni.removeTabBarBadge({
  193. index: 3
  194. })
  195. } else {
  196. uni.setTabBarBadge({
  197. index: 3,
  198. text: String(badge)
  199. })
  200. }
  201. });
  202. })
  203. },
  204. clearConversationUnread(conversationId) {
  205. //清除指定会话未读数,并给对方发送已读回执
  206. YeIMUniSDK.getInstance().clearConversationUnread(conversationId);
  207. }
  208. }
  209. export default $chat;