Store open chats in localstorage, removing the need for jquery.cookie
This commit is contained in:
parent
bd2492e678
commit
37486118a2
123
converse.js
123
converse.js
@ -97,7 +97,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
xmppchat.ClientStorage = Backbone.Model.extend({
|
xmppchat.ClientStorage = Backbone.Model.extend({
|
||||||
// TODO: Messages must be encrypted with a key and salt
|
|
||||||
initialize: function (own_jid) {
|
initialize: function (own_jid) {
|
||||||
this.set({ 'own_jid' : own_jid });
|
this.set({ 'own_jid' : own_jid });
|
||||||
},
|
},
|
||||||
@ -115,12 +115,45 @@
|
|||||||
|
|
||||||
getMessages: function (jid) {
|
getMessages: function (jid) {
|
||||||
var bare_jid = Strophe.getBareJidFromJid(jid),
|
var bare_jid = Strophe.getBareJidFromJid(jid),
|
||||||
decrypted_msgs = [];
|
decrypted_msgs = [], i;
|
||||||
var msgs =store.get(hex_sha1(this.get('own_jid')+bare_jid)) || [];
|
var msgs =store.get(hex_sha1(this.get('own_jid')+bare_jid)) || [];
|
||||||
for (var i=0; i<msgs.length; i++) {
|
for (i=0; i<msgs.length; i++) {
|
||||||
decrypted_msgs.push(sjcl.decrypt(hex_sha1(this.get('own_jid')), msgs[i]));
|
decrypted_msgs.push(sjcl.decrypt(hex_sha1(this.get('own_jid')), msgs[i]));
|
||||||
}
|
}
|
||||||
return decrypted_msgs
|
return decrypted_msgs;
|
||||||
|
},
|
||||||
|
|
||||||
|
getOpenChats: function () {
|
||||||
|
var key = hex_sha1(this.get('own_jid')+'-open-chats'),
|
||||||
|
chats = store.get(key) || [],
|
||||||
|
decrypted_chats = [],
|
||||||
|
i;
|
||||||
|
|
||||||
|
for (i=0; i<chats.length; i++) {
|
||||||
|
decrypted_chats.push(chats[i]);
|
||||||
|
}
|
||||||
|
return decrypted_chats;
|
||||||
|
},
|
||||||
|
|
||||||
|
addOpenChat: function (jid) {
|
||||||
|
// TODO: Hash stored chats?
|
||||||
|
var key = hex_sha1(this.get('own_jid')+'-open-chats'),
|
||||||
|
chats = store.get(key) || [];
|
||||||
|
|
||||||
|
if (_.indexOf(chats, jid) == -1) {
|
||||||
|
chats.push(jid);
|
||||||
|
}
|
||||||
|
store.set(key, chats);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeOpenChat: function (jid) {
|
||||||
|
var key = hex_sha1(this.get('own_jid')+'-open-chats'),
|
||||||
|
chats = store.get(key) || [];
|
||||||
|
|
||||||
|
if (_.has(chats, jid) != -1) {
|
||||||
|
chats.splice(_.indexOf(chats, jid), 1);
|
||||||
|
}
|
||||||
|
store.set(key, chats);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -324,49 +357,18 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
addChatToCookie: function () {
|
saveChatToStorage: function () {
|
||||||
var cookie = jQuery.cookie('chats-open-'+xmppchat.username),
|
xmppchat.storage.addOpenChat(this.model.get('jid'));
|
||||||
jid = this.model.get('jid'),
|
|
||||||
new_cookie,
|
|
||||||
open_chats = [];
|
|
||||||
|
|
||||||
if (cookie) {
|
|
||||||
open_chats = cookie.split('|');
|
|
||||||
}
|
|
||||||
if (!_.has(open_chats, jid)) {
|
|
||||||
// Update the cookie if this new chat is not yet in it.
|
|
||||||
open_chats.push(jid);
|
|
||||||
new_cookie = open_chats.join('|');
|
|
||||||
jQuery.cookie('chats-open-'+xmppchat.username, new_cookie, {path: '/'});
|
|
||||||
console.log('updated cookie = ' + new_cookie + '\n');
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
removeChatFromCookie: function () {
|
removeChatFromStorage: function () {
|
||||||
var cookie = jQuery.cookie('chats-open-'+xmppchat.username),
|
xmppchat.storage.removeOpenChat(this.model.get('jid'));
|
||||||
open_chats = [],
|
|
||||||
new_chats = [];
|
|
||||||
|
|
||||||
if (cookie) {
|
|
||||||
open_chats = cookie.split('|');
|
|
||||||
}
|
|
||||||
for (var i=0; i < open_chats.length; i++) {
|
|
||||||
if (open_chats[i] != this.model.get('jid')) {
|
|
||||||
new_chats.push(open_chats[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (new_chats.length) {
|
|
||||||
jQuery.cookie('chats-open-'+xmppchat.username, new_chats.join('|'), {path: '/'});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
jQuery.cookie('chats-open-'+xmppchat.username, null, {path: '/'});
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
closeChat: function () {
|
closeChat: function () {
|
||||||
var that = this;
|
var that = this;
|
||||||
$('#'+this.model.get('box_id')).hide('fast', function () {
|
$('#'+this.model.get('box_id')).hide('fast', function () {
|
||||||
that.removeChatFromCookie(that.model.get('id'));
|
that.removeChatFromStorage(that.model.get('id'));
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -786,31 +788,26 @@
|
|||||||
el: '#collective-xmpp-chat-data',
|
el: '#collective-xmpp-chat-data',
|
||||||
|
|
||||||
restoreOpenChats: function () {
|
restoreOpenChats: function () {
|
||||||
var cookie = jQuery.cookie('chats-open-'+xmppchat.username),
|
var open_chats = xmppchat.storage.getOpenChats(),
|
||||||
open_chats = [],
|
|
||||||
that = this;
|
that = this;
|
||||||
|
|
||||||
jQuery.cookie('chats-open-'+xmppchat.username, null, {path: '/'});
|
if (_.indexOf(open_chats, 'controlbox') != -1) {
|
||||||
if (cookie) {
|
this.renderChat('controlbox');
|
||||||
open_chats = cookie.split('|');
|
|
||||||
if (_.indexOf(open_chats, 'controlbox') != -1) {
|
|
||||||
this.renderChat('controlbox');
|
|
||||||
}
|
|
||||||
_.each(open_chats, $.proxy(function (jid) {
|
|
||||||
if (jid != 'controlbox') {
|
|
||||||
if (_.str.include(jid, xmppchat.connection.muc_domain)) {
|
|
||||||
this.renderChat(jid);
|
|
||||||
} else {
|
|
||||||
// XXX: Can this be optimised somehow? Would be nice to get
|
|
||||||
// fullnames from xmppchat.Roster but it's not yet
|
|
||||||
// populated at this stage...
|
|
||||||
$.getJSON(portal_url + "/xmpp-userinfo?user_id=" + Strophe.getNodeFromJid(jid), function (data) {
|
|
||||||
that.renderChat(jid, data.fullname);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, this));
|
|
||||||
}
|
}
|
||||||
|
_.each(open_chats, $.proxy(function (jid) {
|
||||||
|
if (jid != 'controlbox') {
|
||||||
|
if (_.str.include(jid, xmppchat.connection.muc_domain)) {
|
||||||
|
this.renderChat(jid);
|
||||||
|
} else {
|
||||||
|
// XXX: Can this be optimised somehow? Would be nice to get
|
||||||
|
// fullnames from xmppchat.Roster but it's not yet
|
||||||
|
// populated at this stage...
|
||||||
|
$.getJSON(portal_url + "/xmpp-userinfo?user_id=" + Strophe.getNodeFromJid(jid), function (data) {
|
||||||
|
that.renderChat(jid, data.fullname);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, this));
|
||||||
},
|
},
|
||||||
|
|
||||||
isChatRoom: function (jid) {
|
isChatRoom: function (jid) {
|
||||||
@ -868,7 +865,7 @@
|
|||||||
view.scrolldown();
|
view.scrolldown();
|
||||||
view.focus();
|
view.focus();
|
||||||
}
|
}
|
||||||
view.addChatToCookie();
|
view.saveChatToStorage();
|
||||||
}
|
}
|
||||||
return view;
|
return view;
|
||||||
},
|
},
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
/* Copyright (c) 2006 Klaus Hartl (stilbuero.de) */
|
|
||||||
jQuery.cookie = function(name, value, options) {
|
|
||||||
if (typeof value != 'undefined') { // name and value given, set cookie
|
|
||||||
options = options || {};
|
|
||||||
if (value === null) {
|
|
||||||
value = '';
|
|
||||||
options.expires = -1;
|
|
||||||
}
|
|
||||||
var expires = '';
|
|
||||||
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
|
|
||||||
var date;
|
|
||||||
if (typeof options.expires == 'number') {
|
|
||||||
date = new Date();
|
|
||||||
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
|
|
||||||
} else {
|
|
||||||
date = options.expires;
|
|
||||||
}
|
|
||||||
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
|
|
||||||
}
|
|
||||||
// CAUTION: Needed to parenthesize options.path and options.domain
|
|
||||||
// in the following expressions, otherwise they evaluate to undefined
|
|
||||||
// in the packed version for some reason...
|
|
||||||
var path = options.path ? '; path=' + (options.path) : '';
|
|
||||||
var domain = options.domain ? '; domain=' + (options.domain) : '';
|
|
||||||
var secure = options.secure ? '; secure' : '';
|
|
||||||
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
|
|
||||||
}
|
|
||||||
else { // only name given, get cookie
|
|
||||||
var cookieValue = null;
|
|
||||||
if (document.cookie && document.cookie != '') {
|
|
||||||
var cookies = document.cookie.split(';');
|
|
||||||
for (var i = 0; i < cookies.length; i++) {
|
|
||||||
var cookie = jQuery.trim(cookies[i]);
|
|
||||||
// Does this cookie string begin with the name we want?
|
|
||||||
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
|
||||||
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return cookieValue;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user