Backbone message storage and views

Adds Backbone-based Whisper.Messages model/collection with local storage
extension. Saves sent and received messages in Whisper.Messages instead
of message map. This will assign a unique id to the message and save it
to localStorage.

Adds Backbone-based view to popup.html
  Automatically updates itself when new messages are saved to
  Whisper.Messages db from the background page.

Added some shiny new styles, and started splitting up css into multiple
files for sanity's sake.
This commit is contained in:
lilia 2014-05-11 17:13:09 -07:00
parent 170257dafb
commit b852e68290
14 changed files with 3832 additions and 323 deletions

View file

@ -1,4 +1,4 @@
/* vim: ts=4:sw=4
/* vim: ts=4:sw=4:noexpandtab:
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
@ -14,81 +14,25 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
$('#inbox_link').click(function() {
$('#inbox').show();
$('#inbox_link').click(function(e) {
$('#send').hide();
$('#send_link').removeClass('selected');
$('#inbox').show();
$('#inbox_link').addClass('selected');
});
$('#send_link').click(function() {
$('#send_link').click(function(e) {
$('#inbox').hide();
$('#inbox_link').removeClass('selected');
$('#send').show();
$('#send_link').addClass('selected');
});
textsecure.registerOnLoadFunction(function() {
if (storage.getUnencrypted("number_id") === undefined) {
chrome.tabs.create({url: "options.html"});
} else {
function fillMessages() {
var MAX_MESSAGES_PER_CONVERSATION = 4;
var MAX_CONVERSATIONS = 5;
var conversations = [];
var messageMap = getMessageMap();
for (conversation in messageMap) {
var messages = messageMap[conversation];
messages.sort(function(a, b) { return b.timestamp - a.timestamp; });
conversations[conversations.length] = messages;
}
conversations.sort(function(a, b) { return b[0].timestamp - a[0].timestamp });
var ul = $('#conversations');
ul.html('');
for (var i = 0; i < MAX_CONVERSATIONS && i < conversations.length; i++) {
var conversation = conversations[i];
var messages = $('<ul class="conversation">');
for (var j = 0; j < MAX_MESSAGES_PER_CONVERSATION && j < conversation.length; j++) {
var message = conversation[j];
$('<li class="message incoming container">').
append($('<div class="avatar">')).
append($('<div class="bubble">').
append($('<span class="message-text">').text(message.message)).
append($('<span class="metadata">').text("From: " + message.sender + ", at: " + timestampToHumanReadable(message.timestamp)))
).appendTo(messages);
}
var button = $('<button id="button' + i + '">').text('Send');
var input = $('<input id="text' + i + '">');
$('<li>').
append(messages).
append($("<form class='container'>").append(input).append(button)).
appendTo(ul);
button.click(function() {
button.attr("disabled", "disabled");
button.text("Sending");
var sendDestinations = [conversation[0].sender];
if (conversation[0].group)
sendDestinations = conversation[0].group.members;
var messageProto = new PushMessageContentProtobuf();
messageProto.body = input.val();
textsecure.sendMessage(sendDestinations, messageProto, function(result) {
console.log(result);
button.removeAttr("disabled");
button.text("Send");
input.val("");
});
});
}
}
$(window).bind('storage', function(e) {
console.log("Got localStorage update for key " + e.key);
if (event.key == "emessageMap")//TODO: Fix when we get actual encryption
fillMessages();
});
fillMessages();
$(window).bind('storage', function(e) { Whisper.Messages.fetch(); });
Whisper.Messages.fetch();
$('.my-number').text(storage.getUnencrypted("number_id").split(".")[0]);
storage.putUnencrypted("unreadCount", 0);
chrome.browserAction.setBadgeText({text: ""});