Simplify panel state management and message passing
This commit is contained in:
parent
9071d98395
commit
94ce4d4b91
12 changed files with 148 additions and 102 deletions
|
@ -25,8 +25,9 @@
|
||||||
|
|
||||||
<script type="text/javascript" src="js/chromium.js"></script>
|
<script type="text/javascript" src="js/chromium.js"></script>
|
||||||
|
|
||||||
<script type="text/javascript" src="js/panel_controller.js"></script>
|
<script type="text/javascript" src="js/bimap.js"></script>
|
||||||
<script type="text/javascript" src="js/background.js"></script>
|
<script type="text/javascript" src="js/background.js"></script>
|
||||||
|
<script type="text/javascript" src="js/panel_controller.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
</body>
|
</body>
|
||||||
|
|
|
@ -12,11 +12,13 @@
|
||||||
<link href="/components/bootstrap-tagsinput/dist/bootstrap-tagsinput.css" rel="stylesheet" type="text/css" />
|
<link href="/components/bootstrap-tagsinput/dist/bootstrap-tagsinput.css" rel="stylesheet" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body class='signal' data-name="curve25519" data-tools="pnacl" data-configs="Debug Release" data-path="nacl/pnacl/{config}">
|
<body class='signal' data-name="curve25519" data-tools="pnacl" data-configs="Debug Release" data-path="nacl/pnacl/{config}">
|
||||||
|
|
||||||
<div class='title-bar' id='header'>
|
<div class='title-bar' id='header'>
|
||||||
<button>●</button>
|
<button class='settings-btn'>●</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script type='text/x-tmpl-mustache' id='message'>
|
<script type='text/x-tmpl-mustache' id='message'>
|
||||||
|
|
||||||
<img class="avatar" src="#" alt="">
|
<img class="avatar" src="#" alt="">
|
||||||
<div class="bubble {{ bubble_class }}">
|
<div class="bubble {{ bubble_class }}">
|
||||||
<p class="content">{{ message }}</p>
|
<p class="content">{{ message }}</p>
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
</head>
|
</head>
|
||||||
<body class='signal index' data-name="curve25519" data-tools="pnacl" data-configs="Debug Release" data-path="nacl/pnacl/{config}">
|
<body class='signal index' data-name="curve25519" data-tools="pnacl" data-configs="Debug Release" data-path="nacl/pnacl/{config}">
|
||||||
<div class='title-bar' id='header'>
|
<div class='title-bar' id='header'>
|
||||||
<button>●</button>
|
<button class='settings-btn'>●</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button class="fab">+</button>
|
<button class="fab">+</button>
|
||||||
|
@ -58,8 +58,6 @@
|
||||||
|
|
||||||
<script type="text/javascript" src="js/chromium.js"></script>
|
<script type="text/javascript" src="js/chromium.js"></script>
|
||||||
|
|
||||||
<script type="text/javascript" src="js/panel_controller.js"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript" src="js/views/notifications.js"></script>
|
<script type="text/javascript" src="js/views/notifications.js"></script>
|
||||||
<script type="text/javascript" src="js/views/file_input_view.js"></script>
|
<script type="text/javascript" src="js/views/file_input_view.js"></script>
|
||||||
<script type="text/javascript" src="js/views/list_view.js"></script>
|
<script type="text/javascript" src="js/views/list_view.js"></script>
|
||||||
|
|
|
@ -223,13 +223,12 @@
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
extension.on('log', console.log.bind(console));
|
var windowMap = Whisper.windowMap = new Whisper.Bimap('windowId', 'modelId');
|
||||||
|
|
||||||
chrome.runtime.onConnect.addListener(function (port) {
|
// make sure panels are cleaned up on close
|
||||||
if (port.name === 'panel_presence') {
|
chrome.windows.onRemoved.addListener(function (windowId) {
|
||||||
port.onDisconnect.addListener(function (message) {
|
if (windowMap.windowId[windowId]) {
|
||||||
closeConversation(message.sender.tab.windowId);
|
closeConversation(windowId);
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
75
js/bimap.js
Normal file
75
js/bimap.js
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/*global $, Whisper, Backbone, textsecure, extension*/
|
||||||
|
/* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// A bidirectional hash that allows constant-time lookup for
|
||||||
|
// key -> value and value -> key
|
||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
window.Whisper = window.Whisper || {};
|
||||||
|
|
||||||
|
function Bimap (map1, map2) {
|
||||||
|
if (typeof map1 !== 'string' || typeof map2 !== 'string') {
|
||||||
|
throw 'Expected two map name strings as arguments';
|
||||||
|
}
|
||||||
|
|
||||||
|
this.bijection = {};
|
||||||
|
this.bijection[map1] = map2;
|
||||||
|
this.bijection[map2] = map1;
|
||||||
|
|
||||||
|
// makes accessing the maps clearer
|
||||||
|
this[map1] = {};
|
||||||
|
this[map2] = {};
|
||||||
|
|
||||||
|
this[map1 + 'From'] = function (key) { return this[map2][key]; };
|
||||||
|
this[map2 + 'From'] = function (key) { return this[map1][key]; };
|
||||||
|
}
|
||||||
|
|
||||||
|
Bimap.prototype.add = function (obj) {
|
||||||
|
if (typeof obj !== 'object') {
|
||||||
|
throw 'Expected an object as an argument';
|
||||||
|
}
|
||||||
|
|
||||||
|
var keys = Object.keys(obj);
|
||||||
|
var map1 = keys[0];
|
||||||
|
var map2 = keys[1];
|
||||||
|
|
||||||
|
if (this.bijection[map1] !== map2) {
|
||||||
|
throw 'Expected the argument\'s keys to correspond to the Bimap\'s two map names';
|
||||||
|
}
|
||||||
|
|
||||||
|
this[map1][obj[map1]] = obj[map2];
|
||||||
|
this[map2][obj[map2]] = obj[map1];
|
||||||
|
};
|
||||||
|
|
||||||
|
Bimap.prototype.remove = function remove (map, key) {
|
||||||
|
var bijection = this.bijection[map];
|
||||||
|
var correspondingKey = this[map][key];
|
||||||
|
|
||||||
|
// delete from the bijection
|
||||||
|
delete this[bijection][correspondingKey];
|
||||||
|
|
||||||
|
// delete from the specified map
|
||||||
|
delete this[map][key];
|
||||||
|
|
||||||
|
return correspondingKey;
|
||||||
|
};
|
||||||
|
|
||||||
|
// export
|
||||||
|
Whisper.Bimap = Bimap;
|
||||||
|
})();
|
|
@ -26,32 +26,16 @@
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var windowId, windowMap = JSON.parse(localStorage.getItem('idPairs'));
|
var bg = chrome.extension.getBackgroundPage();
|
||||||
|
|
||||||
window.addEventListener('storage', function (e) {
|
|
||||||
if (e.key = 'idPairs') {
|
|
||||||
windowMap = JSON.parse(e.newValue);
|
|
||||||
|
|
||||||
if (windowId) {
|
|
||||||
var conversationId = windowMap[windowId];
|
|
||||||
|
|
||||||
if (conversationId) {
|
|
||||||
loadConversation(conversationId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
chrome.windows.getCurrent(function (windowInfo) {
|
chrome.windows.getCurrent(function (windowInfo) {
|
||||||
window.document.title = windowId = windowInfo.id;
|
var windowId = window.document.title = windowInfo.id;
|
||||||
|
|
||||||
var conversationId = windowMap[windowId];
|
// close the panel if background.html is refreshed
|
||||||
|
bg.addEventListener('beforeunload', function () {
|
||||||
|
chrome.windows.remove(windowId);
|
||||||
|
});
|
||||||
|
|
||||||
if (typeof conversationId !== 'undefined') {
|
loadConversation(bg.Whisper.windowMap.modelIdFrom(windowId));
|
||||||
loadConversation(conversationId);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// lets background.js know when a panel disconnects
|
|
||||||
var port = chrome.runtime.connect({name: "panel_presence"});
|
|
||||||
}());
|
}());
|
||||||
|
|
|
@ -15,39 +15,22 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// This script should only be included in background.html
|
||||||
|
// Whisper.windowMap is defined in background.js
|
||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
window.Whisper = window.Whisper || {};
|
window.Whisper = window.Whisper || {};
|
||||||
|
|
||||||
// TODO: RJS
|
var windowMap = Whisper.windowMap;
|
||||||
// resetting for now, but super fragile:
|
|
||||||
// 1. if this file is included in conversation.html we're doomed.
|
|
||||||
// 2. if index.html is refreshed, duplicates can be opened
|
|
||||||
// 2.5. ...and refreshing conversation windows will fuck up.
|
|
||||||
if (!localStorage.getItem('activeConversations')) {
|
|
||||||
localStorage.setItem('activeConversations', '{}');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!localStorage.getItem('idPairs')) {
|
|
||||||
localStorage.setItem('idPairs', '{}');
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: RJS
|
|
||||||
// How do we normally export from modules like this?
|
|
||||||
// Is it necessary to have n copies of each of these scripts..?
|
|
||||||
// (n Whisper objects, etc in existence) Using localStorage for
|
|
||||||
// sync feels like a hack...
|
|
||||||
//
|
|
||||||
window.openConversation = function openConversation (modelId) {
|
window.openConversation = function openConversation (modelId) {
|
||||||
var activeConversations = JSON.parse(localStorage.getItem('activeConversations'));
|
|
||||||
var windowId = activeConversations[modelId];
|
var windowId = windowMap.windowIdFrom(modelId);
|
||||||
|
|
||||||
// prevent multiple copies of the same conversation from being opened
|
// prevent multiple copies of the same conversation from being opened
|
||||||
if (!windowId) {
|
if (!windowId) {
|
||||||
localStorage.setItem('activeConversations', JSON.stringify(activeConversations));
|
// open the panel
|
||||||
|
|
||||||
// open the window
|
|
||||||
chrome.windows.create({
|
chrome.windows.create({
|
||||||
url: 'conversation.html',
|
url: 'conversation.html',
|
||||||
type: 'panel',
|
type: 'panel',
|
||||||
|
@ -58,40 +41,26 @@
|
||||||
var idPairs = JSON.parse(localStorage.getItem('idPairs'));
|
var idPairs = JSON.parse(localStorage.getItem('idPairs'));
|
||||||
var newWindowId = windowInfo.id;
|
var newWindowId = windowInfo.id;
|
||||||
|
|
||||||
// TODO: RJS
|
windowMap.add({
|
||||||
// should we make a class for bijection?
|
windowId: windowInfo.id,
|
||||||
// bit sketchy that we have to keep these two hashes synced...
|
modelId: modelId
|
||||||
activeConversations[modelId] = newWindowId;
|
});
|
||||||
idPairs[newWindowId] = modelId;
|
|
||||||
|
|
||||||
localStorage.setItem('activeConversations', JSON.stringify(activeConversations));
|
|
||||||
localStorage.setItem('idPairs', JSON.stringify(idPairs));
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
try {
|
// focus the panel
|
||||||
chrome.windows.update(windowId, { focused: true }, function () {
|
chrome.windows.update(windowId, { focused: true }, function () {
|
||||||
if (chrome.runtime.lastError) {
|
if (chrome.runtime.lastError) {
|
||||||
window.closeConversation(windowId);
|
// panel isn't actually open...
|
||||||
} else {
|
window.closeConversation(windowId);
|
||||||
// Tab exists
|
|
||||||
}
|
// ...and so we try again.
|
||||||
});
|
openConversation(modelId);
|
||||||
} catch (err) {
|
}
|
||||||
// TODO: RJS
|
});
|
||||||
// - should check the err type
|
|
||||||
// - should open a new panel here
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
window.closeConversation = function closeConversation (windowId) {
|
window.closeConversation = function closeConversation (windowId) {
|
||||||
var activeConversations = JSON.parse(localStorage.getItem('activeConversations'));
|
windowMap.remove('windowId', windowId);
|
||||||
var idPairs = JSON.parse(localStorage.getItem('idPairs'));
|
|
||||||
|
|
||||||
delete activeConversations[idPairs[windowId]];
|
|
||||||
delete idPairs[windowId];
|
|
||||||
|
|
||||||
localStorage.setItem('activeConversations', JSON.stringify(activeConversations));
|
|
||||||
localStorage.setItem('idPairs', JSON.stringify(idPairs));
|
|
||||||
};
|
};
|
||||||
}());
|
})();
|
||||||
|
|
|
@ -19,6 +19,8 @@ var Whisper = Whisper || {};
|
||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
var bg = chrome.extension.getBackgroundPage();
|
||||||
|
|
||||||
// list of conversations, showing user/group and last message sent
|
// list of conversations, showing user/group and last message sent
|
||||||
Whisper.ConversationListItemView = Backbone.View.extend({
|
Whisper.ConversationListItemView = Backbone.View.extend({
|
||||||
tagName: 'div',
|
tagName: 'div',
|
||||||
|
@ -45,7 +47,7 @@ var Whisper = Whisper || {};
|
||||||
this.view = new Whisper.ConversationView({ model: this.model });
|
this.view = new Whisper.ConversationView({ model: this.model });
|
||||||
}
|
}
|
||||||
|
|
||||||
openConversation(modelId);
|
bg.openConversation(modelId);
|
||||||
|
|
||||||
this.model.collection.trigger('selected', this.view);
|
this.model.collection.trigger('selected', this.view);
|
||||||
},
|
},
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
collection: this.model.messageCollection
|
collection: this.model.messageCollection
|
||||||
});
|
});
|
||||||
$('#header').after(this.view.el);
|
$('#header').after(this.view.el);
|
||||||
//new ...({el: $(#conversation-container)})
|
|
||||||
this.model.fetchMessages({reset: true});
|
this.model.fetchMessages({reset: true});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -46,7 +46,9 @@
|
||||||
'submit .send': 'sendMessage',
|
'submit .send': 'sendMessage',
|
||||||
'close': 'remove',
|
'close': 'remove',
|
||||||
'click .destroy': 'destroyMessages',
|
'click .destroy': 'destroyMessages',
|
||||||
'click .new-group-update': 'newGroupUpdate'
|
'click .new-group-update': 'newGroupUpdate',
|
||||||
|
'click .settings-btn': 'toggleSettings',
|
||||||
|
'click .go-back': 'toggleSettings'
|
||||||
},
|
},
|
||||||
|
|
||||||
newGroupUpdate: function() {
|
newGroupUpdate: function() {
|
||||||
|
@ -83,20 +85,13 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/*addAll: function() {
|
toggleSettings: function (e) {
|
||||||
this.collection.each(this.addOne);
|
$('body').toggleClass('settings-open');
|
||||||
|
console.log('toggling');
|
||||||
|
debugger;
|
||||||
},
|
},
|
||||||
addOne: function(model) {
|
|
||||||
var view = new Whisper.Message({model: model});
|
|
||||||
view.render();
|
|
||||||
$(this.el).append(view.el);
|
|
||||||
model.bind('remove', view.remove);
|
|
||||||
},*/
|
|
||||||
|
|
||||||
render: function() {
|
render: function() {
|
||||||
//this.$el.empty();
|
|
||||||
//this.addAll();
|
|
||||||
|
|
||||||
this.delegateEvents();
|
this.delegateEvents();
|
||||||
this.view.delegateEvents();
|
this.view.delegateEvents();
|
||||||
this.view.scrollToBottom();
|
this.view.scrollToBottom();
|
||||||
|
|
|
@ -51,6 +51,7 @@ button {
|
||||||
font-size: 12px; }
|
font-size: 12px; }
|
||||||
|
|
||||||
.message-list {
|
.message-list {
|
||||||
|
margin-bottom: 52px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
@ -207,4 +208,12 @@ button {
|
||||||
.index .message-list {
|
.index .message-list {
|
||||||
display: none; }
|
display: none; }
|
||||||
|
|
||||||
|
.settings {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
background: red;
|
||||||
|
display: none; }
|
||||||
|
.settings-open .settings {
|
||||||
|
display: block; }
|
||||||
|
|
||||||
/*# sourceMappingURL=manifest.css.map */
|
/*# sourceMappingURL=manifest.css.map */
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"version": 3,
|
"version": 3,
|
||||||
"mappings": "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",
|
"mappings": "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",
|
||||||
"sources": ["view/_conversation.scss","_variables.scss"],
|
"sources": ["view/_conversation.scss","_variables.scss"],
|
||||||
"names": [],
|
"names": [],
|
||||||
"file": "manifest.css"
|
"file": "manifest.css"
|
||||||
|
|
|
@ -62,6 +62,7 @@ button {
|
||||||
}
|
}
|
||||||
|
|
||||||
.message-list {
|
.message-list {
|
||||||
|
margin-bottom: 36px + 16px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
@ -300,3 +301,14 @@ button {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.settings {
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
background: red;
|
||||||
|
display: none;
|
||||||
|
|
||||||
|
.settings-open & {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue