【问题标题】:Converse opening a chat from APIConverse 从 API 打开聊天
【发布时间】:2018-04-12 13:17:32
【问题描述】:

我正在研究如何通过 API 打开与用户的聊天窗口。

我已经设置(并在白名单中注册)了一个插件,它会触发。

    converse.plugins.add('startChat', {
        initialize: function () {
            this._converse.on('connected', function () {
                console.log("wibble");
                this._converse.api.chats.open('user@chat.domain.com');
            });
          }
      });

这是触发,但没有发起聊天。我在控制台中收到以下错误:

wibble

converse.js:48049
FATAL: TypeError: Cannot read property 'get' of undefined
    at child.createChatBox (/converse.js:50015:56)
    at child.getChatBox (/converse.js:50050:40)
    at Object.open (/converse.js:50153:84)
    at Object.<anonymous> (Page.aspx:1264:41)
    at triggerEvents (/converse.js:46015:57)
    at triggerApi (/converse.js:46003:19)
    at eventsApi (/converse.js:45802:16)
    at Object.Events.trigger (/converse.js:45993:5)
    at Object._converse.emit (/converse.js:48071:27)
    at Object.onConnected (/converse.js:48671:27)

converse.js:48041 
ERROR: User connection callback caused an exception: TypeError: Cannot read property 'get' of undefined

【问题讨论】:

    标签: javascript converse.js


    【解决方案1】:

    首先,Converse.js 不允许与不在您名单中的用户打开聊天(除非您已将 allow_non_roster_messaging 设置为 true)。因此,请确保您尝试与之聊天的用户在您的名单中。

    其次,在connection 事件被触发之后,现在尝试打开聊天还为时过早。

    所以你必须先等到名册被填充。这是rosterContactsFetched 事件/承诺。

    除此之外,最好先等到已经打开的聊天框(缓存在 sessionStorage 中)也从缓存中获取。这是chatBoxesFetched 事件/承诺。

    这两个事件在每个会话中只触发一次,因此它们也可以作为 Promise 使用。

    首先要等待这两个 Promise 解决,因此您的代码应如下所示:

    converse.plugins.add('startChat', {
      initialize: function() {
        var _converse = this._converse;
        Promise.all([
            _converse.api.waitUntil('rosterContactsFetched'),
            _converse.api.waitUntil('chatBoxesFetched')
        ]).then(function() {
          // Note, test@conversejs.org must be in your contacts roster!
          _converse.api.chats.open('test@conversejs.org');
        });
      } 
    });
    

    这是一个运行上述代码的 JSFiddle:https://jsfiddle.net/jcbrand/5juvrL3c/

    【讨论】:

    • 啊 - 不打开与不在我名单中的用户的聊天是我缺少的链接。
    • 这对我不起作用... converse 拒绝打开聊天窗口
    【解决方案2】:

    对于未来的旅行者:我解决了从外部对话开始对话的问题,如下所示:

    <li id="start-chat" data-id="idOfTheUser" data-name="nameOfTheUser"> Message</li>
    

    然后是这样的插件:

        converse.plugins.add('startChat', {
            initialize: function () {
                var _converse = this._converse;
    
                $('#start-chat').on('click', function () {
    
                    var jid = $('#start-chat').attr("data-id") +'@chat.domain.com';
                    var userFullName = $('#start-chat').attr("data-name");
    
                    _converse.api.contacts.add(jid, userFullName);
                    _converse.api.chats.open(jid, true);
                });
              }
          });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 2020-01-21
      • 2015-06-23
      • 1970-01-01
      • 2012-12-07
      • 2010-11-05
      相关资源
      最近更新 更多