chat.js 5.4 KB

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