UNPKG

gaf-mobile

Version:

GAF mobile Web site

281 lines (256 loc) 8.93 kB
'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 + '&currency=' + _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'; });