utils.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. (function (root, factory) {
  2. define(['converse', 'es6-promise', 'mock', 'wait-until-promise'], factory);
  3. }(this, function (converse_api, Promise, mock, waitUntilPromise) {
  4. var _ = converse_api.env._;
  5. var $ = converse_api.env.jQuery;
  6. var $msg = converse_api.env.$msg;
  7. var $pres = converse_api.env.$pres;
  8. var $iq = converse_api.env.$iq;
  9. var Strophe = converse_api.env.Strophe;
  10. var utils = {};
  11. if (typeof window.Promise === 'undefined') {
  12. waitUntilPromise.setPromiseImplementation(Promise);
  13. }
  14. utils.waitUntil = waitUntilPromise['default'];
  15. utils.createRequest = function (iq) {
  16. iq = typeof iq.tree == "function" ? iq.tree() : iq;
  17. var req = new Strophe.Request(iq, function() {});
  18. req.getResponse = function () {
  19. var env = new Strophe.Builder('env', {type: 'mock'}).tree();
  20. env.appendChild(iq);
  21. return env;
  22. };
  23. return req;
  24. };
  25. utils.closeAllChatBoxes = function (converse) {
  26. var i, chatbox;
  27. for (i=converse.chatboxes.models.length-1; i>-1; i--) {
  28. chatbox = converse.chatboxes.models[i];
  29. converse.chatboxviews.get(chatbox.get('id')).close();
  30. }
  31. return this;
  32. };
  33. utils.openControlBox = function () {
  34. var $toggle = $(".toggle-controlbox");
  35. if (!$("#controlbox").is(':visible')) {
  36. if (!$toggle.is(':visible')) {
  37. $toggle[0].classList.remove('hidden');
  38. $toggle.click();
  39. } else {
  40. $toggle.click();
  41. }
  42. }
  43. return this;
  44. };
  45. utils.closeControlBox = function () {
  46. if ($("#controlbox").is(':visible')) {
  47. $("#controlbox").find(".close-chatbox-button").click();
  48. }
  49. return this;
  50. };
  51. utils.openContactsPanel = function (converse) {
  52. this.openControlBox(converse);
  53. var cbview = converse.chatboxviews.get('controlbox');
  54. var $tabs = cbview.$el.find('#controlbox-tabs');
  55. $tabs.find('li').first().find('a').click();
  56. };
  57. utils.openRoomsPanel = function (converse) {
  58. utils.openControlBox();
  59. var cbview = converse.chatboxviews.get('controlbox');
  60. var $tabs = cbview.$el.find('#controlbox-tabs');
  61. $tabs.find('li').last().find('a').click();
  62. };
  63. utils.openChatBoxes = function (converse, amount) {
  64. var i = 0, jid, views = [];
  65. for (i; i<amount; i++) {
  66. jid = mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
  67. views[i] = converse.roster.get(jid).trigger("open");
  68. }
  69. return views;
  70. };
  71. utils.openChatBoxFor = function (converse, jid) {
  72. return converse.roster.get(jid).trigger("open");
  73. };
  74. utils.openChatRoom = function (_converse, room, server, nick) {
  75. // Opens a new chatroom
  76. this.openControlBox(_converse);
  77. this.openRoomsPanel(_converse);
  78. var roomspanel = _converse.chatboxviews.get('controlbox').roomspanel;
  79. roomspanel.$el.find('input.new-chatroom-name').val(room);
  80. roomspanel.$el.find('input.new-chatroom-nick').val(nick);
  81. roomspanel.$el.find('input.new-chatroom-server').val(server);
  82. roomspanel.$el.find('form').submit();
  83. this.closeControlBox(_converse);
  84. };
  85. utils.openAndEnterChatRoom = function (converse, room, server, nick) {
  86. sinon.spy(converse.connection, 'sendIQ');
  87. utils.openChatRoom(converse, room, server);
  88. var view = converse.chatboxviews.get((room+'@'+server).toLowerCase());
  89. // We pretend this is a new room, so no disco info is returned.
  90. var IQ_id = converse.connection.sendIQ.firstCall.returnValue;
  91. var features_stanza = $iq({
  92. from: 'lounge@localhost',
  93. 'id': IQ_id,
  94. 'to': 'dummy@localhost/desktop',
  95. 'type': 'error'
  96. }).c('error', {'type': 'cancel'})
  97. .c('item-not-found', {'xmlns': "urn:ietf:params:xml:ns:xmpp-stanzas"});
  98. converse.connection._dataRecv(utils.createRequest(features_stanza));
  99. // The XMPP server returns the reserved nick for this user.
  100. IQ_id = converse.connection.sendIQ.secondCall.returnValue;
  101. var stanza = $iq({
  102. 'type': 'result',
  103. 'id': IQ_id,
  104. 'from': view.model.get('jid'),
  105. 'to': converse.connection.jid
  106. }).c('query', {'xmlns': 'http://jabber.org/protocol/disco#info', 'node': 'x-roomuser-item'})
  107. .c('identity', {'category': 'conference', 'name': nick, 'type': 'text'});
  108. converse.connection._dataRecv(utils.createRequest(stanza));
  109. // The user has just entered the room (because join was called)
  110. // and receives their own presence from the server.
  111. // See example 24: http://xmpp.org/extensions/xep-0045.html#enter-pres
  112. var presence = $pres({
  113. to: converse.connection.jid,
  114. from: room+'@'+server+'/'+nick,
  115. id: 'DC352437-C019-40EC-B590-AF29E879AF97'
  116. }).c('x').attrs({xmlns:'http://jabber.org/protocol/muc#user'})
  117. .c('item').attrs({
  118. affiliation: 'member',
  119. jid: converse.bare_jid,
  120. role: 'occupant'
  121. }).up()
  122. .c('status').attrs({code:'110'});
  123. converse.connection._dataRecv(utils.createRequest(presence));
  124. converse.connection.sendIQ.restore();
  125. };
  126. utils.clearBrowserStorage = function () {
  127. window.localStorage.clear();
  128. window.sessionStorage.clear();
  129. return this;
  130. };
  131. utils.clearChatBoxMessages = function (converse, jid) {
  132. var view = converse.chatboxviews.get(jid);
  133. view.$el.find('.chat-content').empty();
  134. view.model.messages.reset();
  135. view.model.messages.browserStorage._clear();
  136. };
  137. utils.createContacts = function (converse, type, length) {
  138. /* Create current (as opposed to requesting or pending) contacts
  139. * for the user's roster.
  140. *
  141. * These contacts are not grouped. See below.
  142. */
  143. var names, jid, subscription, requesting, ask;
  144. if (type === 'requesting') {
  145. names = mock.req_names;
  146. subscription = 'none';
  147. requesting = true;
  148. ask = null;
  149. } else if (type === 'pending') {
  150. names = mock.pend_names;
  151. subscription = 'none';
  152. requesting = false;
  153. ask = 'subscribe';
  154. } else if (type === 'current') {
  155. names = mock.cur_names;
  156. subscription = 'both';
  157. requesting = false;
  158. ask = null;
  159. } else if (type === 'all') {
  160. this.createContacts(converse, 'current')
  161. .createContacts(converse, 'requesting')
  162. .createContacts(converse, 'pending');
  163. return this;
  164. } else {
  165. throw Error("Need to specify the type of contact to create");
  166. }
  167. if (typeof length === 'undefined') {
  168. length = names.length;
  169. }
  170. for (var i=0; i<length; i++) {
  171. jid = names[i].replace(/ /g,'.').toLowerCase() + '@localhost';
  172. if (!converse.roster.get(jid)) {
  173. converse.roster.create({
  174. 'ask': ask,
  175. 'fullname': names[i],
  176. 'jid': jid,
  177. 'requesting': requesting,
  178. 'subscription': subscription
  179. });
  180. }
  181. }
  182. return this;
  183. };
  184. utils.createGroupedContacts = function (converse) {
  185. /* Create grouped contacts
  186. */
  187. var i=0, j=0;
  188. _.each(_.keys(mock.groups), $.proxy(function (name) {
  189. j = i;
  190. for (i=j; i<j+mock.groups[name]; i++) {
  191. converse.roster.create({
  192. jid: mock.cur_names[i].replace(/ /g,'.').toLowerCase() + '@localhost',
  193. subscription: 'both',
  194. ask: null,
  195. groups: name === 'ungrouped'? [] : [name],
  196. fullname: mock.cur_names[i]
  197. });
  198. }
  199. }, converse));
  200. };
  201. utils.createChatMessage = function (_converse, sender_jid, message) {
  202. return $msg({
  203. from: sender_jid,
  204. to: _converse.connection.jid,
  205. type: 'chat',
  206. id: (new Date()).getTime()
  207. })
  208. .c('body').t(message).up()
  209. .c('active', {'xmlns': Strophe.NS.CHATSTATES}).tree();
  210. }
  211. utils.sendMessage = function (chatboxview, message) {
  212. chatboxview.$el.find('.chat-textarea').val(message);
  213. chatboxview.$el.find('textarea.chat-textarea').trigger($.Event('keypress', {keyCode: 13}));
  214. };
  215. return utils;
  216. }));