chat.js 5.5 KB

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