jam-cloud/web/app/assets/javascripts/voiceChatHelper.js

261 lines
8.4 KiB
JavaScript

(function (context, $) {
"use strict";
context.JK = context.JK || {};
context.JK.VoiceChatHelper = function (app) {
var logger = context.JK.logger;
var ASSIGNMENT = context.JK.ASSIGNMENT;
var VOICE_CHAT = context.JK.VOICE_CHAT;
var MAX_TRACKS = context.JK.MAX_TRACKS;
var MAX_OUTPUTS = context.JK.MAX_OUTPUTS;
var gearUtils = context.JK.GearUtils;
var $parent = null;
var $reuseAudioInputRadio = null;
var $useChatInputRadio = null;
var $chatInputs = null;
var $templateChatInput = null;
var $selectedChatInput = null;// should only be used if isChatEnabled = true
var saveImmediate = null; // if true, then every action by the user results in a save to the backend immediately, false means you have to call trySave to persist
// needed because iCheck fires iChecked event even when you programmatically change it, unlike when using .val(x)
var ignoreICheckEvent = false;
function defaultReuse() {
suppressChange(function(){
$reuseAudioInputRadio.iCheck('check').attr('checked', 'checked');
$useChatInputRadio.removeAttr('checked');
})
}
function isChatEnabled() {
return $useChatInputRadio.is(':checked');
}
function reset(forceDisabledChat) {
$selectedChatInput = null;
if(!forceDisabledChat && context.jamClient.TrackGetChatEnable()) {
enableChat(false);
}
else {
disableChat(false);
}
$chatInputs.empty();
var chatInputs = gearUtils.getChatInputs();
context._.each(chatInputs, function(chatInput) {
if(chatInput.assignment > 0) {
return;
}
var chatChannelName = chatInput.name;
var chatChannelId = chatInput.id;
var isCurrentlyChat = chatInput.assignment == ASSIGNMENT.CHAT;
var $chat = $(context._.template($templateChatInput.html(), {id: chatChannelId, name: chatChannelName}, { variable: 'data' }));
var $chatInput = $chat.find('input');
if(isCurrentlyChat) {
$selectedChatInput = $chatInput;
$selectedChatInput.attr('checked', 'checked');
}
$chat.hide(); // we'll show it once it's styled with iCheck
$chatInputs.append($chat);
});
var $radioButtons = $chatInputs.find('input[name="chat-device"]');
context.JK.checkbox($radioButtons).on('ifChecked', function(e) {
var $input = $(e.currentTarget);
$selectedChatInput = $input; // for use in handleNext
if(saveImmediate) {
var channelId = $input.attr('data-channel-id');
context.jamClient.TrackSetAssignment(channelId, true, ASSIGNMENT.CHAT);
var result = context.jamClient.TrackSaveAssignments();
if(!result || result.length == 0) {
// success
}
else {
context.JK.Banner.showAlert('Unable to save assignments. ' + result);
return false;
}
}
});
if(!isChatEnabled()) {
disableChatButtonsUI();
}
$chatInputs.find('.chat-input').show().on('click', function() {
// obnoxious; remove soon XXX
// if(!isChatEnabled()) {
// context.JK.prodBubble($parent.find('.use-chat-input h3'), 'chat-not-enabled', {}, { positions:['left']});
// }
})
}
function disableChatButtonsUI() {
var $radioButtons = $chatInputs.find('input[name="chat-device"]');
$radioButtons.iCheck('disable')
$chatInputs.addClass('disabled');
}
function enableChatButtonsUI() {
var $radioButtons = $chatInputs.find('input[name="chat-device"]');
$radioButtons.iCheck('enable')
$chatInputs.removeClass('disabled');
}
function suppressChange(proc) {
ignoreICheckEvent = true;
try {
proc();
}
finally {
ignoreICheckEvent = false;
}
}
function disableChat(applyToBackend) {
if(saveImmediate && applyToBackend) {
logger.debug("voiceChatHelper: disabling chat to backend");
var state = getCurrentState();
//context.jamClient.TrackSetChatEnable(false);
//if(state.chat_channel) {
// context.jamClient.TrackSetAssignment(state.chat_channel, true, ASSIGNMENT.UNASSIGNED);
//}
context.jamClient.FTUEClearChatInput();
var result = context.jamClient.TrackSaveAssignments();
if(!result || result.length == 0) {
// success
suppressChange(function() {
$reuseAudioInputRadio.iCheck('check').attr('checked', 'checked');
$useChatInputRadio.removeAttr('checked');
})
}
else {
context.JK.Banner.showAlert('Unable to disable chat. ' + result);
return false;
}
}
else {
logger.debug("voiceChatHelper: disabling chat UI only");
suppressChange(function() {
$reuseAudioInputRadio.iCheck('check').attr('checked', 'checked');
$useChatInputRadio.removeAttr('checked');
})
}
disableChatButtonsUI()
}
function enableChat(applyToBackend) {
if(saveImmediate && applyToBackend) {
logger.debug("voiceChatHelper: enabling chat to backend");
context.jamClient.TrackSetChatEnable(true);
var result = context.jamClient.TrackSaveAssignments();
if(!result || result.length == 0) {
// success
suppressChange(function() {
$useChatInputRadio.iCheck('check').attr('checked', 'checked');
$reuseAudioInputRadio.removeAttr('checked');
})
}
else {
context.JK.Banner.showAlert('Unable to enable chat. ' + result);
return false;
}
}
else {
logger.debug("voiceChatHelper: enabling chat UI only");
suppressChange(function() {
$useChatInputRadio.iCheck('check').attr('checked', 'checked');
$reuseAudioInputRadio.removeAttr('checked');
})
}
enableChatButtonsUI();
}
function handleChatEnabledToggle() {
context.JK.checkbox($reuseAudioInputRadio);
context.JK.checkbox($useChatInputRadio);
// plugin sets to relative on the element; have to do this as an override
$reuseAudioInputRadio.closest('.iradio_minimal').css('position', 'absolute');
$useChatInputRadio.closest('.iradio_minimal').css('position', 'absolute');
$reuseAudioInputRadio.on('ifChecked', function() { if(!ignoreICheckEvent) disableChat(true) });
$useChatInputRadio.on('ifChecked', function() { if(!ignoreICheckEvent) enableChat(true) });
}
// gets the state of the UI
function getCurrentState() {
var state = {
enabled:null,
chat_channel:null
};
state.enabled = $useChatInputRadio.is(':checked');
state.chat_channel = $selectedChatInput && $selectedChatInput.attr('data-channel-id');
logger.debug("desired chat state: enabled=" + state.enabled + ", chat_channel=" + state.chat_channel)
return state;
}
function trySave() {
var state = getCurrentState();
if(state.enabled && state.chat_channel) {
logger.debug("enabling chat. chat_channel=" + state.chat_channel);
context.jamClient.TrackSetChatEnable(true);
context.jamClient.FTUESetChatInput(state.chat_channel);
//context.jamClient.TrackSetAssignment(state.chat_channel, true, ASSIGNMENT.CHAT);
}
else {
logger.debug("disabling chat.");
context.jamClient.FTUEClearChatInput();
//context.jamClient.TrackSetChatEnable(false);
//if(state.chat_channel) {
//context.jamClient.TrackSetAssignment(state.chat_channel, true, ASSIGNMENT.UNASSIGNED);
//}
}
var result = context.jamClient.TrackSaveAssignments();
if(!result || result.length == 0) {
// success
return true;
}
else {
context.JK.Banner.showAlert('Unable to save chat assignments. ' + result);
return false;
}
}
function initialize(_$step, _saveImmediate) {
$parent = _$step;
saveImmediate = _saveImmediate;
$reuseAudioInputRadio = $parent.find('.reuse-audio-input input');
$useChatInputRadio = $parent.find('.use-chat-input input');
$chatInputs = $parent.find('.chat-inputs');
$templateChatInput = $('#template-chat-input');
handleChatEnabledToggle();
}
this.reset = reset;
this.trySave = trySave;
this.initialize = initialize;
return this;
};
})(window, jQuery);