From c0681beca7b52d5ddb356ff1ce9616ac352f2277 Mon Sep 17 00:00:00 2001 From: lilia Date: Sun, 16 Nov 2014 15:30:40 -0800 Subject: [PATCH] Consolidate message callbacks Register the runtime callback at the top level view rather than having each conversation view register independently. Also refactors Layout into InboxView. --- index.html | 1 + js/index.js | 55 ++---------------------- js/models/conversations.js | 25 +++++------ js/views/conversation_view.js | 9 ++-- js/views/inbox_view.js | 80 +++++++++++++++++++++++++++++++++++ js/views/message_list_view.js | 1 + 6 files changed, 99 insertions(+), 72 deletions(-) create mode 100644 js/views/inbox_view.js diff --git a/index.html b/index.html index 9566067edc20..c958f51f6166 100644 --- a/index.html +++ b/index.html @@ -159,6 +159,7 @@ +
diff --git a/js/index.js b/js/index.js index 8f825dfbde41..e5a418729029 100644 --- a/js/index.js +++ b/js/index.js @@ -15,63 +15,14 @@ * along with this program. If not, see . */ (function () { - 'use strict'; - Whisper.Layout = new (Backbone.View.extend({ - initialize: function () { - this.gutter = $('#gutter'); - this.contacts = $('#contacts'); - this.resize(); + 'use strict'; - window.addEventListener('resize', this.resize.bind(this)); - - new Whisper.ConversationListView({el: $('#contacts'), collection: Whisper.Conversations}); - Whisper.Conversations.fetch({reset: true}).then(function() { - if (Whisper.Conversations.length) { - Whisper.Conversations.at(0).trigger('render'); - } - }); - - }, - events: { - 'click #new-message': 'new_message', - 'click #new-group': 'new_group' - }, - - new_message: function (e) { - e.preventDefault(); - $('.conversation').hide().trigger('close'); // detach any existing conversation views - this.view = new Whisper.NewConversationView(); - //todo: less new - }, - - new_group: function (e) { - e.preventDefault(); - $('.conversation').trigger('close'); // detach any existing conversation views - new Whisper.NewGroupView(); - }, - resize: function (e) { - var windowheight = window.innerHeight, - form = $('.send-message-area').outerHeight(), - gutter_offset = this.gutter.offset().top, - contacts_offset = this.contacts.offset().top; - if (window.innerWidth < 480) { - this.gutter.css('height', windowheight - gutter_offset - form); - this.contacts.css('height', windowheight - contacts_offset - form); - } else { - this.gutter.css('height', windowheight - gutter_offset); - this.contacts.css('height', windowheight - contacts_offset); - } - $('.discussion').css('height', windowheight - gutter_offset - form); - }, - setContent: function (content) { - $(content).insertAfter(this.gutter); - this.resize(); - } - }))({el: document}); + window.Whisper = window.Whisper || {}; if (textsecure.storage.getUnencrypted("number_id") === undefined) { window.location = '/options.html'; } else { + Whisper.Layout = new Whisper.InboxView({el: document}); textsecure.storage.putUnencrypted("unreadCount", 0); extension.navigator.setBadgeText(""); } diff --git a/js/models/conversations.js b/js/models/conversations.js index b83173122302..f65adebc2a2a 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -59,12 +59,13 @@ sendMessage: function(message, attachments) { return encodeAttachments(attachments).then(function(base64_attachments) { var timestamp = Date.now(); - this.messages().add({ body: message, - timestamp: timestamp, - conversationId: this.id, - conversationType: this.get('type'), - type: 'outgoing', - attachments: base64_attachments + this.messageCollection.add({ + body : message, + timestamp : timestamp, + conversationId : this.id, + conversationType : this.get('type'), + type : 'outgoing', + attachments : base64_attachments }).save(); this.save({ timestamp: timestamp, @@ -88,7 +89,7 @@ var conversation = this; return encodeAttachments(decrypted.message.attachments).then(function(base64_attachments) { var timestamp = decrypted.pushMessage.timestamp.toNumber(); - var m = this.messages().add({ + var m = this.messageCollection.add({ body: decrypted.message.body, timestamp: timestamp, conversationId: this.id, @@ -103,19 +104,15 @@ } this.save({unreadCount: this.get('unreadCount') + 1, active: true}); - return new Promise(function (resolve) { m.save().then(resolve) }); + return new Promise(function (resolve) { m.save().then(resolve(m)) }); }.bind(this)); }, - fetch: function(options) { + fetchMessages: function(options) { options = options || {}; options.conditions = {conversationId: this.id }; return this.messageCollection.fetch(options); - }, - - messages: function() { - return this.messageCollection; - }, + } }); Whisper.ConversationCollection = Backbone.Collection.extend({ diff --git a/js/views/conversation_view.js b/js/views/conversation_view.js index 92ff5ec24606..9f4d612392d1 100644 --- a/js/views/conversation_view.js +++ b/js/views/conversation_view.js @@ -13,10 +13,9 @@ * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ -var Whisper = Whisper || {}; - (function () { 'use strict'; + window.Whisper = window.Whisper || {}; Whisper.ConversationView = Backbone.View.extend({ className: 'conversation', @@ -31,12 +30,11 @@ var Whisper = Whisper || {}; }); this.view = new Whisper.MessageListView({ - collection: this.model.messages() + collection: this.model.messageCollection }); this.$el.find('.discussion-container').append(this.view.el); - this.model.fetch({reset: true}); - extension.onMessage('message', this.model.fetch.bind(this.model)); + this.model.fetchMessages({reset: true}); }, events: { @@ -60,7 +58,6 @@ var Whisper = Whisper || {}; render: function() { Whisper.Layout.setContent(this.$el.show()); - this.view.scrollToBottom(); return this; } }); diff --git a/js/views/inbox_view.js b/js/views/inbox_view.js new file mode 100644 index 000000000000..dafeed36abcf --- /dev/null +++ b/js/views/inbox_view.js @@ -0,0 +1,80 @@ +/* vim: ts=4:sw=4:expandtab + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +(function () { + 'use strict'; + + window.Whisper = window.Whisper || {}; + + Whisper.InboxView = Backbone.View.extend({ + initialize: function () { + this.gutter = $('#gutter'); + this.contacts = $('#contacts'); + this.resize(); + + window.addEventListener('resize', this.resize.bind(this)); + this.conversations = new Whisper.ConversationCollection(); + + new Whisper.ConversationListView({el: $('#contacts'), collection: Whisper.Conversations}); + Whisper.Conversations.fetch({reset: true}).then(function() { + if (Whisper.Conversations.length) { + Whisper.Conversations.at(0).trigger('render'); + } + }); + extension.onMessage('message', function(message) { + Whisper.Conversations.fetch({id: message.conversationId}).then(function() { + Whisper.Conversations.get(message.conversationId).fetchMessages(); + }); + }.bind(this)); + + }, + events: { + 'click #new-message': 'new_message', + 'click #new-group': 'new_group' + }, + + new_message: function (e) { + e.preventDefault(); + $('.conversation').hide().trigger('close'); // detach any existing conversation views + this.view = new Whisper.NewConversationView(); + //todo: less new + }, + + new_group: function (e) { + e.preventDefault(); + $('.conversation').trigger('close'); // detach any existing conversation views + new Whisper.NewGroupView(); + }, + resize: function (e) { + var windowheight = window.innerHeight, + form = $('.send-message-area').outerHeight(), + gutter_offset = this.gutter.offset().top, + contacts_offset = this.contacts.offset().top; + if (window.innerWidth < 480) { + this.gutter.css('height', windowheight - gutter_offset - form); + this.contacts.css('height', windowheight - contacts_offset - form); + } else { + this.gutter.css('height', windowheight - gutter_offset); + this.contacts.css('height', windowheight - contacts_offset); + } + $('.discussion').css('height', windowheight - gutter_offset - form); + }, + setContent: function (content) { + $(content).insertAfter(this.gutter); + this.resize(); + } + }); + +})(); diff --git a/js/views/message_list_view.js b/js/views/message_list_view.js index 18f727918f71..ea8edfb763b7 100644 --- a/js/views/message_list_view.js +++ b/js/views/message_list_view.js @@ -19,6 +19,7 @@ var Whisper = Whisper || {}; var view = new this.itemView({model: model}); this.$el.prepend(view.render().el); }, this); + this.scrollToBottom(); }, }); })();