chat.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. // pages/list/list.js
  2. import IMOperator from "./im-operator";
  3. import UI from "./ui";
  4. import MsgManager from "./msg-manager";
  5. import ImApi from './../../apis/im'
  6. import { API_BASE_URL } from './../../config/config'
  7. import AgentApi from '../../apis/agent'
  8. /**
  9. * 聊天页面
  10. */
  11. Page({
  12. /**
  13. * 页面的初始数据
  14. */
  15. data: {
  16. textMessage: '',
  17. chatItems: [],
  18. latestPlayVoicePath: '',
  19. chatStatue: 'open',
  20. extraArr: [{
  21. picName: 'choose_picture',
  22. description: '照片'
  23. }, {
  24. picName: 'take_photos',
  25. description: '拍摄'
  26. },],
  27. },
  28. /**
  29. * 生命周期函数--监听页面加载
  30. */
  31. onLoad(options) {
  32. // const friend = JSON.parse({});
  33. this.setData({
  34. pageHeight: wx.getSystemInfoSync().windowHeight,
  35. toId: options.toId
  36. });
  37. wx.setNavigationBarTitle({
  38. title: options.toName || '聊天页面'
  39. })
  40. this.getAgencyDetail(options.toId).then(res => {
  41. console.log(res)
  42. this.imOperator = new IMOperator(this, res);
  43. this.getHistory(options.toId)
  44. this.UI = new UI(this);
  45. this.msgManager = new MsgManager(this);
  46. this.listener = (msg) => {
  47. console.log(msg, 'msg')
  48. if (msg.fromId === options.toId) {
  49. this.onlyGetHistory(options.toId)
  50. this.msgManager.showMsg({msg})
  51. }
  52. }
  53. this.imOperator.onSimulateReceiveMsg(this.listener);
  54. })
  55. },
  56. onHide () {
  57. },
  58. onReady() {
  59. this.chatInput = this.selectComponent('#chatInput');
  60. },
  61. onSendMessageEvent(e) {
  62. let content = e.detail.value;
  63. this.msgManager.sendMsg({type: 'TYPE_ONE', msgType: IMOperator.TextType, content, toId: this.data.toId, fromId: getApp().globalData.userinfo.user_id});
  64. },
  65. onVoiceRecordEvent(e) {
  66. const {detail: {recordStatus, duration, tempFilePath, fileSize,}} = e;
  67. if (recordStatus === 2) {
  68. this.msgManager.sendMsg({
  69. msgType: IMOperator.VoiceType,
  70. content: tempFilePath,
  71. duration: Math.floor(duration / 1000),
  72. toId: this.data.toId
  73. });
  74. }
  75. this.msgManager.stopAllVoice();
  76. },
  77. /**
  78. * 点击extra中的item时触发
  79. * @param e
  80. */
  81. onExtraItemClickEvent(e) {
  82. let chooseIndex = parseInt(e.detail.index);
  83. if (chooseIndex === 2) {
  84. this.myFun();
  85. return;
  86. }
  87. wx.chooseImage({
  88. count: 1, // 默认9
  89. sizeType: ['compressed'],
  90. sourceType: chooseIndex === 0 ? ['album'] : ['camera'],
  91. success: (res) => {
  92. this.msgManager.sendMsg({msgType: IMOperator.ImageType, content: res.tempFilePaths[0], toId: this.data.toId})
  93. }
  94. });
  95. },
  96. /**
  97. * 点击extra按钮时触发
  98. * @param e
  99. */
  100. onExtraClickEvent(e) {
  101. console.log(e);
  102. },
  103. //模拟上传文件,注意这里的cbOk回调函数传入的参数应该是上传文件成功时返回的文件url,这里因为模拟,我直接用的savedFilePath
  104. simulateUploadFile({savedFilePath, duration, itemIndex}) {
  105. return new Promise((resolve, reject) => {
  106. wx.uploadFile({
  107. filePath: savedFilePath,
  108. name: 'file',
  109. url: `${API_BASE_URL}/im/upload`,
  110. header: {
  111. "Content-Type": "multipart/form-data"
  112. },
  113. success: (res) => {
  114. res = JSON.parse(res.data)
  115. resolve({url: `${API_BASE_URL}/im/download/${res.data}`});
  116. },
  117. fail: (err) => {
  118. console.log(err, 'err')
  119. }
  120. })
  121. });
  122. },
  123. /**
  124. * 自定义事件
  125. */
  126. myFun() {
  127. wx.showModal({
  128. title: '小贴士',
  129. content: '演示更新会话状态',
  130. confirmText: '确认',
  131. showCancel: true,
  132. success: (res) => {
  133. if (res.confirm) {
  134. this.msgManager.sendMsg({type: IMOperator.CustomType})
  135. }
  136. }
  137. })
  138. },
  139. resetInputStatus() {
  140. this.chatInput.closeExtraView();
  141. },
  142. onUnload() {
  143. this.msgManager.stopAllVoice();
  144. this.imOperator.removeSimulateReceiveMsg(this.listener)
  145. },
  146. async sendMsg({content, itemIndex}) {
  147. try {
  148. const {msg} = await this.imOperator.onSimulateSendMsg({content})
  149. this.UI.updateViewWhenSendSuccess(msg, itemIndex);
  150. return {msg};
  151. } catch (e) {
  152. console.error(e);
  153. this.UI.updateViewWhenSendFailed(itemIndex);
  154. }
  155. },
  156. /**
  157. * 重发消息
  158. * @param e
  159. */
  160. resendMsgEvent(e) {
  161. const itemIndex = parseInt(e.currentTarget.dataset.resendIndex);
  162. const item = this.data.chatItems[itemIndex];
  163. this.UI.updateDataWhenStartSending(item, false, false);
  164. console.log(item)
  165. this.msgManager.resend({...item, itemIndex});
  166. },
  167. getHistory (friend_id) {
  168. return ImApi.getMsgHistory(friend_id).then(res => {
  169. res.data.reverse().forEach(item => {
  170. if (item.content) {
  171. item.isMy = item.fromId === getApp().globalData.userinfo.user_id;
  172. this.msgManager.showMsg({msg: this.imOperator.createNormalChatItem(item)})
  173. }
  174. })
  175. })
  176. },
  177. onlyGetHistory (friend_id) {
  178. return ImApi.getMsgHistory(friend_id)
  179. },
  180. getAgencyDetail (agency_id) {
  181. agency_id = getApp().globalData.userinfo.agency_user_id || agency_id
  182. const isAgency = getApp().globalData.userinfo.agency_user_id ? true : false
  183. if (agency_id) {
  184. return AgentApi.fetchAgentDetail(agency_id).then(res => {
  185. return {
  186. friendHeadUrl: isAgency ? 'data:image/svg+xml;base64,PHN2ZyBpZD0iaW1nX215X2F2YXRhcl9kZWZhdWx0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCIgdmlld0JveD0iMCAwIDYwIDYwIj4NCiAgPGRlZnM+DQogICAgPHN0eWxlPg0KICAgICAgLmNscy0xIHsNCiAgICAgICAgZmlsbDogI2Q5ZmZmZjsNCiAgICAgIH0NCg0KICAgICAgLmNscy0yIHsNCiAgICAgICAgZmlsbDogIzczOGM5YjsNCiAgICAgIH0NCg0KICAgICAgLmNscy0zIHsNCiAgICAgICAgZmlsbDogI2Y4ZjFlMDsNCiAgICAgIH0NCg0KICAgICAgLmNscy00IHsNCiAgICAgICAgZmlsbDogIzMwMmIyYjsNCiAgICAgIH0NCg0KICAgICAgLmNscy01IHsNCiAgICAgICAgZmlsbDogI2U0ZWVlZjsNCiAgICAgIH0NCg0KICAgICAgLmNscy02IHsNCiAgICAgICAgZmlsbDogI2YxZjVmMzsNCiAgICAgIH0NCiAgICA8L3N0eWxlPg0KICA8L2RlZnM+DQogIDxwYXRoIGlkPSLot6/lvoRfMzcwIiBkYXRhLW5hbWU9Iui3r+W+hCAzNzAiIGNsYXNzPSJjbHMtMSIgZD0iTTMwLjcyNiwzMC40N20tMzAsMGEzMCwzMCwwLDEsMCwzMC0zMCwzMCwzMCwwLDAsMC0zMCwzMFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjcyNiAtMC40NykiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzEiIGRhdGEtbmFtZT0i6Lev5b6EIDM3MSIgY2xhc3M9ImNscy0yIiBkPSJNMjIxLjA3NCw4MTcuMjIzYTI4Ljg4OCwyOC44ODgsMCwwLDAtNC44ODMtMS4zNjhoMGMtMS4wMjUtLjItMi4xLS4zNy0zLjIzMi0uNWEyNC4zMDksMjQuMzA5LDAsMCwxLTExLjYyMSwwYy0xLjIxNS4xNDEtMi4zNzUuMzI1LTMuNDY5LjU0Ny4xLjAzMy4yLjA2MS4zLjA5MWwuMS4wMzEtLjEtLjAzMWMtLjEtLjAzLS4yLS4wNTgtLjMtLjA5MWEyOC42MzMsMjguNjMzLDAsMCwwLTQuNjI3LDEuMzExLDIyLjE0MSwyMi4xNDEsMCwwLDAtNS4xLDMuNTY2LDI5Ljk5NSwyOS45OTUsMCwwLDAsMzguMDE3LS4wMTVBMjEuOTEyLDIxLjkxMiwwLDAsMCwyMjEuMDc0LDgxNy4yMjNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTc3LjE1MiAtNzY3LjU2MikiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzIiIGRhdGEtbmFtZT0i6Lev5b6EIDM3MiIgY2xhc3M9ImNscy0zIiBkPSJNMjk2LjI4NywzNDIuNjE0YTEuNDM5LDEuNDM5LDAsMCwwLTEuMjIxLjE1NywxNi42NTMsMTYuNjUzLDAsMCwwLTEuMDU4LTYuNDgxSDI3Mi4yMjJhMTYuODc2LDE2Ljg3NiwwLDAsMC0xLjA1NCw2Ljc3NSwxLjQ0MSwxLjQ0MSwwLDAsMC0xLjIyNS0uMTU5Yy0xLjA4NC40MDktMS40MTksMi4zNTctLjc0OCw0LjM1czIuMDkzLDMuMjc2LDMuMTc2LDIuODY3YTIzLjcsMjMuNywwLDAsMCw0LjA4Niw3LjkzMnEuNDM4LjUzNy44OTQsMS4wMXY1LjMxN2wtLjA0MSwwYTI0LjMxLDI0LjMxLDAsMCwwLDExLjYyMSwwbC0uMDUzLS4wMDZ2LTUuMzE0cS40NTktLjQ3NS45LTEuMDE3YTIzLjY4MSwyMy42ODEsMCwwLDAsNC4wNzktNy45MTMsMy41NDksMy41NDksMCwwLDAsMy4xNzgtMy4xNzNDMjk3LjcwNiwzNDQuOTcxLDI5Ny4zNzEsMzQzLjAyMywyOTYuMjg3LDM0Mi42MTRaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjUzLjEyNSAtMzE2LjU5NCkiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzMiIGRhdGEtbmFtZT0i6Lev5b6EIDM3MyIgY2xhc3M9ImNscy00IiBkPSJNMzE2LjYyNSwxNzkuMTkzYTIyLjM5MSwyMi4zOTEsMCwwLDAsMS4wNTgsNi43NjFzNS4yLTE1LjEtNC41Ny0xNS4xYzAsMC0yNS4yOTEtOC43OTQtMTkuMzI4LDE1LjQwNWE2LjA4Myw2LjA4MywwLDAsMCwuNDY0LDEuMjI0QzI5OC4yNTUsMTgxLjU1NywzMTEuNTI3LDE4My40NzcsMzE2LjYyNSwxNzkuMTkzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3NS43NDEgLTE1OS4zOTUpIi8+DQogIDxwYXRoIGlkPSLot6/lvoRfMzc1IiBkYXRhLW5hbWU9Iui3r+W+hCAzNzUiIGNsYXNzPSJjbHMtNSIgZD0iTTUxMS43NzIsODE2LjA3MWE2LjYyOCw2LjYyOCwwLDAsMCw0LjMzMSwyLjdzMS41OS0yLjExMywxLjQ3Ny0zLjQwOFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00ODEuOCAtNzY3LjU3NSkiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzYiIGRhdGEtbmFtZT0i6Lev5b6EIDM3NiIgY2xhc3M9ImNscy01IiBkPSJNNDE4LjQxNCw4MTYuMDg2YTYuNjI4LDYuNjI4LDAsMCwxLTQuMzMxLDIuN3MtMS41OS0yLjExMy0xLjQ3Ny0zLjQwOFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODguNDQ1IC03NjcuNTkpIi8+DQogIDxwYXRoIGlkPSLot6/lvoRfMzc3IiBkYXRhLW5hbWU9Iui3r+W+hCAzNzciIGNsYXNzPSJjbHMtNiIgZD0iTTUwMyw4NDQuOTgybS0uNTQ2LDBhLjU0Ni41NDYsMCwxLDAsLjU0Ni0uNTQ2QS41NDYuNTQ2LDAsMCwwLDUwMi40NTksODQ0Ljk4MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzMuMDMzIC03OTQuOTM5KSIvPg0KICA8cGF0aCBpZD0i6Lev5b6EXzM3OCIgZGF0YS1uYW1lPSLot6/lvoQgMzc4IiBjbGFzcz0iY2xzLTYiIGQ9Ik01MDIuOTU2LDg4MC43MjNtLS41NDYsMGEuNTQ2LjU0NiwwLDEsMCwuNTQ2LS41NDZBLjU0Ni41NDYsMCwwLDAsNTAyLjQxLDg4MC43MjNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDcyLjk4NyAtODI4LjU4NCkiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzkiIGRhdGEtbmFtZT0i6Lev5b6EIDM3OSIgY2xhc3M9ImNscy02IiBkPSJNNTAyLjk1Niw5MTcuMW0tLjU0NiwwYS41NDYuNTQ2LDAsMSwwLC41NDYtLjU0NkEuNTQ2LjU0NiwwLDAsMCw1MDIuNDEsOTE3LjFaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDcyLjk4NyAtODYyLjgyNCkiLz4NCjwvc3ZnPg0K' : res.data.avatar,
  187. myHeadUrl: isAgency ? res.data.avatar : 'data:image/svg+xml;base64,PHN2ZyBpZD0iaW1nX215X2F2YXRhcl9kZWZhdWx0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCIgdmlld0JveD0iMCAwIDYwIDYwIj4NCiAgPGRlZnM+DQogICAgPHN0eWxlPg0KICAgICAgLmNscy0xIHsNCiAgICAgICAgZmlsbDogI2Q5ZmZmZjsNCiAgICAgIH0NCg0KICAgICAgLmNscy0yIHsNCiAgICAgICAgZmlsbDogIzczOGM5YjsNCiAgICAgIH0NCg0KICAgICAgLmNscy0zIHsNCiAgICAgICAgZmlsbDogI2Y4ZjFlMDsNCiAgICAgIH0NCg0KICAgICAgLmNscy00IHsNCiAgICAgICAgZmlsbDogIzMwMmIyYjsNCiAgICAgIH0NCg0KICAgICAgLmNscy01IHsNCiAgICAgICAgZmlsbDogI2U0ZWVlZjsNCiAgICAgIH0NCg0KICAgICAgLmNscy02IHsNCiAgICAgICAgZmlsbDogI2YxZjVmMzsNCiAgICAgIH0NCiAgICA8L3N0eWxlPg0KICA8L2RlZnM+DQogIDxwYXRoIGlkPSLot6/lvoRfMzcwIiBkYXRhLW5hbWU9Iui3r+W+hCAzNzAiIGNsYXNzPSJjbHMtMSIgZD0iTTMwLjcyNiwzMC40N20tMzAsMGEzMCwzMCwwLDEsMCwzMC0zMCwzMCwzMCwwLDAsMC0zMCwzMFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0wLjcyNiAtMC40NykiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzEiIGRhdGEtbmFtZT0i6Lev5b6EIDM3MSIgY2xhc3M9ImNscy0yIiBkPSJNMjIxLjA3NCw4MTcuMjIzYTI4Ljg4OCwyOC44ODgsMCwwLDAtNC44ODMtMS4zNjhoMGMtMS4wMjUtLjItMi4xLS4zNy0zLjIzMi0uNWEyNC4zMDksMjQuMzA5LDAsMCwxLTExLjYyMSwwYy0xLjIxNS4xNDEtMi4zNzUuMzI1LTMuNDY5LjU0Ny4xLjAzMy4yLjA2MS4zLjA5MWwuMS4wMzEtLjEtLjAzMWMtLjEtLjAzLS4yLS4wNTgtLjMtLjA5MWEyOC42MzMsMjguNjMzLDAsMCwwLTQuNjI3LDEuMzExLDIyLjE0MSwyMi4xNDEsMCwwLDAtNS4xLDMuNTY2LDI5Ljk5NSwyOS45OTUsMCwwLDAsMzguMDE3LS4wMTVBMjEuOTEyLDIxLjkxMiwwLDAsMCwyMjEuMDc0LDgxNy4yMjNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMTc3LjE1MiAtNzY3LjU2MikiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzIiIGRhdGEtbmFtZT0i6Lev5b6EIDM3MiIgY2xhc3M9ImNscy0zIiBkPSJNMjk2LjI4NywzNDIuNjE0YTEuNDM5LDEuNDM5LDAsMCwwLTEuMjIxLjE1NywxNi42NTMsMTYuNjUzLDAsMCwwLTEuMDU4LTYuNDgxSDI3Mi4yMjJhMTYuODc2LDE2Ljg3NiwwLDAsMC0xLjA1NCw2Ljc3NSwxLjQ0MSwxLjQ0MSwwLDAsMC0xLjIyNS0uMTU5Yy0xLjA4NC40MDktMS40MTksMi4zNTctLjc0OCw0LjM1czIuMDkzLDMuMjc2LDMuMTc2LDIuODY3YTIzLjcsMjMuNywwLDAsMCw0LjA4Niw3LjkzMnEuNDM4LjUzNy44OTQsMS4wMXY1LjMxN2wtLjA0MSwwYTI0LjMxLDI0LjMxLDAsMCwwLDExLjYyMSwwbC0uMDUzLS4wMDZ2LTUuMzE0cS40NTktLjQ3NS45LTEuMDE3YTIzLjY4MSwyMy42ODEsMCwwLDAsNC4wNzktNy45MTMsMy41NDksMy41NDksMCwwLDAsMy4xNzgtMy4xNzNDMjk3LjcwNiwzNDQuOTcxLDI5Ny4zNzEsMzQzLjAyMywyOTYuMjg3LDM0Mi42MTRaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtMjUzLjEyNSAtMzE2LjU5NCkiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzMiIGRhdGEtbmFtZT0i6Lev5b6EIDM3MyIgY2xhc3M9ImNscy00IiBkPSJNMzE2LjYyNSwxNzkuMTkzYTIyLjM5MSwyMi4zOTEsMCwwLDAsMS4wNTgsNi43NjFzNS4yLTE1LjEtNC41Ny0xNS4xYzAsMC0yNS4yOTEtOC43OTQtMTkuMzI4LDE1LjQwNWE2LjA4Myw2LjA4MywwLDAsMCwuNDY0LDEuMjI0QzI5OC4yNTUsMTgxLjU1NywzMTEuNTI3LDE4My40NzcsMzE2LjYyNSwxNzkuMTkzWiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI3NS43NDEgLTE1OS4zOTUpIi8+DQogIDxwYXRoIGlkPSLot6/lvoRfMzc1IiBkYXRhLW5hbWU9Iui3r+W+hCAzNzUiIGNsYXNzPSJjbHMtNSIgZD0iTTUxMS43NzIsODE2LjA3MWE2LjYyOCw2LjYyOCwwLDAsMCw0LjMzMSwyLjdzMS41OS0yLjExMywxLjQ3Ny0zLjQwOFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00ODEuOCAtNzY3LjU3NSkiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzYiIGRhdGEtbmFtZT0i6Lev5b6EIDM3NiIgY2xhc3M9ImNscy01IiBkPSJNNDE4LjQxNCw4MTYuMDg2YTYuNjI4LDYuNjI4LDAsMCwxLTQuMzMxLDIuN3MtMS41OS0yLjExMy0xLjQ3Ny0zLjQwOFoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0zODguNDQ1IC03NjcuNTkpIi8+DQogIDxwYXRoIGlkPSLot6/lvoRfMzc3IiBkYXRhLW5hbWU9Iui3r+W+hCAzNzciIGNsYXNzPSJjbHMtNiIgZD0iTTUwMyw4NDQuOTgybS0uNTQ2LDBhLjU0Ni41NDYsMCwxLDAsLjU0Ni0uNTQ2QS41NDYuNTQ2LDAsMCwwLDUwMi40NTksODQ0Ljk4MloiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC00NzMuMDMzIC03OTQuOTM5KSIvPg0KICA8cGF0aCBpZD0i6Lev5b6EXzM3OCIgZGF0YS1uYW1lPSLot6/lvoQgMzc4IiBjbGFzcz0iY2xzLTYiIGQ9Ik01MDIuOTU2LDg4MC43MjNtLS41NDYsMGEuNTQ2LjU0NiwwLDEsMCwuNTQ2LS41NDZBLjU0Ni41NDYsMCwwLDAsNTAyLjQxLDg4MC43MjNaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDcyLjk4NyAtODI4LjU4NCkiLz4NCiAgPHBhdGggaWQ9Iui3r+W+hF8zNzkiIGRhdGEtbmFtZT0i6Lev5b6EIDM3OSIgY2xhc3M9ImNscy02IiBkPSJNNTAyLjk1Niw5MTcuMW0tLjU0NiwwYS41NDYuNTQ2LDAsMSwwLC41NDYtLjU0NkEuNTQ2LjU0NiwwLDAsMCw1MDIuNDEsOTE3LjFaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgtNDcyLjk4NyAtODYyLjgyNCkiLz4NCjwvc3ZnPg0K'
  188. }
  189. })
  190. }
  191. return new Promise(resolve => resolve())
  192. }
  193. });