gecko-dev/browser/components/loop/standalone/content/js/standaloneAppStore.js

148 lines
3.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.store = loop.store || {};
/**
* Manages the conversation window app controller view. Used to get
* the window data and store the window type.
*/
loop.store.StandaloneAppStore = (function() {
"use strict";
var sharedActions = loop.shared.actions;
var sharedUtils = loop.shared.utils;
var OLD_STYLE_CALL_REGEXP = /\#call\/(.*)/;
var NEW_STYLE_CALL_REGEXP = /\/c\/([\w\-]+)$/;
var ROOM_REGEXP = /\/([\w\-]+)$/;
/**
* Constructor
*
* @param {Object} options Options for the store. Should contain the dispatcher.
*/
var StandaloneAppStore = function(options) {
if (!options.dispatcher) {
throw new Error("Missing option dispatcher");
}
if (!options.sdk) {
throw new Error("Missing option sdk");
}
if (!options.helper) {
throw new Error("Missing option helper");
}
if (!options.conversation) {
throw new Error("Missing option conversation");
}
this._dispatcher = options.dispatcher;
this._storeState = {};
this._sdk = options.sdk;
this._helper = options.helper;
this._conversation = options.conversation;
this._dispatcher.register(this, [
"extractTokenInfo"
]);
};
StandaloneAppStore.prototype = _.extend({
/**
* Retrieves current store state.
*
* @return {Object}
*/
getStoreState: function() {
return this._storeState;
},
/**
* Updates store states and trigger a "change" event.
*
* @param {Object} state The new store state.
*/
setStoreState: function(state) {
this._storeState = state;
this.trigger("change");
},
_extractWindowDataFromPath: function(windowPath) {
var match;
var windowType = "home";
function extractId(path, regexp) {
var match = path.match(regexp);
if (match && match[1]) {
return match;
}
return null;
}
if (windowPath) {
// Is this a call url (the hash is a backwards-compatible url)?
match = extractId(windowPath, OLD_STYLE_CALL_REGEXP) ||
extractId(windowPath, NEW_STYLE_CALL_REGEXP);
if (match) {
windowType = "outgoing";
} else {
// Is this a room url?
match = extractId(windowPath, ROOM_REGEXP);
if (match) {
windowType = "room";
}
}
}
return [windowType, match && match[1] ? match[1] : null];
},
/**
* Handles the extract token info action - obtains the token information
* and its type; updates the store and notifies interested components.
*
* @param {sharedActions.GetWindowData} actionData The action data
*/
extractTokenInfo: function(actionData) {
var windowType = "home";
var token;
// Check if we're on a supported device/platform.
if (this._helper.isIOS(navigator.platform)) {
windowType = "unsupportedDevice";
} else if (!this._sdk.checkSystemRequirements()) {
windowType = "unsupportedBrowser";
} else if (actionData.windowPath) {
// ES6 not used in standalone yet.
var result = this._extractWindowDataFromPath(actionData.windowPath);
windowType = result[0];
token = result[1];
}
// Else type is home.
if (token) {
this._conversation.set({loopToken: token});
}
this.setStoreState({
windowType: windowType
});
// If we've not got a window ID, don't dispatch the action, as we don't need
// it.
if (token) {
this._dispatcher.dispatch(new loop.shared.actions.FetchServerData({
token: token,
windowType: windowType
}));
}
}
}, Backbone.Events);
return StandaloneAppStore;
})();