chat.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. import {
  2. YeIMUniSDK, // SDK
  3. YeIMUniSDKDefines // 预定义常量
  4. } from 'yeim-uni-sdk'
  5. import {
  6. login,
  7. sendSystem
  8. } from '@/httpApi/chat.js'
  9. import md5 from 'js-md5'
  10. import config from "@/config";
  11. import store from '@/store'
  12. let isListenerChatList = false;
  13. const connect = success => {
  14. if (!store.getters.user.userId) return;
  15. let code = YeIMUniSDK.getInstance().readyState();
  16. if (code !== 3) {
  17. if (success) success();
  18. return;
  19. }
  20. YeIMUniSDK.getInstance().connect({
  21. userId: store.getters.user.userId,
  22. token: localStorage.getItem('chatToken'),
  23. success: (response) => {
  24. if (response.code === 200) {
  25. $chat.listenerList();
  26. if (success) success();
  27. }
  28. },
  29. fail: (err) => {
  30. console.log('error');
  31. logins();
  32. }
  33. });
  34. }
  35. const logins = () => {
  36. let timestamp = (new Date()).getTime() + 86400 * 1000; //1000天后过期
  37. let sign = md5(String(store.getters.user.userId) + timestamp + "50abd47112ebe8c5a73f4694c96a49ce");
  38. login({
  39. userId: store.getters.user.userId,
  40. timestamp: timestamp,
  41. sign: sign
  42. }).then(res => {
  43. if (res.state) {
  44. localStorage.setItem('chatToken', res.data.token);
  45. connect();
  46. }
  47. })
  48. }
  49. const $chat = {
  50. init() {
  51. YeIMUniSDK.init({
  52. baseURL: config.baseURL + '/im', // YeIMServer http url (如无特殊需求,服务端启动后仅需修改ip或者域名即可)
  53. socketURL: 'wss://www.waywish.com/im/im', // YeIMServer socket url(如无特殊需求,服务端启动后仅需修改ip或者域名即可)
  54. /**
  55. * 日志等级
  56. * 0 普通日志,日志量较多,接入时建议使用
  57. * 1 关键性日志,日志量较少,生产环境时建议使用
  58. * 2 无日志级别,SDK 将不打印任何日志
  59. */
  60. logLevel: 2, // 日志等级,
  61. reConnectInterval: 3000, // 重连时间间隔
  62. reConnectTotal: 99, // 最大重连次数,0不限制一直重连
  63. heartInterval: 35000, //心跳时间间隔(默认30s)
  64. });
  65. },
  66. connect() {
  67. if (!localStorage.getItem('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()
  107. .createImageMessage({
  108. toId: userId, //接收者用户ID字符串
  109. conversationType: YeIMUniSDKDefines
  110. .CONVERSATION_TYPE
  111. .PRIVATE, //会话类型:私聊
  112. body: {
  113. file: {
  114. tempFilePath: res.tempFilePaths[
  115. 0], //本地图片临时路径
  116. width: image.width, //图片宽度
  117. height: image.height //图片高度
  118. }
  119. },
  120. extra: "",
  121. onProgress: (progress) => {
  122. // console.log(progress);
  123. }
  124. });
  125. //发送消息
  126. uni.showLoading();
  127. YeIMUniSDK.getInstance().sendMessage({
  128. message: message,
  129. success: success,
  130. fail: (err) => {
  131. uni.hideLoading();
  132. uni.showToast({
  133. title: '发送失败',
  134. icon: "none"
  135. });
  136. }
  137. });
  138. }
  139. });
  140. }
  141. });
  142. });
  143. },
  144. sendText(userId, content, success) {
  145. connect(() => {
  146. //创建文字消息
  147. let message = YeIMUniSDK.getInstance().createTextMessage({
  148. toId: userId, //接收者用户ID字符串
  149. conversationType: YeIMUniSDKDefines.CONVERSATION_TYPE.PRIVATE, //会话类型:私聊
  150. body: {
  151. text: content //文本消息内容字符串
  152. },
  153. extra: ""
  154. });
  155. //发送消息
  156. YeIMUniSDK.getInstance().sendMessage({
  157. message: message,
  158. success: success,
  159. fail: (err) => {
  160. uni.hideLoading();
  161. uni.showToast({
  162. title: '发送失败',
  163. icon: "none"
  164. });
  165. }
  166. });
  167. });
  168. },
  169. disConnect() {
  170. YeIMUniSDK.getInstance().disConnect();
  171. },
  172. listenerLogin() {
  173. //监听登陆互踢,当同一用户重复登录时触发
  174. YeIMUniSDK.getInstance().addEventListener(YeIMUniSDKDefines.EVENT.KICKED_OUT, () => {
  175. // uni.removeStorageSync('token');
  176. // uni.removeStorageSync('chatToken');
  177. // uni.showToast({
  178. // title: '该用户已在其他设备登录',
  179. // icon: 'none'
  180. // })
  181. // uni.switchTab({
  182. // url: '/pages/highseas/highseas'
  183. // });
  184. });
  185. },
  186. listenerList() {
  187. if (isListenerChatList) return;
  188. connect(() => {
  189. isListenerChatList = true;
  190. //监听会话列表更新
  191. YeIMUniSDK.getInstance().addEventListener(YeIMUniSDKDefines.EVENT.CONVERSATION_LIST_CHANGED, (
  192. list) => {
  193. store.dispatch('app/changeChatList', list);
  194. });
  195. })
  196. },
  197. clearConversationUnread(conversationId) {
  198. //清除指定会话未读数,并给对方发送已读回执
  199. YeIMUniSDK.getInstance().clearConversationUnread(conversationId);
  200. },
  201. sendSystemMessage() {
  202. let timestamp = (new Date()).getTime() + 86400 * 1000; //1000天后过期
  203. let sign = md5('system' + timestamp + "50abd47112ebe8c5a73f4694c96a49ce");
  204. login({
  205. userId: 'system',
  206. timestamp: timestamp,
  207. sign: sign
  208. }).then(res => {
  209. if (res.code === 200) {
  210. localStorage.setItem('systemChatToken', res.data.token);
  211. sendSystem({
  212. body: {
  213. text: "2"
  214. },
  215. conversationId: "4",
  216. conversationType: "private",
  217. extra: "",
  218. from: 'system',
  219. fromUserInfo: {},
  220. isDeleted: 0,
  221. isRead: 0,
  222. isRevoke: 0,
  223. status: "unSend",
  224. time: new Date().getTime(),
  225. to: 1,
  226. type: "text",
  227. })
  228. }
  229. })
  230. }
  231. }
  232. export default $chat;