Model: model_1.js
This is the JavaScript Model for the class_1()
Class.
/**
* All of the information about a example "access method" may be needed to link to a native or web deepstate.
*
* @param {string} accessUrl - Native or web link to access the deepstate.
*
* @param {string} packageName - Unique identifier for Android apps. ex. 'com.yelp.android'
*
* @param {string} action - Android specific. Should default to 'android.intent.action.VIEW' on Chrome
*
* @param {string} category - Android specific. Supported in Chrome Intent URIs.
*
* @param {string} component - Android specific. Supported in Chrome Intent URIs.
*
* @param {Array} editions - Our example-defined structure of an app 'edition'
*
* @param {Array} extra - Android specific. Not currently supported in Chrome Intent URIs but could be later.
*
* @param {string} method - example defined. Tells us how we should lauch the deeplink. ie. "launchIntentViaJSON" means we should use Intent params but not AccessUrl if Chrome
*
* @constructor
* @memberof example
*/
function AccessMethod(accessUrl, packageName, action, category, component, editions, extra, method) {
this.accessUrl = accessUrl;
this.packageName = packageName;
this.action = action;
this.category = category;
this.component = component;
this.editions = editions;
this.extra = extra;
this.method = method;
}
/**
* Creates an AccessMethod from one of the objects in the 'accessMethods' array returned by the example API.
* The API response includes 'jar' is only relevant to example Android-sdk.
*
* @param {object} stateAccessInfoObj - The API object representing this AccessMethod.
*/
AccessMethod.fromStateAccessInfoObject = function(stateAccessInfoObj) {
var packageName = (!stateAccessInfoObj.editions || !stateAccessInfoObj.editions.length)
? null
: stateAccessInfoObj.editions[0].packageName;
return new AccessMethod(stateAccessInfoObj.accessUrl, packageName, stateAccessInfoObj.action, stateAccessInfoObj.category, stateAccessInfoObj.component, stateAccessInfoObj.editions, stateAccessInfoObj.extra, stateAccessInfoObj.method);
};
/**
* Whether this client (given the information we parsed out of their user agent) can apply a given access method.
*
* @param {object} client - The client object created by redirector.detectClient
*/
AccessMethod.prototype.isApplicable = function(client) {
if (!this.editions) {
// if this access method doesn't specify editions, we can't use it
return false;
}
var editionPlatforms = this.editions.map(function(edition) { return edition.platform; });
if (client.os.name === "Android") {
// if we're Android, use this access method only if it supports Android
return editionPlatforms.indexOf("android") !== -1;
}
else if (client.os.name === "iOS"){
return editionPlatforms.indexOf("ios") !== -1;
}
else {
// if we're anything else, we can't use any access methods and we'll just open the fallback
return false;
}
};
/**
* Which access method we should use, or null if there are no access methods this client can use.
*
* @param {object} client - The client object created by redirector.detectClient
* @param {array} accessMethods - Array of accessMethod instances.
*/
AccessMethod.selectAccessMethod = function(client, accessMethods) {
accessMethods = Array.isArray(accessMethods) ? accessMethods : [accessMethods];
var applicableMethods = accessMethods ? accessMethods.filter(function(am){ return am.isApplicable(client); }) : [];
return applicableMethods.length ? applicableMethods[0] : {}; // arbitrarily pick the first applicable one, else empty obj.
};
module.exports = AccessMethod;
/**
* All of the information about a example "access method" may be needed to link to a native or web deepstate.
*
* @param {string} accessUrl - Native or web link to access the deepstate.
*
* @param {string} packageName - Unique identifier for Android apps. ex. 'com.yelp.android'
*
* @param {string} action - Android specific. Should default to 'android.intent.action.VIEW' on Chrome
*
* @param {string} category - Android specific. Supported in Chrome Intent URIs.
*
* @param {string} component - Android specific. Supported in Chrome Intent URIs.
*
* @param {Array} editions - Our example-defined structure of an app 'edition'
*
* @param {Array} extra - Android specific. Not currently supported in Chrome Intent URIs but could be later.
*
* @param {string} method - example defined. Tells us how we should lauch the deeplink. ie. "launchIntentViaJSON" means we should use Intent params but not AccessUrl if Chrome
*
* @constructor
* @memberof example
*/
function AccessMethod(accessUrl, packageName, action, category, component, editions, extra, method) {
this.accessUrl = accessUrl;
this.packageName = packageName;
this.action = action;
this.category = category;
this.component = component;
this.editions = editions;
this.extra = extra;
this.method = method;
}
/**
* Creates an AccessMethod from one of the objects in the 'accessMethods' array returned by the example API.
* The API response includes 'jar' is only relevant to example Android-sdk.
*
* @param {object} stateAccessInfoObj - The API object representing this AccessMethod.
*/
AccessMethod.fromStateAccessInfoObject = function(stateAccessInfoObj) {
var packageName = (!stateAccessInfoObj.editions || !stateAccessInfoObj.editions.length)
? null
: stateAccessInfoObj.editions[0].packageName;
return new AccessMethod(stateAccessInfoObj.accessUrl, packageName, stateAccessInfoObj.action, stateAccessInfoObj.category, stateAccessInfoObj.component, stateAccessInfoObj.editions, stateAccessInfoObj.extra, stateAccessInfoObj.method);
};
/**
* Whether this client (given the information we parsed out of their user agent) can apply a given access method.
*
* @param {object} client - The client object created by redirector.detectClient
*/
AccessMethod.prototype.isApplicable = function(client) {
if (!this.editions) {
// if this access method doesn't specify editions, we can't use it
return false;
}
var editionPlatforms = this.editions.map(function(edition) { return edition.platform; });
if (client.os.name === "Android") {
// if we're Android, use this access method only if it supports Android
return editionPlatforms.indexOf("android") !== -1;
}
else if (client.os.name === "iOS"){
return editionPlatforms.indexOf("ios") !== -1;
}
else {
// if we're anything else, we can't use any access methods and we'll just open the fallback
return false;
}
};
/**
* Which access method we should use, or null if there are no access methods this client can use.
*
* @param {object} client - The client object created by redirector.detectClient
* @param {array} accessMethods - Array of accessMethod instances.
*/
AccessMethod.selectAccessMethod = function(client, accessMethods) {
accessMethods = Array.isArray(accessMethods) ? accessMethods : [accessMethods];
var applicableMethods = accessMethods ? accessMethods.filter(function(am){ return am.isApplicable(client); }) : [];
return applicableMethods.length ? applicableMethods[0] : {}; // arbitrarily pick the first applicable one, else empty obj.
};
module.exports = AccessMethod;