gaf-mobile
Version:
GAF mobile Web site
281 lines (256 loc) • 8.93 kB
JavaScript
'use strict';
angular.module('gafMobileApp')
/**
* @ngdoc controller
* @name gafMobileApp.UpgradeProjectCtrl
* @description
* Controller for upgrading a project
*/
.controller('UpgradeProjectCtrl', function($location, $route,
Projects, Analytics, CookieStore) {
var _this = this;
/**
* @ngdoc method
* @name gafMobileApp.UpgradeProjectCtrl#storeUpgrades
* @methodOf gafMobileApp.UpgradeProjectCtrl
* @param {Object} upgrades the name upgrades that will be
* stored set to true
* @returns {Object} store upgrades to cookies
* @description
* Store upgrades so they will be saved even when page is reloaded
* when redirected from third party payments
*/
var storeUpgrades = function(upgrades) {
// Store selected upgrades in cookies when deposit
var storeUpgrades = [];
// Clean up before storing upgrades
CookieStore.remove('project_upgrades');
angular.forEach(upgrades, function(isSelected, upgrade) {
if(isSelected) {
storeUpgrades.push(upgrade);
}
});
CookieStore.put('project_upgrades', storeUpgrades);
};
/**
* @ngdoc method
* @name gafMobileApp.UpgradeProjectCtrl#fixInconsistentUpgradeName
* @methodOf gafMobileApp.UpgradeProjectCtrl
* @param {String} upgrade the name of the upgrade
* @returns {String} corrected name of the upgrade
* @description
* Unfortunately the upgrade names received from the project fees
* API end point differ from what the upgrade API endpoint is expecting.
*/
var fixInconsistentUpgradeName = function(upgrade) {
var map = {
assisted: 'recruiter',
sealed: 'hidebids'
};
return map.hasOwnProperty(upgrade) ? map[upgrade] : upgrade;
};
/**
* @ngdoc method
* @name gafMobileApp.UpgradeProjectCtrl#isUpgradeFree
* @methodOf gafMobileApp.UpgradeProjectCtrl
* @param {String} upgrade the name of the upgrade
* @returns {Boolean} whether the upgrade is free
*/
var isUpgradeFree = function(upgrade) {
var freeSealed = angular.equals(upgrade, 'sealed') &&
_this.projectFees.free_sealed;
var freeExtend = angular.equals(upgrade, 'extend') &&
_this.projectFees.free_extend;
var freeNDA = angular.equals(upgrade, 'nda') &&
_this.projectFees.free_nda;
return freeSealed || freeExtend || freeNDA;
};
/**
* @ngdoc method
* @name gafMobileApp.UpgradeProjectCtrl#getUpgradeFee
* @methodOf gafMobileApp.UpgradeProjectCtrl
* @param {String} upgrade the name of the upgrade
* @returns {Number} the upgrade fee including whether it is free
*/
var getUpgradeFee = function(upgrade) {
if (angular.isDefined(_this.projectFees[upgrade + '_price']) &&
!isUpgradeFree(upgrade)) {
return _this.projectFees[upgrade + '_price'];
}
else {
return 0;
}
};
/**
* @ngdoc property
* @name gafMobileApp.UpgradeProjectCtrl#project
* @propertyOf gafMobileApp.UpgradeProjectCtrl
* @description
* Exposes currently loaded project
*/
_this.project = Projects.getCurrent();
// Make sure the he is the owner of the project
if (!_this.project.isOwner()) {
$location.url('/error');
return;
}
/**
* @ngdoc property
* @name gafMobileApp.UpgradeProjectCtrl#showAllUpgrades
* @propertyOf gafMobileApp.UpgradeProjectCtrl
* @description
* Stores logic on showing more upgrade options on page load
*/
_this.showAllUpgrades = false;
/**
* @ngdoc property
* @name gafMobileApp.UpgradeProjectCtrl#error
* @propertyOf gafMobileApp.UpgradeProjectCtrl
* @description
* Hold the backend errors when upgrading a project
*/
_this.error = {};
/**
* @ngdoc property
* @name gafMobileApp.UpgradeProjectCtrl#upgrades
* @propertyOf gafMobileApp.UpgradeProjectCtrl
* @description
* Store project upgrades and their selected state
*/
_this.upgrades = {};
/**
* @ngdoc property
* @name gafMobileApp.UpgradeProjectCtrl#viewState
* @propertyOf gafMobileApp.UpgradeProjectCtrl
* @description
* Exposes view state of the page: 'upgradeProject' or 'confirmUpgrade'
*/
_this.viewState = 'upgradeProject';
/**
* @ngdoc property
* @name gafMobileApp.UpgradeProjectCtrl#projectFees
* @propertyOf gafMobileApp.UpgradeProjectCtrl
* @description
* Store project upgrade fees
*/
_this.projectFees = $route.current.locals.projectBundle.get();
/**
* @ngdoc method
* @name gafMobileApp.UpgradeProjectCtrl#calculateTotal
* @methodOf gafMobileApp.UpgradeProjectCtrl
* @description
* Update total fee when an upgrade is selected/deselected
*/
_this.calculateTotal = function() {
var total = 0;
angular.forEach(_this.upgrades, function(isSelected, upgrade) {
if (isSelected) {
total += getUpgradeFee(upgrade);
}
else {
total += 0;
}
});
return total;
};
/**
* @ngdoc method
* @name gafMobileApp.UpgradeProjectCtrl#isUpgradeChecked
* @methodOf gafMobileApp.UpgradeProjectCtrl
* @returns {Boolean} whether there is at least one selected upgrade on the
* form
*/
_this.isUpgradeChecked = function() {
var checked = 0;
angular.forEach(_this.upgrades, function(isSelected){
if (isSelected) {
checked++;
}
});
return checked > 0;
};
/**
* @ngdoc method
* @name gafMobileApp.UpgradeProjectCtrl#upgrade
* @methodOf gafMobileApp.UpgradeProjectCtrl
* @param {Object} upgrade the name of upgrades set to true
* @description
* The function is invoked when the employer submits the upgrade form and
* requests to upgrade the project with the specified upgrades
*/
_this.upgrade = function(selectedUpgrades) {
var upgrades = [];
// Check which upgrades are selected and fix any inconsistent naming
angular.forEach(selectedUpgrades, function(isSelected, upgrade) {
if (isSelected) {
upgrades.push(fixInconsistentUpgradeName(upgrade).toUpperCase());
}
});
// Upgrade project
return _this.project.upgrade(upgrades).then(function(response) {
if (response.status === 'success') {
// If project is successfully upgraded, reset current project
// and proceed to Project View Page
Analytics.trackAction('upgrade', 'upgradeProject', 'SUCCESS');
Projects.setCurrent();
$location.url('/projects/' + _this.project.get().seo_url);
}
else {
_this.error.unknownError = true;
}
}).catch(function(error) {
Analytics.trackAction('upgrade', 'upgradeProject', error.error_code);
// Redirect to deposit page with prefilled amount if insufficient funds
// and project for return URL
if (error.error_code ===
'ProjectExceptionCodes.PROJECT_UPGRADE_INSUFFICIENT_FUNDS') {
storeUpgrades(selectedUpgrades);
$location.url('/deposit?type=upgrade&action=upgrade&amount=' +
_this.calculateTotal() + '&project=' + _this.project.get().id +
'¤cy=' + _this.projectFees.currency.id);
} else {
_this.error.message = error.message;
_this.error.unknownError = true;
}
});
};
/**
* @ngdoc method
* @name gafMobileApp.UpgradeProjectCtrl#getStoredUpgrades
* @methodOf gafMobileApp.UpgradeProjectCtrl
* @returns {Object} selected upgrades object set to true
* @description
* Get stored project upgrades from cookies and clean them up
* once obtained
*/
var getStoredUpgrades = function() {
var storedUpgrades;
var upgrades = {};
storedUpgrades = CookieStore.get('project_upgrades');
if (storedUpgrades) {
angular.forEach(storedUpgrades.split(','), function(upgrade) {
upgrades[upgrade] = true;
});
}
else {
upgrades = null;
}
CookieStore.remove('project_upgrades');
return upgrades;
};
// If we came from deposit page, get stored upgrades and
// show confirm upgrade modal
if ($location.search().deposit) {
var upgrades = getStoredUpgrades();
if(upgrades) {
_this.upgrades = upgrades;
_this.viewState = 'confirmUpgrade';
}
else {
_this.viewState = 'upgradeProject';
}
}
// If upgrade came from PPP, hide 'extend' and show 'urgent'
// If upgrade came from PVP, hide 'urgent' and show 'extend'
_this.newProject = $location.hash() === 'newproject';
});