freeswitch/html5/verto/verto_communicator/src/vertoControllers/controllers/ChatController.js

228 lines
6.7 KiB
JavaScript

(function() {
'use strict';
angular
.module('vertoControllers')
.controller('ChatController', ['$scope', '$rootScope', '$http',
'$location', '$anchorScroll', '$timeout', 'verto', 'prompt',
function($scope, $rootScope, $http, $location, $anchorScroll, $timeout,
verto, prompt) {
console.debug('Executing ChatController.');
function scrollToChatBottom() {
// Going to the bottom of chat messages.
var obj = document.querySelector('.chat-messages');
obj.scrollTop = obj.scrollHeight;
//var chat_messages_top = jQuery('.chat-messages').scrollTop();
//var marker_position = jQuery('#chat-message-bottom').position().top;
//jQuery('.chat-messages').scrollTop(chat_messages_top + marker_position);
}
var CLEAN_MESSAGE = '';
function clearConferenceChat() {
$scope.members = [];
$scope.messages = [];
$scope.message = CLEAN_MESSAGE;
}
clearConferenceChat();
$scope.$watch('activePane', function() {
if ($scope.activePane == 'chat') {
$rootScope.chat_counter = 0;
}
$rootScope.activePane = $scope.activePane;
});
$rootScope.$on('chat.newMessage', function(event, data) {
data.created_at = new Date();
console.log('chat.newMessage', data);
$scope.$apply(function() {
$scope.messages.push(data);
if (data.from != verto.data.name &&
(!$scope.chatStatus && $scope.activePane != 'chat')) {
++$rootScope.chat_counter;
}
$timeout(function() {
scrollToChatBottom();
}, 300);
});
});
function findMemberByUUID(uuid) {
var found = false;
for (var idx in $scope.members) {
var member = $scope.members[idx];
if (member.uuid == uuid) {
found = true;
break;
}
}
if (found) {
return idx;
} else {
return -1;
}
}
function translateMember(member) {
return {
'uuid': member[0],
'id': member[1][0],
'number': member[1][1],
'name': member[1][2],
'codec': member[1][3],
'status': JSON.parse(member[1][4]),
'email': member[1][5].email
};
}
function addMember(member) {
$scope.members.push(translateMember(member));
}
$rootScope.$on('members.boot', function(event, members) {
$scope.$apply(function() {
clearConferenceChat();
for (var idx in members) {
var member = members[idx];
addMember(member);
}
})
});
$rootScope.$on('members.add', function(event, member) {
$scope.$apply(function() {
addMember(member);
});
});
$rootScope.$on('members.del', function(event, uuid) {
$scope.$apply(function() {
var memberIdx = findMemberByUUID(uuid);
if (memberIdx != -1) {
// Removing the member.
$scope.members.splice(memberIdx, 1);
}
});
});
$rootScope.$on('members.update', function(event, member) {
member = translateMember(member);
var memberIdx = findMemberByUUID(member.uuid);
if (memberIdx < 0) {
console.log('Didn\'t find the member uuid ' + member.uuid);
} else {
$scope.$apply(function() {
// console.log('Updating', memberIdx, ' <', $scope.members[memberIdx],
// '> with <', member, '>');
// Checking if it's me
if (parseInt(member.id) == parseInt(verto.data.conferenceMemberID)) {
verto.data.mutedMic = member.status.audio.muted;
verto.data.mutedVideo = member.status.video.muted;
verto.data.call.setMute(member.status.audio.muted ? "off" : "on");
verto.data.call.setVideoMute(member.status.video.muted ? "off" : "on");
}
angular.extend($scope.members[memberIdx], member);
});
}
});
$rootScope.$on('members.clear', function(event) {
$scope.$applyAsync(function() {
clearConferenceChat();
$scope.closeChat();
});
});
/**
* Public methods.
*/
$scope.send = function() {
// Only conferencing chat is supported for now
// but still calling method with the conference prefix
// so we know that explicitly.
verto.sendConferenceChat($scope.message);
$scope.message = CLEAN_MESSAGE;
};
// Participants moderation.
$scope.confKick = function(memberID) {
console.log('$scope.confKick');
verto.data.conf.kick(memberID);
};
$scope.confMuteMic = function(memberID) {
if(verto.data.confRole == 'moderator') {
console.log('$scope.confMuteMic');
verto.data.conf.muteMic(memberID);
}
};
$scope.confMuteVideo = function(memberID) {
if(verto.data.confRole == 'moderator') {
console.log('$scope.confMuteVideo');
verto.data.conf.muteVideo(memberID);
}
};
$scope.confPresenter = function(memberID) {
console.log('$scope.confPresenter');
verto.data.conf.presenter(memberID);
};
$scope.confVideoFloor = function(memberID) {
console.log('$scope.confVideoFloor');
verto.data.conf.videoFloor(memberID);
};
$scope.confBanner = function(memberID) {
console.log('$scope.confBanner');
prompt({
title: 'Please insert the banner text',
input: true,
label: '',
value: '',
}).then(function(text) {
if (text) {
verto.data.conf.banner(memberID, text);
}
});
};
$scope.confResetBanner = function(memberID) {
console.log('$scope.confResetBanner');
var text = 'reset';
verto.data.conf.banner(memberID, text);
};
$scope.confVolumeDown = function(memberID) {
console.log('$scope.confVolumeDown');
verto.data.conf.volumeDown(memberID);
};
$scope.confVolumeUp = function(memberID) {
console.log('$scope.confVolumeUp');
verto.data.conf.volumeUp(memberID);
};
$scope.confTransfer = function(memberID) {
console.log('$scope.confTransfer');
prompt({
title: 'Transfer party?',
message: 'To what destination would you like to transfer this call?',
input: true,
label: 'Destination',
value: '',
}).then(function(exten) {
if (exten) {
verto.data.conf.transfer(memberID, exten);
}
});
};
}
]);
})();