/**
*
* @copyright Copyright (c) 2018, Daniel Calviño Sánchez (danxuliu@gmail.com)
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*
*/
(function(OCA) {
'use strict';
var roomsChannel = Backbone.Radio.channel('rooms');
OCA.Talk = OCA.Talk || {};
OCA.Talk.PublicShareAuth = {
init: function() {
var self = this;
this.setupRequestPasswordButton();
this.setupLayoutForTalkSidebar();
this.setupSignalingEventHandlers();
$('#request-password-button').click(function() {
$('.request-password-wrapper + .error-message').hide();
$('#request-password-button').prop('disabled', 'true');
$('.request-password-wrapper .icon')
.removeClass('icon-confirm-white')
.addClass('icon-loading-small-dark');
self.requestPassword();
});
},
setupRequestPasswordButton: function() {
// "submit-wrapper" is used to mimic the login button and thus get
// automatic colouring of the confirm icon by the Theming app
$('main').append('
');
},
setupLayoutForTalkSidebar: function() {
$('body').append('');
$('body').append('');
$('#content').append($('.wrapper'));
$('#content').append($('footer'));
$('body').append('');
$('#talk-sidebar').append('');
$('#talk-sidebar').append('');
$('#call-container').append('');
$('#call-container').append('');
OCA.SpreedMe.app.mainCallElementSelector = '#call-container';
OCA.SpreedMe.app._emptyContentView = new OCA.SpreedMe.Views.EmptyContentView({
el: '#talk-sidebar > #emptycontent'
});
OCA.SpreedMe.app._localVideoView.render();
$('#videos').append(OCA.SpreedMe.app._localVideoView.$el);
$('body').addClass('talk-sidebar-enabled');
},
requestPassword: function() {
var self = this;
var shareToken = $('#sharingToken').val();
if (this.hideTalkSidebarTimeout) {
clearTimeout(this.hideTalkSidebarTimeout);
delete this.hideTalkSidebarTimeout;
}
$.ajax({
url: OC.linkToOCS('apps/spreed/api/v1', 2) + 'publicshareauth',
type: 'POST',
data: {
shareToken: shareToken,
},
beforeSend: function(request) {
request.setRequestHeader('Accept', 'application/json');
},
success: function(ocsResponse) {
self.setupRoom(ocsResponse.ocs.data.token);
},
error: function() {
$('.request-password-wrapper .icon')
.removeClass('icon-loading-small-dark')
.addClass('icon-confirm-white');
$('#request-password-button').prop('disabled', '');
var errorMessage = $('.request-password-wrapper + .error-message');
if (errorMessage.length > 0) {
errorMessage.show();
} else {
$('.request-password-wrapper').after('' + t('spreed', 'Error requesting the password.') + '
');
}
}
});
},
setupSignalingEventHandlers: function() {
var self = this;
OCA.SpreedMe.app.signaling.on('joinRoom', function(joinedRoomToken) {
if (OCA.SpreedMe.app.token !== joinedRoomToken) {
return;
}
function setPageTitle(title) {
if (title) {
title += ' - ';
} else {
title = '';
}
title += t('spreed', 'Talk');
title += ' - ' + oc_defaults.title;
window.document.title = title;
}
OCA.SpreedMe.app.signaling.syncRooms().then(function() {
OCA.SpreedMe.app._chatView.$el.appendTo('#talk-sidebar');
OCA.SpreedMe.app._chatView.setTooltipContainer($('body'));
OCA.SpreedMe.app._emptyContentView.setActiveRoom(OCA.SpreedMe.app.activeRoom);
setPageTitle(OCA.SpreedMe.app.activeRoom.get('displayName'));
OCA.SpreedMe.app._chatView.setRoom(OCA.SpreedMe.app.activeRoom);
OCA.SpreedMe.app._messageCollection.setRoomToken(OCA.SpreedMe.app.activeRoom.get('token'));
OCA.SpreedMe.app._messageCollection.receiveMessages();
self.showTalkSidebar();
OCA.SpreedMe.app.connection.joinCall(joinedRoomToken);
});
});
// TODO This should listen to "leaveRoom" on signaling instead, but
// that would cause an ugly flicker due to the order in which the UI
// elements would be modified (as the empty content message and the
// "incall" CSS class are both modified when handling
// "leaveCurrentRoom").
roomsChannel.on('leaveCurrentRoom', function() {
OCA.SpreedMe.app._chatView.$el.detach();
self.leaveRoom();
});
},
setupRoom: function(token) {
OCA.SpreedMe.app.activeRoom = new OCA.SpreedMe.Models.Room({token: token});
OCA.SpreedMe.app.signaling.setRoom(OCA.SpreedMe.app.activeRoom);
OCA.SpreedMe.app.token = token;
OCA.SpreedMe.app.signaling.joinRoom(token);
},
leaveRoom: function() {
$('.request-password-wrapper .icon')
.removeClass('icon-loading-small-dark')
.addClass('icon-confirm-white');
$('#request-password-button').prop('disabled', '');
this.hideTalkSidebarTimeout = setTimeout(this.hideTalkSidebar, 5000);
},
showTalkSidebar: function() {
$('#talk-sidebar').removeClass('disappear');
},
hideTalkSidebar: function() {
$('#talk-sidebar').addClass('disappear');
delete this.hideTalkSidebarTimeout;
},
};
OCA.SpreedMe.app = new OCA.Talk.Embedded();
OCA.SpreedMe.app.on('start', function() {
OCA.Talk.PublicShareAuth.init();
});
// Unlike in the regular Talk app when Talk is embedded the signaling
// settings are not initially included in the HTML, so they need to be
// explicitly loaded before starting the app.
OCA.Talk.Signaling.loadSettings().then(function() {
OCA.SpreedMe.app.start();
});
})(OCA);