191 lines
4.9 KiB
JavaScript

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
/* global loop:true */
var loop = loop || {};
loop.conversation = (function(OT, mozL10n) {
"use strict";
var sharedViews = loop.shared.views;
/**
* App router.
* @type {loop.desktopRouter.DesktopConversationRouter}
*/
var router;
/**
* Incoming call view.
* @type {loop.shared.views.BaseView}
*/
var IncomingCallView = sharedViews.BaseView.extend({
template: _.template([
'<h2 data-l10n-id="incoming_call"></h2>',
'<p>',
' <button class="btn btn-success btn-accept"',
' data-l10n-id="accept_button"></button>',
' <button class="btn btn-error btn-decline"',
' data-l10n-id="decline_button"></button>',
'</p>'
].join("")),
className: "incoming-call",
events: {
"click .btn-accept": "handleAccept",
"click .btn-decline": "handleDecline"
},
/**
* User clicked on the "accept" button.
* @param {MouseEvent} event
*/
handleAccept: function(event) {
event.preventDefault();
this.model.trigger("accept");
},
/**
* User clicked on the "decline" button.
* @param {MouseEvent} event
*/
handleDecline: function(event) {
event.preventDefault();
// XXX For now, we just close the window.
window.close();
}
});
/**
* Call ended view.
* @type {loop.shared.views.BaseView}
*/
var EndedCallView = sharedViews.BaseView.extend({
template: _.template([
'<p>',
' <button class="btn btn-info" data-l10n-id="close_window"></button>',
'</p>'
].join("")),
className: "call-ended",
events: {
"click button": "closeWindow"
},
closeWindow: function(event) {
event.preventDefault();
// XXX For now, we just close the window.
window.close();
}
});
/**
* Conversation router.
*
* Required options:
* - {loop.shared.models.ConversationModel} conversation Conversation model.
* - {loop.shared.components.Notifier} notifier Notifier component.
*
* @type {loop.shared.router.BaseConversationRouter}
*/
var ConversationRouter = loop.desktopRouter.DesktopConversationRouter.extend({
routes: {
"incoming/:version": "incoming",
"call/accept": "accept",
"call/ongoing": "conversation",
"call/ended": "ended"
},
/**
* @override {loop.shared.router.BaseConversationRouter.startCall}
*/
startCall: function() {
this.navigate("call/ongoing", {trigger: true});
},
/**
* @override {loop.shared.router.BaseConversationRouter.endCall}
*/
endCall: function() {
this.navigate("call/ended", {trigger: true});
},
/**
* Incoming call route.
*
* @param {String} loopVersion The version from the push notification, set
* by the router from the URL.
*/
incoming: function(loopVersion) {
this._conversation.set({loopVersion: loopVersion});
this._conversation.once("accept", function() {
this.navigate("call/accept", {trigger: true});
}.bind(this));
this.loadView(new IncomingCallView({model: this._conversation}));
},
/**
* Accepts an incoming call.
*/
accept: function() {
this._conversation.initiate({
baseServerUrl: window.navigator.mozLoop.serverUrl,
outgoing: false
});
},
/**
* conversation is the route when the conversation is active. The start
* route should be navigated to first.
*/
conversation: function() {
if (!this._conversation.isSessionReady()) {
console.error("Error: navigated to conversation route without " +
"the start route to initialise the call first");
this._notifier.errorL10n("cannot_start_call_session_not_ready");
return;
}
this.loadView(
new loop.shared.views.ConversationView({
sdk: OT,
model: this._conversation
}));
},
/**
* XXX: load a view with a close button for now?
*/
ended: function() {
this.loadView(new EndedCallView());
}
});
/**
* Panel initialisation.
*/
function init() {
// Do the initial L10n setup, we do this before anything
// else to ensure the L10n environment is setup correctly.
mozL10n.initialize(window.navigator.mozLoop);
document.title = mozL10n.get("incoming_call_title");
router = new ConversationRouter({
conversation: new loop.shared.models.ConversationModel({}, {sdk: OT}),
notifier: new sharedViews.NotificationListView({el: "#messages"})
});
Backbone.history.start();
}
return {
ConversationRouter: ConversationRouter,
EndedCallView: EndedCallView,
IncomingCallView: IncomingCallView,
init: init
};
})(window.OT, document.mozL10n);