jam-cloud/web/app/assets/javascripts/wizard/gear/gear_wizard.js

260 lines
8.1 KiB
JavaScript

(function (context, $) {
"use strict";
context.JK = context.JK || {};
context.JK.GearWizard = function (app) {
var logger = context.JK.logger;
var sessionUtils = context.JK.SessionUtils;
var $dialog = null;
var wizard = null;
var $wizardSteps = null;
var $templateSteps = null;
var loopbackWizard = null;
var adjustGearSettings = null;
var inputs = null;
var self = this;
var STEP_INTRO = 0;
var STEP_SELECT_DEVICE = 1;
var STEP_SELECT_TRACKS = 2;
var STEP_SELECT_CHAT = 3;
var STEP_DIRECT_MONITOR = 4;
var STEP_VIDEO_GEAR = 5;
var STEP_ROUTER_NETWORK = 6;
var STEP_SUCCESS = 7;
var stepUnderstandGear = new context.JK.StepUnderstandGear(app, this);
var stepSelectGear = new context.JK.StepSelectGear(app, this);
var stepConfigureTracks = new context.JK.StepConfigureTracks(app, this);
var stepConfigureVoiceChat = new context.JK.StepConfigureVoiceChat(app, this);
var stepDirectMonitoring = new context.JK.StepDirectMonitoring(app, this);
var stepVideoGear = new context.JK.StepVideoGear(app, this);
var stepNetworkTest = new context.JK.StepNetworkTest(app, this);
var stepSuccess = new context.JK.StepSuccess(app, this);
var STEPS = {
0: stepUnderstandGear,
1: stepSelectGear,
2: stepConfigureTracks,
3: stepConfigureVoiceChat,
4: stepDirectMonitoring
}
function newSession() {
inputs = null;
context._.each(STEPS, function(stepInfo, stepNumber) {
if(stepInfo.newSession) {
stepInfo.newSession.call(stepInfo);
}
});
}
function onStepChanged(e, data) {
var step = wizard.getCurrentStep();
var $currentWizardStep = wizard.getCurrentWizardStep();
// update ftue step numbers
var $ftueSteps = $(context._.template($templateSteps.html(), {}, { variable: 'data' }));
var $activeStep = $ftueSteps.find('.ftue-stepnumber[data-step-number="' + step + '"]');
$activeStep.addClass('.active');
$activeStep.next().show(); // show the .ftue-step-title
$currentWizardStep.find('.ftuesteps').replaceWith($ftueSteps);
}
// checks if we already have a profile called 'FTUE...'; if not, create one. if so, re-use it.
function createFTUEProfile() {
var profileName = context.jamClient.FTUEGetMusicProfileName();
logger.debug("current profile name: " + profileName);
if(profileName && profileName.indexOf('FTUE') == 0) {
// remove junk
context.jamClient.TrackDeleteProfile(profileName);
}
var newProfileName = 'FTUEAttempt-' + new Date().getTime().toString();
logger.debug("setting FTUE-prefixed profile name to: " + newProfileName);
context.jamClient.FTUESetMusicProfileName(newProfileName);
if(context.jamClient.FTUESetPreferredMixerSampleRate) {
context.jamClient.FTUESetPreferredMixerSampleRate(1);
context.jamClient.FTUESetPreferredOutputSampleRate(1);
context.jamClient.FTUESetPreferredChatSampleRate(1);
}
context.jamClient.FTUEClearChannelAssignments();
newSession();
var profileName = context.jamClient.FTUEGetMusicProfileName();
logger.debug("name on exit: " + profileName);
}
function beforeShow(args) {
//context.jamClient.FTUECancel();
context.jamClient.FTUESetStatus(false);
createFTUEProfile();
sessionUtils.FTUEPageEnter();
wizard.onBeforeShow(args);
}
function afterShow() {
if(window.olark) olark('api.box.show');
}
function afterHide() {
if(window.olark) olark('api.box.hide');
wizard.onAfterHide();
context.jamClient.FTUESetStatus(true);
context.jamClient.FTUECancel();
sessionUtils.FTUEPageLeave();
}
function reportFailureAnalytics() {
// on cancel, see if the user is leaving without having passed the audio test; if so, report it
var lastAnalytics = stepSelectGear.getLastAudioTestFailAnalytics();
if(lastAnalytics) {
logger.debug("reporting audio test failed")
context.JK.GA.trackAudioTestFailure(lastAnalytics.platform, lastAnalytics.reason, lastAnalytics.data);
}
else {
logger.debug("audiotest failure: nothing to report");
}
var lastAnalytics = stepNetworkTest.getLastNetworkFailAnalytics();
if(lastAnalytics) {
logger.debug("reporting network test failed");
context.JK.GA.trackNetworkTestFailure(lastAnalytics.reason, lastAnalytics.data);
}
else {
logger.debug("network test failure: nothing to report");
}
}
function onCanceled() {
reportFailureAnalytics();
if (app.cancelFtue) {
app.cancelFtue();
app.afterFtue = null;
app.cancelFtue = null;
}
return closeDialog();
}
function onClosed() {
reportFailureAnalytics();
if (app.afterFtue) {
// If there's a function to invoke, invoke it.
app.afterFtue();
app.afterFtue = null;
app.cancelFtue = null;
}
return closeDialog();
}
function closeDialog() {
wizard.onCloseDialog();
app.layout.closeDialog('gear-wizard');
return false;
}
function events() {
$(wizard).on('step_changed', onStepChanged);
$(wizard).on('wizard_cancel', onCanceled);
$(wizard).on('wizard_close', onClosed);
}
function setNextState(enabled) {
wizard.setNextState(enabled);
}
function setBackState(enabled) {
wizard.setBackState(enabled);
}
function moveToNext() {
wizard.moveToNext();
}
function setChosenInputs(_inputs) {
inputs = _inputs;
}
function getChosenInputs() {
return inputs;
}
function initialize(_loopbackWizard, _adjustGearSettings) {
loopbackWizard = _loopbackWizard;
adjustGearSettings = _adjustGearSettings;
// on initial page load, we are not in the FTUE. so cancel the FTUE and call FTUESetStatus(true) if needed
if(context.jamClient.FTUEGetStatus() == false) {
context.jamClient.FTUESetStatus(true);
}
//context.jamClient.FTUECancel();
var dialogBindings = { beforeShow: beforeShow, afterShow: afterShow, afterHide: afterHide };
app.bindDialog('gear-wizard', dialogBindings);
$dialog = $('#gear-wizard-dialog');
$wizardSteps = $dialog.find('.wizard-step');
$templateSteps = $('#template-ftuesteps');
var videoGear = $wizardSteps.filter($('.video-gear'))
var networkTest = $wizardSteps.filter($('.network-test'))
wizard = new context.JK.Wizard(app);
stepUnderstandGear.initialize($wizardSteps.filter($('[layout-wizard-step=0]')), self);
stepSelectGear.initialize($wizardSteps.filter($('[layout-wizard-step=1]')), self);
stepConfigureTracks.initialize($wizardSteps.filter($('[layout-wizard-step=2]')), self);
stepConfigureVoiceChat.initialize($wizardSteps.filter($('[layout-wizard-step=3]')), self);
stepDirectMonitoring.initialize($wizardSteps.filter($('[layout-wizard-step=4]')), self);
stepSuccess.initialize($wizardSteps.filter($('.success')), self);
var dynamicStepCount = 5
if(videoGear.length) {
stepVideoGear.initialize(videoGear, self);
STEPS[dynamicStepCount++] = stepVideoGear
}
if(networkTest.length) {
stepNetworkTest.initialize($wizardSteps.filter($('.network-test')), self);
STEPS[dynamicStepCount++] = stepNetworkTest
}
STEPS[dynamicStepCount++]=stepSuccess
wizard.initialize($dialog, $wizardSteps, STEPS);
events();
}
this.setChosenInputs = setChosenInputs; // so step 2 can 'talk' to step 3
this.getChosenInputs = getChosenInputs;
this.setNextState = setNextState;
this.setBackState = setBackState;
this.moveToNext = moveToNext;
this.initialize = initialize;
this.createFTUEProfile = createFTUEProfile;
this.getWizard = function() {return wizard; }
this.getLoopbackWizard = function() { return loopbackWizard; };
this.getAdjustGearSettings = function() { return adjustGearSettings; };
self = this;
return this;
};
})(window, jQuery);