signal-desktop/js/panel_controller.js

178 lines
5.8 KiB
JavaScript
Raw Normal View History

/*global $, Whisper, Backbone, textsecure, extension*/
/*
* vim: ts=4:sw=4:expandtab
*/
// This script should only be included in background.html
(function () {
'use strict';
window.Whisper = window.Whisper || {};
var conversations = new Whisper.ConversationCollection();
var inboxCollection = new (Backbone.Collection.extend({
initialize: function() {
this.on('change:active_at', this.sort);
this.on('change:unreadCount', this.updateUnreadCount);
this.listenTo(conversations, 'add change:active_at', this.addActive);
},
comparator: function(model) {
return -model.get('active_at');
},
addActive: function(model) {
if (model.get('active_at')) {
this.add(model);
}
},
updateUnreadCount: function(model, count) {
var prev = model.previous('unreadCount') || 0;
if (count < prev) { // decreased
var newUnreadCount = storage.get("unreadCount", 0) - (prev - count);
setUnreadCount(newUnreadCount);
storage.put("unreadCount", newUnreadCount);
}
}
}))();
window.getInboxCollection = function() {
return inboxCollection;
};
2015-08-27 19:38:51 +00:00
window.ConversationController = {
get: function(id) {
return conversations.get(id);
},
2015-08-27 19:38:51 +00:00
create: function(attrs) {
var conversation = conversations.add(attrs);
return conversation;
},
findOrCreatePrivateById: function(id) {
var conversation = conversations.add({ id: id, type: 'private' });
return new Promise(function(resolve, reject) {
conversation.fetch().then(function() {
resolve(conversation);
}).fail(function() {
var saved = conversation.save(); // false or indexedDBRequest
if (saved) {
saved.then(function() {
resolve(conversation);
}).fail(reject);
}
reject();
});
});
},
updateInbox: function() {
conversations.fetchActive();
2015-08-27 19:38:51 +00:00
}
};
2015-08-27 19:38:51 +00:00
ConversationController.updateInbox();
setUnreadCount(storage.get("unreadCount", 0));
function setUnreadCount(count) {
if (count > 0) {
extension.navigator.setBadgeText(count);
} else {
extension.navigator.setBadgeText("");
}
}
window.notifyConversation = function(message) {
var conversationId = message.get('conversationId');
var conversation = ConversationController.get(conversationId);
if (!conversation) {
conversation = conversations.create({id: conversationId});
conversation.fetch();
}
if (inboxOpened) {
conversation.fetchMessages();
extension.windows.drawAttention(inboxWindowId);
} else if (Whisper.Notifications.isEnabled()) {
var sender = ConversationController.create({id: message.get('source')});
conversation.fetch().then(function() {
sender.fetch().then(function() {
sender.getNotificationIcon().then(function(iconUrl) {
Whisper.Notifications.add({
title : sender.getTitle(),
message : message.getNotificationText(),
iconUrl : iconUrl,
imageUrl : message.getImageUrl(),
conversationId: conversation.id
});
});
});
});
} else {
openConversation(conversation);
ConversationController.updateInbox();
}
};
/* Inbox window controller */
var inboxOpened = false;
var inboxWindowId = 'inbox';
window.openInbox = function() {
if (inboxOpened === false) {
inboxOpened = true;
extension.windows.open({
id: 'inbox',
url: 'index.html',
type: 'panel',
frame: 'none',
focused: true,
width: 580,
height: 440,
minWidth: 230,
minHeight: 150
}, function (windowInfo) {
inboxWindowId = windowInfo.id;
windowInfo.onClosed.addListener(function () {
inboxOpened = false;
});
// close the panel if background.html is refreshed
2015-05-13 18:23:59 +00:00
extension.windows.beforeUnload(function() {
// TODO: reattach after reload instead of closing.
extension.windows.remove(inboxWindowId);
});
});
} else if (inboxOpened === true) {
extension.windows.focus(inboxWindowId, function (error) {
if (error) {
inboxOpened = false;
openInbox();
}
});
}
};
2015-05-15 20:54:29 +00:00
var open;
window.openConversation = function(conversation) {
if (inboxOpened === true) {
var appWindow = chrome.app.window.get(inboxWindowId);
appWindow.contentWindow.openConversation(conversation);
} else {
open = conversation;
openInbox();
}
};
window.getOpenConversation = function() {
var o = open;
open = null;
return o;
};
2015-05-15 20:54:29 +00:00
extension.onLaunched(function() {
2015-05-20 21:24:44 +00:00
storage.onready(function() {
if (textsecure.registration.isDone()) {
openInbox();
} else {
extension.install();
}
});
2015-05-15 20:54:29 +00:00
});
})();