chat.js 5.7 KB

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