{"version":3,"sources":["webpack:///javascripts/3-257c10c0995a4d25fa59.min.js","webpack:///./app/assets/javascripts/settings/directives/Subscriptions.ts","webpack:///./app/assets/html/upgrade/coupon.html","webpack:///./app/assets/javascripts/settings/directives/infoAppSumo.ts","webpack:///./app/assets/html/settings/info-app-sumo.html","webpack:///./app/assets/javascripts/settings/directives/subscriptionPlanDirective.ts","webpack:///./app/assets/html/upgrade/choose-plan.html","webpack:///./app/assets/html/settings/subscription-types.html","webpack:///./app/assets/javascripts/services/AsyncJSLoader.ts","webpack:///./app/assets/javascripts/settings/directives/stripeFormDirective.ts","webpack:///./app/assets/javascripts/settings/directives/subscriptionPriceBlock.ts","webpack:///./app/assets/javascripts/settings/services/SubscriptionSvc.ts","webpack:///./app/assets/javascripts/directives/PlanAnimation.ts","webpack:///./app/assets/javascripts/settings/services/TypeformSvc.ts","webpack:///./app/assets/javascripts/settings/subscription/containers/SubscriptionPredictPriceContainer.ts","webpack:///./app/assets/html/settings/subscription/containers/subscription-predict-price-container.html","webpack:///./app/assets/javascripts/settings/directives/couponDirective.ts","webpack:///./app/assets/javascripts/settings/directives/securePaymentDirective.ts","webpack:///./app/assets/javascripts/settings/directives/subscriptionTypes.ts","webpack:///./app/assets/html/settings/subscription-price-block.html","webpack:///./app/assets/html/settings/subscription.html","webpack:///./app/assets/javascripts/settings/directives/upgradePlanDirective.ts"],"names":["webpackJsonp","4X5L","module","exports","__webpack_require__","Object","defineProperty","value","tslib_1","AsyncJSLoader_1","underscore_extensions_1","SubscriptionSvc_1","SubscriptionPredictPriceContainer_1","SUBSCRIPTION_OPEN_MODAL","SubscriptionCtrl","$scope","$q","$state","$stateParams","$rootScope","AuthenticationSvc","subscriptionMessageSvc","analyticSvc","typeformSvc","subscriptionSvc","TranslateSvc","_this","this","isRedeem","params","redeem","cbUpgradeResult","angular","noop","loading","confirmDowngradeShown","cancelModalShown","isChangeCard","upgradeResultShown","changeBillingShowNext","downgradeResultShown","upgradeProjectResultShown","cardEditSuccessShown","billingChangeSuccessShown","changeBillingShown","showEditCard","isStripe","mapSpecialUpgrades","small-agency","agency","getStarterPricing","monthlyPrice","annualPrice","clearOpenModalListener","_","clearPredictPriceErrorListener","processResponse","httpResponse","deferred","defer","response","data","Utils","isApiError","errorMsg","errorResponse","reject","successResponse","then","resolve","promise","stopLoading","isEmailCorrect","test","options","user","email","getAlternativePeriod","isMonthly","toggleConfirmDowngradeModal","toggleCancelModal","goDefaultState","upgradeShown","changeModalUrl","toggleUpgradeResultModal","cb","toggleDowngradeResultModal","toggleChangeBilling","showEditCardDetails","hideBillingChangeSuccess","productName","getProduct","document","referrer","showSubscriptionCanceledMessage","trackVisit","updateSubscriptionDetails","cardDetailsCashed","showDetails","cardDetails","cardDetailsErrorMessage","setCardDetails","setUpgradesDiscount","openModal","stripeLib","window","Stripe","setPublishableKey","stripeKey","setBillingPeriodScope","$on","PREDICT_PRICE_ERROR","e","errorMessage","responseError","_a","modal","__rest","$inject","prototype","$onDestroy","get","special","getSpecialUpgrades","getUpgrades","enumerable","configurable","period","currentPeriod","toLowerCase","billing","applyCoupon","coupon","hideMassage","$emit","APPLY_COUPON","go","current","notify","goTo","url","product","toLocaleLowerCase","visitPage","getBillingPrice","price","isRound","newPrice","calcDiscount","upgradesDiscount","Math","ceil","getBillingSaving","upgrade","monthly","annual","save","saveFixed","Number","toFixed","isPriceShown","subscriptionDetails","billingPeriod","showUpgradeModal","plan","displayName","getFree","wave","name","studio","getError","error","showChangeCardView","notifyUserChange","updateUser","finally","loadingDetails","getCardDetails","catch","changeSubscription","upgradeSubscription","action","changeBillingPeriodRequestHandler","upgradedTo","chargedAmount","couponCode","toggleUpgradeModal","addTransaction","upgradeWithToken","upgradeModal","chosen","cancelSubscription","openTypeFormCancel","changeBillingPeriod","currentSubscription","oldPeriod","updateCard","token","handlerModalClose","changeBillingModalCloseHandler","upgradeModalCloseHandler","hideCardEditSuccess","openNextModal","renewAppSumo","isErrorRequiredFields","form","keys","$error","length","required","getAnnualSave","getPrice","isMonthlyPeriod","getMonthlyPrice","getAnnualPrice","getDetails","isFree","isHigh","isSpecial","isAppSumo","couponCompanyName","getCouponCompanyName","planName","getPlanName","newPeriod","provider","discount","dealText","providerInfo","CouponCompaniesNames","title","extendParams","__assign","totalPriceLastValue","subscriptionName","openChangeSubscriptionModal","subscriptionPredictPrice","findSubscriptionByName","subscription","upgradeAction","specialUpgradeName","specialUpgrade","getUpgradesByName","specialUpgrades","push","includes","directive","controllerAs","controller","templateUrl","52SV","p","5T+r","InfoAppSumo","$filter","onRenew","expirationMediumDate","expirationDate","renew","component","bindings","AMWW","BYam","Strings_1","lazy_modules_1","SubscriptionPlan","$element","$ocLazyLoad","sequence","jqueryPaymentLib","Strings","isBlank","$apply","$watch","newVal","handlerClick","showUpgradeDialog","isMostPopular","restrict","transclude","require","Er9j","F5f2","JMS9","AsyncJSLoader","getAMDLibrary","memoize","libraryUrl","globalVariable","once","overridenLibraryUrl","console","log","Promise","loadScripts","lib","googleMapsLib","reamazeLib","clipboardLib","Lb+m","testScope","card_exp_month","card_exp_year","card","number","expiry","month","year","Date","getFullYear","toString","slice","cvc","StripeForm","$timeout","HttpSvc","ctrl","stripeLoaded","pluginsLoaded","code","promo","setRequiredFields","requiredFields","submit","stripeForm","$invalid","formParams","toUpperCase","undefined","createToken","element","status","tokenResponse","id","resolvePromise","exp_month","exp_year","checkExpired","updateEmail","showFillTestCard","fillTestCard","forEach","k","isValid","extend","securePut","template","Pzqj","SubscriptionPriceBlock","$onChanges","discountedAnnual","getDiscountPrice","discountedMonthly","round","VXOl","AuthenticationSvc_1","UPDATE_SUBSCRIPTION_CARD","prod","AppSumo117","MightyDeals417","StackSocial0718","defaultCompany","dev","MightyDeals417Test","SubscriptionSvc","$http","affiliateSvc","specialSubscriptionNames","handlerHttpResponse","res","USER_LOGOUT","isStripeError","message","type","isString","getStripeCouponError","getRequiredSubscriptionError","getStripeCardError","has","getDowngradesByName","getPredictPrice","secureGet","r","details","discountPercentOff","percentOff","_b","prepareSubscription","getAffiliateUser","affiliateInfo","productParams","expires","errMsg","upgrades","filter","upgradeItem","getDowngrades","downgrades","downgrade","downgradeItem","excludeFromUI","hidden","secureDelete","dateArr","split","monthDays","getMonthDaysCount","splice","formattedDate","join","expiredDate","getTime","currentDate","now","isExpired","request","headers","getGaHeader","changeSubscriptionErrorHandler","apiDomain","Content-Type","post","err","errorCode","num","makeSpecialSubscription","expTime","date","msg","notification","showSuccess","matched","match","errorsCode","reg","RegExp","upgradeParams","toParams","service","WF19","PlanAnimation","$onInit","handHeld","rAF","parentElement","getBoundingClientRect","width","height","Animations","video","querySelector","safe","f","isFunction","inited","stop","object","map","retina","YMs+","TypeformSvc","showDeletedModal","userId","userid","formId","typeformUrl","getUrl","open","openTypeFormDelete","deleteAccountRequest","logout","showError","typeformId","location","host","isLogged","loggedIn","openModalLogin","currentUrl","setTimeout","toggleLoginModal","edCO","SubscriptionPredictPriceContainer","subscriptionCouponMessageSvc","applyCouponListener","responses","errors","init","setCurrentSubscription","setPrice","hide","onChangesObj","isFirstChange","currentValue","all","getStaticSubscription","subscriptions","predictSubscription","staticSubscription","currentPredictPriceData","pricesObj","prices","reduce","currentPrice","annualDiscount","Error","setupDiscount","currentPredictPrice","currentPredictPriceRounded","startingBalance","credit","totalPrice","amount","percents","amountDiscount","percentsDiscount","gGiH","gojZ","CouponDirective","couponError","applyingCoupon","securePost","isObject","ipbz","SecurePayment","imageSrc","getHref","getId","openWindow","preventDefault","zoneCode","izVX","subscriptionTypesData","free","starter","pro3","business","wavefree","wavepro","wavebusiness","waveagency","wavebigagency","waveultimate","wavesmallagency","SubscriptionTypes","types","o701","py5d","rCIs","scope"],"mappings":"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","file":"javascripts/3-257c10c0995a4d25fa59.min.js","sourcesContent":["webpackJsonp([3,16,128],{\n\n/***/ \"4X5L\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(\"TToO\");\r\nvar AsyncJSLoader_1 = __webpack_require__(\"JMS9\");\r\nvar underscore_extensions_1 = __webpack_require__(\"R0iF\");\r\nvar SubscriptionSvc_1 = __webpack_require__(\"VXOl\");\r\nvar SubscriptionPredictPriceContainer_1 = __webpack_require__(\"edCO\");\r\nexports.SUBSCRIPTION_OPEN_MODAL = 'website/subscription/openModal';\r\nvar SubscriptionCtrl = (function () {\r\n SubscriptionCtrl.$inject = [\"$scope\", \"$q\", \"$state\", \"$stateParams\", \"$rootScope\", \"AuthenticationSvc\", \"subscriptionMessageSvc\", \"analyticSvc\", \"typeformSvc\", \"subscriptionSvc\", \"TranslateSvc\"];\r\n function SubscriptionCtrl($scope, $q, $state, $stateParams, $rootScope, AuthenticationSvc, subscriptionMessageSvc, analyticSvc, \r\n // private upgradeOneProjectSvc: UpgradeOneProjectSvc,\r\n typeformSvc, subscriptionSvc, TranslateSvc) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$q = $q;\r\n this.$state = $state;\r\n this.$stateParams = $stateParams;\r\n this.$rootScope = $rootScope;\r\n this.AuthenticationSvc = AuthenticationSvc;\r\n this.subscriptionMessageSvc = subscriptionMessageSvc;\r\n this.analyticSvc = analyticSvc;\r\n this.typeformSvc = typeformSvc;\r\n this.subscriptionSvc = subscriptionSvc;\r\n this.TranslateSvc = TranslateSvc;\r\n this.isRedeem = this.$state.params.redeem;\r\n this.cbUpgradeResult = angular.noop;\r\n this.loading = false;\r\n this.confirmDowngradeShown = false;\r\n this.cancelModalShown = false;\r\n this.isChangeCard = false;\r\n this.upgradeResultShown = false;\r\n this.changeBillingShowNext = false;\r\n this.downgradeResultShown = false;\r\n this.upgradeProjectResultShown = false;\r\n this.cardEditSuccessShown = false;\r\n this.billingChangeSuccessShown = false;\r\n this.changeBillingShown = false;\r\n this.showEditCard = false;\r\n this.isStripe = function () { return _this.subscriptionSvc.isStripe(); };\r\n this.mapSpecialUpgrades = {\r\n 'small-agency': 'WaveSmallAgency',\r\n agency: 'WaveBigAgency',\r\n };\r\n this.getStarterPricing = {\r\n monthlyPrice: 600,\r\n annualPrice: 6000\r\n };\r\n this.clearOpenModalListener = _.noop;\r\n this.clearPredictPriceErrorListener = _.noop;\r\n this.processResponse = function (httpResponse) {\r\n var deferred = _this.$q.defer();\r\n var response = httpResponse.data;\r\n if (underscore_extensions_1.Utils.isApiError(response)) {\r\n var errorMsg = _this.errorResponse(response);\r\n deferred.reject(errorMsg);\r\n }\r\n else {\r\n _this.successResponse().then(function () { return deferred.resolve(response); });\r\n }\r\n return deferred.promise;\r\n };\r\n this.stopLoading = function () { return _this.loading = false; };\r\n this.isEmailCorrect = function () { return /^.+@.+$/.test(options.user.email); };\r\n this.getAlternativePeriod = function () { return _this.isMonthly() ? 'annual' : 'monthly'; };\r\n this.toggleConfirmDowngradeModal = function () { return _this.confirmDowngradeShown = !_this.confirmDowngradeShown; };\r\n this.toggleCancelModal = function () {\r\n if (_this.cancelModalShown) {\r\n _this.cancelModalShown = false;\r\n _this.goDefaultState();\r\n _this.analyticSvc.upgradeShown('downgrade');\r\n }\r\n else {\r\n _this.changeModalUrl('cancel');\r\n }\r\n };\r\n this.toggleUpgradeResultModal = function (cb) {\r\n if (cb === void 0) { cb = angular.noop; }\r\n if (_this.upgradeResultShown) {\r\n _this.upgradeResultShown = false;\r\n _this.cbUpgradeResult = cb;\r\n _this.goDefaultState();\r\n }\r\n else {\r\n _this.changeModalUrl('thank-you');\r\n _this.cbUpgradeResult();\r\n }\r\n };\r\n this.toggleDowngradeResultModal = function () { return _this.downgradeResultShown = !_this.downgradeResultShown; };\r\n // toggleUpgradeProjectResultModal = () => {\r\n // this.upgradeProjectResultShown = !this.upgradeProjectResultShown;\r\n // if (!this.upgradeProjectResultShown) {\r\n // this.upgradeOneProjectSvc.updateProjectArgs();\r\n // }\r\n // };\r\n this.toggleChangeBilling = function () {\r\n if (_this.isStripe()) {\r\n _this.changeBillingShown = !_this.changeBillingShown;\r\n if (!_this.changeBillingShown) {\r\n _this.goDefaultState();\r\n }\r\n }\r\n else {\r\n _this.changeBillingShowNext = true;\r\n _this.showEditCardDetails();\r\n }\r\n };\r\n this.hideBillingChangeSuccess = function () { return _this.billingChangeSuccessShown = false; };\r\n this.productName = underscore_extensions_1.Utils.getProduct() === 'WAVE' ? 'Wave.video' : 'Studio';\r\n if (/typeform/.test(document.referrer)) {\r\n this.subscriptionSvc.showSubscriptionCanceledMessage();\r\n }\r\n this.trackVisit();\r\n this.updateSubscriptionDetails();\r\n if (this.subscriptionSvc.cardDetailsCashed) {\r\n this.showDetails = this.isStripe();\r\n this.cardDetails = this.subscriptionSvc.cardDetailsCashed;\r\n }\r\n else if (this.subscriptionSvc.cardDetailsErrorMessage) {\r\n this.cardDetailsErrorMessage = this.subscriptionSvc.cardDetailsErrorMessage;\r\n }\r\n else {\r\n this.setCardDetails();\r\n }\r\n this.subscriptionSvc.setUpgradesDiscount();\r\n this.openModal();\r\n AsyncJSLoader_1.stripeLib().then(function () { return window.Stripe.setPublishableKey(options.user.stripeKey()); });\r\n this.setBillingPeriodScope();\r\n this.clearPredictPriceErrorListener = this.$rootScope.$on(SubscriptionPredictPriceContainer_1.PREDICT_PRICE_ERROR, function (e, errorMessage) { return _this.responseError = errorMessage; });\r\n this.clearOpenModalListener = this.$rootScope.$on(exports.SUBSCRIPTION_OPEN_MODAL, function (e, _a) {\r\n var modal = _a.modal, params = tslib_1.__rest(_a, [\"modal\"]);\r\n return _this.changeModalUrl(modal, params);\r\n });\r\n }\r\n SubscriptionCtrl.prototype.$onDestroy = function () {\r\n this.clearOpenModalListener();\r\n this.clearPredictPriceErrorListener();\r\n };\r\n Object.defineProperty(SubscriptionCtrl.prototype, \"upgrades\", {\r\n get: function () {\r\n return this.$stateParams.special ? this.getSpecialUpgrades() : this.subscriptionSvc.getUpgrades();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n SubscriptionCtrl.prototype.setBillingPeriodScope = function () {\r\n var period = this.$stateParams.period;\r\n var currentPeriod = period && period.toLowerCase() === 'annual'\r\n ? 'ANNUAL'\r\n : 'MONTHLY';\r\n this.$scope.billing = { period: currentPeriod };\r\n };\r\n SubscriptionCtrl.prototype.applyCoupon = function (coupon) {\r\n this.responseError = '';\r\n this.subscriptionMessageSvc.hideMassage();\r\n this.$rootScope.$emit(SubscriptionSvc_1.APPLY_COUPON, coupon);\r\n this.$state.go(this.$state.current, { coupon: coupon }, { notify: false });\r\n };\r\n SubscriptionCtrl.prototype.goTo = function (url) {\r\n var product = underscore_extensions_1.Utils.getProduct().toLocaleLowerCase();\r\n this.$state.go(product + \"-\" + url);\r\n };\r\n SubscriptionCtrl.prototype.trackVisit = function () {\r\n if (!this.$stateParams.modal) {\r\n this.analyticSvc.visitPage('Subscription');\r\n }\r\n };\r\n SubscriptionCtrl.prototype.getBillingPrice = function (price, isRound) {\r\n if (isRound === void 0) { isRound = true; }\r\n var newPrice = price * this.subscriptionSvc.calcDiscount(this.subscriptionSvc.upgradesDiscount) / 100.0;\r\n return isRound ? Math.ceil(newPrice) : newPrice;\r\n };\r\n SubscriptionCtrl.prototype.getBillingSaving = function (upgrade) {\r\n var monthly = this.getBillingPrice(upgrade.monthlyPrice, false);\r\n var annual = this.getBillingPrice(upgrade.annualPrice, false);\r\n var save = monthly * 12 - annual;\r\n var saveFixed = Number((save).toFixed(2));\r\n return Math.ceil(saveFixed);\r\n };\r\n SubscriptionCtrl.prototype.isPriceShown = function () {\r\n var period = this.subscriptionDetails.billingPeriod.toLowerCase();\r\n return period === 'coupon' || options.user.isStripe();\r\n };\r\n SubscriptionCtrl.prototype.showUpgradeModal = function (upgrade, billingPeriod) {\r\n this.changeModalUrl('upgrade', { plan: upgrade.displayName, period: billingPeriod.toLowerCase() });\r\n };\r\n SubscriptionCtrl.prototype.getFree = function () {\r\n var free = {\r\n wave: {\r\n name: 'WaveFree',\r\n displayName: 'WaveFree'\r\n },\r\n studio: {\r\n name: 'Free',\r\n displayName: 'Free'\r\n }\r\n };\r\n return free[this.subscriptionSvc.product.toLowerCase()];\r\n };\r\n SubscriptionCtrl.prototype.getError = function (error) {\r\n return this.subscriptionSvc.getError(error);\r\n };\r\n SubscriptionCtrl.prototype.showChangeCardView = function () {\r\n this.isChangeCard = true;\r\n this.responseError = null;\r\n };\r\n SubscriptionCtrl.prototype.errorResponse = function (response) {\r\n this.responseError = '';\r\n if (!response)\r\n return true;\r\n var error = this.getError(response.error || response.errorMessage);\r\n if (error) {\r\n this.loading = false;\r\n this.responseError = error;\r\n }\r\n else {\r\n return false;\r\n }\r\n return error;\r\n };\r\n SubscriptionCtrl.prototype.successResponse = function () {\r\n var _this = this;\r\n this.AuthenticationSvc.notifyUserChange();\r\n return this.setCardDetails()\r\n .then(function () { return _this.AuthenticationSvc.updateUser(); })\r\n .then(function () { return _this.updateSubscriptionDetails(); })\r\n .finally(function () { return _this.stopLoading(); });\r\n };\r\n SubscriptionCtrl.prototype.setCardDetails = function () {\r\n var _this = this;\r\n this.loadingDetails = true;\r\n return this.subscriptionSvc.getCardDetails()\r\n .then(function (response) {\r\n _this.showDetails = _this.isStripe();\r\n _this.cardDetails = response;\r\n })\r\n .catch(function (errorMessage) { return _this.cardDetailsErrorMessage = errorMessage; })\r\n .finally(function () {\r\n _this.loadingDetails = false;\r\n _this.loading = false;\r\n });\r\n };\r\n SubscriptionCtrl.prototype.changeSubscription = function (params) {\r\n this.loading = true;\r\n return this.subscriptionSvc\r\n .changeSubscription(params)\r\n .then(this.processResponse)\r\n .finally(this.stopLoading);\r\n };\r\n SubscriptionCtrl.prototype.upgradeSubscription = function (params, action) {\r\n var _this = this;\r\n if (action === void 0) { action = 'upgrade'; }\r\n var _a = this.subscriptionDetails, displayName = _a.displayName, billingPeriod = _a.billingPeriod;\r\n return this.changeSubscription(params).then(function (response) {\r\n if (_this.changeBillingShown) {\r\n _this.changeBillingPeriodRequestHandler(billingPeriod);\r\n }\r\n else {\r\n _this.upgradedTo = response.displayName;\r\n _this.analyticSvc.changeSubscription(action, displayName, billingPeriod, _this.upgradedTo, response.billingPeriod, response.chargedAmount / 100.0, params.couponCode);\r\n _this.toggleUpgradeModal();\r\n _this.addTransaction();\r\n action === 'upgrade' ? _this.toggleUpgradeResultModal() : _this.toggleDowngradeResultModal();\r\n }\r\n });\r\n };\r\n SubscriptionCtrl.prototype.upgradeWithToken = function (name, period, couponCode, upgradeModal, action) {\r\n if (couponCode === void 0) { couponCode = ''; }\r\n this.upgradeSubscription({ name: name, period: period, couponCode: couponCode }, action)\r\n .then(function () {\r\n if (upgradeModal) {\r\n upgradeModal.chosen = false;\r\n }\r\n });\r\n };\r\n // upgradeProject(period: string,\r\n // projectId: string,\r\n // token: string,\r\n // name: string,\r\n // couponCode: string,\r\n // upgradeModal: UpgradeModal) {\r\n // this.loading = true;\r\n //\r\n // return this.upgradeOneProjectSvc.upgrade(period, projectId, token, name, couponCode)\r\n // .then(() => {\r\n // this.upgradedTo = period;\r\n // if (upgradeModal) {\r\n // upgradeModal.chosen = false;\r\n // }\r\n // this.toggleUpgradeProjectResultModal();\r\n // })\r\n // .finally(this.stopLoading.bind(this));\r\n // };\r\n SubscriptionCtrl.prototype.cancelSubscription = function () {\r\n var _this = this;\r\n this.loading = true;\r\n this.subscriptionSvc.cancelSubscription()\r\n .then(function () { return _this.goDefaultState(); })\r\n .then(function () { return _this.typeformSvc.openTypeFormCancel(); })\r\n .finally(function () { return _this.loading = false; });\r\n };\r\n SubscriptionCtrl.prototype.changeBillingPeriod = function (period, couponCode) {\r\n var _this = this;\r\n if (couponCode === void 0) { couponCode = ''; }\r\n var currentSubscription = this.subscriptionDetails.name;\r\n var oldPeriod = this.subscriptionDetails.billingPeriod;\r\n return this.changeSubscription({ period: period, name: currentSubscription, couponCode: couponCode })\r\n .then(function () { return _this.changeBillingPeriodRequestHandler(oldPeriod); });\r\n };\r\n SubscriptionCtrl.prototype.updateCard = function (token) {\r\n var _this = this;\r\n this.loading = true;\r\n return this.subscriptionSvc\r\n .updateCard(token)\r\n .then(this.processResponse)\r\n .then(function () {\r\n _this.showEditCard = false;\r\n _this.cardEditSuccessShown = true;\r\n })\r\n .finally(this.stopLoading);\r\n };\r\n SubscriptionCtrl.prototype.showEditCardDetails = function () {\r\n this.changeModalUrl('editCard', { plan: '', period: '' });\r\n };\r\n SubscriptionCtrl.prototype.handlerModalClose = function () {\r\n this.goDefaultState();\r\n };\r\n SubscriptionCtrl.prototype.changeBillingModalCloseHandler = function () {\r\n this.changeBillingShown = false;\r\n this.goDefaultState();\r\n };\r\n SubscriptionCtrl.prototype.upgradeModalCloseHandler = function () {\r\n this.$scope.upgradeModal.chosen = false;\r\n this.goDefaultState();\r\n };\r\n SubscriptionCtrl.prototype.hideCardEditSuccess = function () {\r\n this.cardEditSuccessShown = false;\r\n this.openNextModal();\r\n };\r\n SubscriptionCtrl.prototype.renewAppSumo = function () {\r\n this.changeModalUrl('upgrade', { plan: 'Business', period: 'annual' });\r\n };\r\n SubscriptionCtrl.prototype.isErrorRequiredFields = function (form) {\r\n return form && Object.keys(form.$error).length === 1 && form.$error.required;\r\n };\r\n SubscriptionCtrl.prototype.isMonthly = function () {\r\n return this.subscriptionDetails.billingPeriod.toLowerCase() === 'monthly';\r\n };\r\n SubscriptionCtrl.prototype.getAnnualSave = function () {\r\n return this.subscriptionSvc.getAnnualSave();\r\n };\r\n SubscriptionCtrl.prototype.getPrice = function () {\r\n return this.isMonthlyPeriod() ?\r\n this.subscriptionSvc.getMonthlyPrice() :\r\n this.subscriptionSvc.getAnnualPrice();\r\n };\r\n SubscriptionCtrl.prototype.updateSubscriptionDetails = function () {\r\n this.subscriptionDetails = this.subscriptionSvc.getDetails();\r\n this.isFree = this.subscriptionSvc.isFree();\r\n this.isHigh = this.subscriptionSvc.isHigh();\r\n this.isSpecial = this.subscriptionSvc.isSpecial();\r\n this.isAppSumo = this.subscriptionSvc.isAppSumo();\r\n this.couponCompanyName = this.isAppSumo ? this.getCouponCompanyName() : '';\r\n this.planName = this.getPlanName();\r\n };\r\n SubscriptionCtrl.prototype.changeBillingPeriodRequestHandler = function (oldPeriod) {\r\n var newPeriod = this.subscriptionDetails.billingPeriod;\r\n this.analyticSvc.changeBillingPeriod(oldPeriod, newPeriod);\r\n this.billingChangeSuccessShown = true;\r\n this.toggleChangeBilling();\r\n };\r\n SubscriptionCtrl.prototype.getPlanName = function () {\r\n var _a = this.subscriptionDetails, displayName = _a.displayName, billingPeriod = _a.billingPeriod;\r\n var period = /coupon/i.test(billingPeriod) ? '' : billingPeriod;\r\n return displayName + \" \" + period;\r\n };\r\n SubscriptionCtrl.prototype.getCouponCompanyName = function () {\r\n var _a = this.subscriptionDetails, displayName = _a.displayName, provider = _a.discount.provider;\r\n var dealText = this.TranslateSvc.get('deal');\r\n var providerInfo = SubscriptionSvc_1.CouponCompaniesNames[provider];\r\n var providerText = providerInfo ? \"- \" + providerInfo.title + \" \" + dealText : '';\r\n return displayName + \" \" + providerText;\r\n };\r\n SubscriptionCtrl.prototype.openNextModal = function () {\r\n if (this.changeBillingShowNext) {\r\n this.changeBillingShown = true;\r\n }\r\n };\r\n SubscriptionCtrl.prototype.goDefaultState = function () {\r\n return this.$state.go(this.$state.current, {\r\n modal: '',\r\n plan: '',\r\n period: '',\r\n coupon: ''\r\n }, { notify: false });\r\n };\r\n SubscriptionCtrl.prototype.changeModalUrl = function (modal, params) {\r\n var _this = this;\r\n if (params === void 0) { params = {}; }\r\n var _a = this.subscriptionDetails, displayName = _a.displayName, billingPeriod = _a.billingPeriod;\r\n var extendParams = tslib_1.__assign({ plan: displayName, period: billingPeriod.toLowerCase() }, params);\r\n this.$state\r\n .go(this.$state.current, tslib_1.__assign({ modal: modal }, extendParams), { notify: false })\r\n .finally(function () { return _this.openModal(tslib_1.__assign({ modal: modal }, extendParams)); });\r\n };\r\n SubscriptionCtrl.prototype.addTransaction = function () {\r\n if (this.subscriptionSvc.totalPriceLastValue <= 0)\r\n return;\r\n var _a = this.subscriptionSvc.getDetails(), displayName = _a.displayName, billingPeriod = _a.billingPeriod;\r\n var subscriptionName = displayName + \" - \" + billingPeriod;\r\n this.analyticSvc.addTransaction(\"\" + this.subscriptionSvc.totalPriceLastValue, subscriptionName);\r\n };\r\n SubscriptionCtrl.prototype.openModal = function (params) {\r\n var _this = this;\r\n var _a = tslib_1.__assign({}, this.$stateParams, params), modal = _a.modal, plan = _a.plan;\r\n this.setBillingPeriodScope();\r\n this.responseError = ''; // remove all previous errors\r\n this.subscriptionMessageSvc.hideMassage();\r\n this.isChangeCard = false;\r\n switch (modal) {\r\n case 'thank-you': {\r\n this.upgradedTo = plan;\r\n this.upgradeResultShown = true;\r\n break;\r\n }\r\n case 'cancel': {\r\n this.cancelModalShown = true;\r\n break;\r\n }\r\n case 'upgrade': {\r\n this.openChangeSubscriptionModal('upgrade')\r\n .then(function () { return _this.toggleUpgradeModal(); });\r\n break;\r\n }\r\n case 'downgrade': {\r\n if (plan === 'Free') {\r\n this.toggleCancelModal();\r\n }\r\n else {\r\n this.openChangeSubscriptionModal('downgrade')\r\n .then(function () { return _this.toggleUpgradeModal(); });\r\n }\r\n break;\r\n }\r\n case 'switch-period': {\r\n this.openChangeSubscriptionModal();\r\n this.toggleChangeBilling();\r\n break;\r\n }\r\n case 'editCard': {\r\n this.showEditCard = true;\r\n break;\r\n }\r\n }\r\n };\r\n SubscriptionCtrl.prototype.openChangeSubscriptionModal = function (action) {\r\n var _this = this;\r\n this.subscriptionPredictPrice = null; // needed for correct works ng-init directive\r\n return this.subscriptionSvc.findSubscriptionByName(this.$stateParams.plan)\r\n .then(function (subscription) {\r\n _this.subscriptionPredictPrice = subscription;\r\n if (action) {\r\n _this.upgradeAction = action;\r\n }\r\n });\r\n };\r\n SubscriptionCtrl.prototype.toggleUpgradeModal = function () {\r\n if (!this.$scope.upgradeModal)\r\n this.$scope.upgradeModal = {};\r\n this.$scope.upgradeModal.chosen = !this.$scope.upgradeModal.chosen;\r\n if (!this.$scope.upgradeModal.chosen) {\r\n this.goDefaultState();\r\n }\r\n };\r\n SubscriptionCtrl.prototype.getSpecialUpgrades = function () {\r\n var specialUpgradeName = this.mapSpecialUpgrades[this.$stateParams.special];\r\n var specialUpgrade = this.subscriptionSvc.getUpgradesByName(specialUpgradeName);\r\n var specialUpgrades = [];\r\n this.$scope.billing.period = 'ANNUAL';\r\n specialUpgrade && specialUpgrades.push(specialUpgrade);\r\n return specialUpgrades;\r\n };\r\n SubscriptionCtrl.prototype.isMonthlyPeriod = function () {\r\n return this.subscriptionDetails.monthlyPrice && this.subscriptionDetails.billingPeriod\r\n .toLowerCase()\r\n .includes('monthly');\r\n };\r\n return SubscriptionCtrl;\r\n}());\r\nexports.SubscriptionCtrl = SubscriptionCtrl;\r\nangular.module('animatronApp.settings').directive('subscription', function () { return ({\r\n controllerAs: 'SubscriptionCtrl',\r\n controller: SubscriptionCtrl\r\n}); });\r\nangular.module('animatronApp.settings').directive('subscriptionPage', function () { return ({\r\n templateUrl: __webpack_require__(\"py5d\")\r\n}); });\r\n\n\n/***/ }),\n\n/***/ \"52SV\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"html/coupon_a289a7646b5b15e2d94c7903ad6aef29.html\";\n\n/***/ }),\n\n/***/ \"5T+r\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar InfoAppSumo = (function () {\r\n InfoAppSumo.$inject = [\"$filter\"];\r\n function InfoAppSumo($filter) {\r\n this.$filter = $filter;\r\n this.onRenew = this.onRenew || angular.noop;\r\n this.expirationMediumDate = this.$filter('date')(this.expirationDate * 1000, 'mediumDate');\r\n }\r\n InfoAppSumo.prototype.renew = function () {\r\n this.onRenew();\r\n };\r\n return InfoAppSumo;\r\n}());\r\nangular.module('animatronApp.settings').component('infoAppSumo', {\r\n bindings: {\r\n name: '<',\r\n displayName: '<',\r\n isFree: '<',\r\n price: '<',\r\n expirationDate: '<',\r\n onRenew: '&'\r\n },\r\n controller: InfoAppSumo,\r\n templateUrl: __webpack_require__(\"AMWW\")\r\n});\r\n\n\n/***/ }),\n\n/***/ \"AMWW\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"html/info-app-sumo_e7389d67d8d687d427f604be76e0a338.html\";\n\n/***/ }),\n\n/***/ \"BYam\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Strings_1 = __webpack_require__(\"fxc3\");\r\nvar lazy_modules_1 = __webpack_require__(\"bUzP\");\r\nvar underscore_extensions_1 = __webpack_require__(\"R0iF\");\r\nvar SubscriptionPlan = (function () {\r\n SubscriptionPlan.$inject = [\"$scope\", \"$stateParams\", \"$element\", \"$ocLazyLoad\", \"analyticSvc\", \"subscriptionSvc\"];\r\n function SubscriptionPlan($scope, $stateParams, $element, $ocLazyLoad, analyticSvc, subscriptionSvc) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$stateParams = $stateParams;\r\n this.$element = $element;\r\n this.$ocLazyLoad = $ocLazyLoad;\r\n this.analyticSvc = analyticSvc;\r\n this.subscriptionSvc = subscriptionSvc;\r\n this.SubscriptionCtrl = this.$element.controller('subscription');\r\n $scope.upgradeModal = $scope.upgradeModal || {};\r\n underscore_extensions_1.Utils.sequence(lazy_modules_1.jqueryPaymentLib, $ocLazyLoad).then(function () {\r\n if (!Strings_1.Strings.isBlank($stateParams.plan) && (!$stateParams.modal || $stateParams.modal === 'upgrade')) {\r\n $scope.upgradeModal.chosen = $stateParams.plan === $scope.upgrade.displayName;\r\n $scope.$apply();\r\n }\r\n });\r\n $scope.$watch('upgradeModal.chosen', function (newVal) {\r\n newVal && _this.analyticSvc.upgradeShown(_this.$scope.action, _this.$scope.upgrade.displayName);\r\n _this.SubscriptionCtrl.responseError = '';\r\n });\r\n }\r\n SubscriptionPlan.prototype.handlerClick = function () {\r\n if (this.isFree()) {\r\n this.SubscriptionCtrl.toggleCancelModal();\r\n }\r\n else {\r\n this.showUpgradeDialog();\r\n }\r\n };\r\n SubscriptionPlan.prototype.isMostPopular = function () {\r\n return ['Pro', 'WavePro'].includes(this.$scope.upgrade.name);\r\n };\r\n SubscriptionPlan.prototype.getAnnualPrice = function () {\r\n return this.subscriptionSvc.getAnnualPrice(this.$scope.upgrade);\r\n };\r\n SubscriptionPlan.prototype.getMonthlyPrice = function () {\r\n return this.subscriptionSvc.getMonthlyPrice(this.$scope.upgrade);\r\n };\r\n SubscriptionPlan.prototype.isFree = function () {\r\n return this.subscriptionSvc.isFree(this.$scope.upgrade);\r\n };\r\n SubscriptionPlan.prototype.showUpgradeDialog = function () {\r\n if (this.$scope.action === 'upgrade') {\r\n this.SubscriptionCtrl.showUpgradeModal(this.$scope.upgrade, this.$scope.billing.period);\r\n }\r\n else {\r\n this.$scope.upgradeModal.chosen = true;\r\n }\r\n };\r\n return SubscriptionPlan;\r\n}());\r\nangular.module('animatronApp.settings').directive('subscriptionPlan', function () { return ({\r\n restrict: 'E',\r\n transclude: true,\r\n require: '^subscription',\r\n controller: SubscriptionPlan,\r\n controllerAs: '$ctrl',\r\n templateUrl: __webpack_require__(\"Er9j\")\r\n}); });\r\n\n\n/***/ }),\n\n/***/ \"Er9j\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"html/choose-plan_af5cdc240fc4797b24de9c2a4e37f7c2.html\";\n\n/***/ }),\n\n/***/ \"F5f2\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"html/subscription-types_08708959e72a6dd1f0273a228b640160.html\";\n\n/***/ }),\n\n/***/ \"JMS9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar AsyncJSLoader = (function () {\r\n function AsyncJSLoader() {\r\n }\r\n return AsyncJSLoader;\r\n}());\r\nAsyncJSLoader.getAMDLibrary = _.memoize(function (libraryUrl, globalVariable) {\r\n return _.once(function (overridenLibraryUrl) {\r\n libraryUrl = overridenLibraryUrl || libraryUrl;\r\n console.log('Loading', libraryUrl);\r\n return new Promise(function (resolve) {\r\n return loadScripts([libraryUrl], function (lib) { return resolve((window[globalVariable] || lib)); });\r\n });\r\n });\r\n});\r\n/**\r\n * define all async libraries here\r\n */\r\nexports.googleMapsLib = AsyncJSLoader.getAMDLibrary('https://maps.googleapis.com/maps/api/js');\r\nexports.stripeLib = AsyncJSLoader.getAMDLibrary('https://js.stripe.com/v2/', 'Stripe');\r\nexports.reamazeLib = AsyncJSLoader.getAMDLibrary('https://d3itxuyrq7vzpz.cloudfront.net/assets/reamaze.js', 'Reamaze');\r\nexports.clipboardLib = AsyncJSLoader.getAMDLibrary('https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.5/clipboard.min.js', 'Clipboard');\r\n\n\n/***/ }),\n\n/***/ \"Lb+m\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar Strings_1 = __webpack_require__(\"fxc3\");\r\nvar AsyncJSLoader_1 = __webpack_require__(\"JMS9\");\r\nvar lazy_modules_1 = __webpack_require__(\"bUzP\");\r\nvar underscore_extensions_1 = __webpack_require__(\"R0iF\");\r\nvar testScope = {\r\n card_exp_month: '12',\r\n card_exp_year: '17',\r\n card: {\r\n number: '4242 4242 4242 4242',\r\n expiry: {\r\n month: 12,\r\n year: new Date().getFullYear().toString().slice(2)\r\n },\r\n cvc: '123'\r\n }\r\n};\r\nvar StripeForm = (function () {\r\n StripeForm.$inject = [\"$scope\", \"$element\", \"$timeout\", \"$ocLazyLoad\", \"$stateParams\", \"HttpSvc\", \"subscriptionSvc\", \"AuthenticationSvc\"];\r\n function StripeForm($scope, $element, $timeout, $ocLazyLoad, $stateParams, HttpSvc, subscriptionSvc, AuthenticationSvc) {\r\n var _this = this;\r\n this.$scope = $scope;\r\n this.$element = $element;\r\n this.$timeout = $timeout;\r\n this.$ocLazyLoad = $ocLazyLoad;\r\n this.$stateParams = $stateParams;\r\n this.HttpSvc = HttpSvc;\r\n this.subscriptionSvc = subscriptionSvc;\r\n this.AuthenticationSvc = AuthenticationSvc;\r\n var ctrl = $element.controller('subscription');\r\n $scope.stripeLoaded = false;\r\n $scope.pluginsLoaded = false;\r\n $scope.card = {};\r\n $scope.coupon = { code: $stateParams.promo };\r\n $scope.setRequiredFields = function () { return $scope.requiredFields = false; };\r\n AsyncJSLoader_1.stripeLib().then(function () {\r\n $scope.stripeLoaded = true;\r\n $scope.submit = function (upgradeModal) {\r\n $scope.requiredFields = true;\r\n $timeout(function () {\r\n if ($scope.stripeForm.$invalid)\r\n return;\r\n ctrl.loading = true;\r\n window.Stripe.setPublishableKey(options.user.stripeKey()); //IE 10 problems\r\n var formParams = {\r\n token: '',\r\n name: $scope.upgrade ? $scope.upgrade.name : '',\r\n period: $scope.billing.period.toUpperCase(),\r\n email: undefined,\r\n couponCode: undefined\r\n };\r\n var email = $scope.card.email;\r\n if (!Strings_1.Strings.isBlank(email))\r\n formParams.email = email;\r\n window.Stripe.createToken(angular.element($element)[0], function (status, tokenResponse) {\r\n if (!ctrl.errorResponse(tokenResponse)) {\r\n var token = tokenResponse.id;\r\n var resolvePromise = void 0;\r\n formParams.token = token;\r\n if (ctrl.showEditCard) {\r\n resolvePromise = ctrl.updateCard(token);\r\n }\r\n else {\r\n formParams.couponCode = $scope.coupon.code;\r\n // if ($scope.upgrade.project) {\r\n // ctrl.upgradeProject(formParams.period,\r\n // $scope.upgrade.projectId,\r\n // formParams.token,\r\n // formParams.name,\r\n // formParams.couponCode,\r\n // upgradeModal\r\n // );\r\n // } else {\r\n var _a = tokenResponse.card, exp_month = _a.exp_month, exp_year = _a.exp_year;\r\n subscriptionSvc.checkExpired(exp_month + \"/\" + exp_year);\r\n resolvePromise = ctrl.upgradeSubscription(formParams);\r\n // }\r\n }\r\n if (!Strings_1.Strings.isBlank(email)) {\r\n resolvePromise.finally(function () { return _this.updateEmail(email); });\r\n }\r\n }\r\n });\r\n });\r\n };\r\n $scope.$apply();\r\n });\r\n underscore_extensions_1.Utils.sequence(lazy_modules_1.jqueryPaymentLib, $ocLazyLoad).then(function () {\r\n $scope.pluginsLoaded = true;\r\n $scope.$apply();\r\n });\r\n $scope.showFillTestCard = !true;\r\n $scope.fillTestCard = function () {\r\n ['number', 'expiry_year', 'expiry_month', 'cvc'].forEach(function (k) {\r\n $scope.stripeForm[k].isValid = true;\r\n });\r\n _.extend($scope, testScope);\r\n };\r\n }\r\n StripeForm.prototype.updateEmail = function (email) {\r\n var _this = this;\r\n this.HttpSvc('profile').securePut({ email: email })\r\n .then(function () { return _this.AuthenticationSvc.updateUser(); });\r\n };\r\n return StripeForm;\r\n}());\r\nangular.module('animatronApp.settings').directive('stripeForm', function () { return ({\r\n restrict: 'E',\r\n require: '^subscription',\r\n transclude: true,\r\n controller: StripeForm,\r\n template: \"
\"\r\n}); });\r\n\n\n/***/ }),\n\n/***/ \"Pzqj\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar SubscriptionPriceBlock = (function () {\r\n SubscriptionPriceBlock.$inject = [\"subscriptionSvc\"];\r\n function SubscriptionPriceBlock(subscriptionSvc) {\r\n this.subscriptionSvc = subscriptionSvc;\r\n }\r\n SubscriptionPriceBlock.prototype.$onChanges = function () {\r\n if (!this.discount)\r\n return;\r\n this.discountedAnnual = this.getDiscountPrice(this.annual);\r\n this.discountedMonthly = this.getDiscountPrice(this.monthly);\r\n };\r\n SubscriptionPriceBlock.prototype.getDiscountPrice = function (price) {\r\n return this.subscriptionSvc.round(price * this.subscriptionSvc.calcDiscount(this.discount));\r\n };\r\n return SubscriptionPriceBlock;\r\n}());\r\nangular.module('animatronApp.settings').component('subscriptionPriceBlock', {\r\n bindings: {\r\n monthly: '<',\r\n annual: '<',\r\n discount: '<'\r\n },\r\n controller: SubscriptionPriceBlock,\r\n templateUrl: __webpack_require__(\"o701\")\r\n});\r\n\n\n/***/ }),\n\n/***/ \"VXOl\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(\"TToO\");\r\nvar underscore_extensions_1 = __webpack_require__(\"R0iF\");\r\nvar AuthenticationSvc_1 = __webpack_require__(\"awAO\");\r\nexports.UPDATE_SUBSCRIPTION_CARD = 'website/subscription/updateCard';\r\nexports.APPLY_COUPON = 'website/subscription/applyCoupon';\r\nexports.CouponCompaniesNames = {\r\n prod: {\r\n AppSumo117: {\r\n title: 'AppSumo'\r\n },\r\n MightyDeals417: {\r\n title: 'MightyDeals'\r\n },\r\n StackSocial0718: {\r\n title: 'StackSocial'\r\n },\r\n defaultCompany: {\r\n title: 'Company'\r\n }\r\n },\r\n dev: {\r\n MightyDeals417: {\r\n title: 'AppSumo'\r\n },\r\n MightyDeals417Test: {\r\n title: 'MightyDeals'\r\n },\r\n StackSocial0718: {\r\n title: 'StackSocial'\r\n },\r\n defaultCompany: {\r\n title: 'Company'\r\n }\r\n }\r\n}[ true ? 'prod' : 'dev'];\r\nvar SubscriptionSvc = (function () {\r\n SubscriptionSvc.$inject = [\"$q\", \"$filter\", \"$http\", \"$rootScope\", \"$state\", \"TranslateSvc\", \"analyticSvc\", \"AuthenticationSvc\", \"affiliateSvc\", \"HttpSvc\"];\r\n function SubscriptionSvc($q, $filter, $http, $rootScope, $state, TranslateSvc, analyticSvc, AuthenticationSvc, affiliateSvc, HttpSvc) {\r\n var _this = this;\r\n this.$q = $q;\r\n this.$filter = $filter;\r\n this.$http = $http;\r\n this.$rootScope = $rootScope;\r\n this.$state = $state;\r\n this.TranslateSvc = TranslateSvc;\r\n this.analyticSvc = analyticSvc;\r\n this.AuthenticationSvc = AuthenticationSvc;\r\n this.affiliateSvc = affiliateSvc;\r\n this.HttpSvc = HttpSvc;\r\n this.specialSubscriptionNames = ['WaveBigAgency', 'WaveSmallAgency'];\r\n this.handlerHttpResponse = function (res) {\r\n var deferred = _this.$q.defer();\r\n if (res && res.data && underscore_extensions_1.Utils.isApiError(res.data)) {\r\n deferred.reject(res.data.errorMessage);\r\n console.error('subscription error: ', res.data);\r\n }\r\n else {\r\n deferred.resolve(res.data);\r\n }\r\n return deferred.promise;\r\n };\r\n this.$rootScope.$on(AuthenticationSvc_1.USER_LOGOUT, function () {\r\n _this.upgradesDiscount = undefined;\r\n _this.cardDetailsCashed = undefined;\r\n _this.cardDetailsErrorMessage = undefined;\r\n });\r\n }\r\n SubscriptionSvc.isStripeError = function (error) {\r\n return error && error.message && error.type;\r\n };\r\n Object.defineProperty(SubscriptionSvc.prototype, \"product\", {\r\n get: function () {\r\n return underscore_extensions_1.Utils.getProduct();\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n Object.defineProperty(SubscriptionSvc.prototype, \"productParams\", {\r\n get: function () {\r\n return { params: { product: this.product } };\r\n },\r\n enumerable: true,\r\n configurable: true\r\n });\r\n SubscriptionSvc.prototype.getError = function (error) {\r\n if (!error)\r\n return null;\r\n if (_.isString(error)) {\r\n return this.getStripeCouponError(error)\r\n || this.getRequiredSubscriptionError(error)\r\n || this.getStripeCardError(error)\r\n || (this.TranslateSvc.has(error.toLowerCase()) && this.TranslateSvc.get(error.toLowerCase()))\r\n || error;\r\n }\r\n else if (SubscriptionSvc.isStripeError(error)) {\r\n return error.message;\r\n }\r\n else {\r\n return error;\r\n }\r\n };\r\n SubscriptionSvc.prototype.findSubscriptionByName = function (displayName) {\r\n // search in upgrades\r\n var upgrade = this.getUpgradesByName(displayName);\r\n if (upgrade)\r\n return this.$q.resolve(upgrade);\r\n // search in current subscription\r\n var currentSubscription = this.getDetails();\r\n if (currentSubscription.displayName === displayName)\r\n return this.$q.resolve(currentSubscription);\r\n // search in downgrade\r\n return this.getDowngradesByName(null, displayName);\r\n };\r\n SubscriptionSvc.prototype.getPredictPrice = function (_a) {\r\n var displayName = _a.displayName, coupon = _a.coupon, params = tslib_1.__rest(_a, [\"displayName\", \"coupon\"]);\r\n var _this = this;\r\n return this.findSubscriptionByName(displayName)\r\n .then(function (_a) {\r\n var name = _a.name;\r\n return _this.HttpSvc('subscription/calculate').secureGet({\r\n params: tslib_1.__assign({}, params, { name: name, coupon: coupon || undefined })\r\n });\r\n })\r\n .then(function (r) { return r.data; });\r\n };\r\n SubscriptionSvc.prototype.isStripe = function () {\r\n return !this.isStripeError && options.user.isStripe();\r\n };\r\n SubscriptionSvc.prototype.getAnnualSave = function (upgrade) {\r\n if (upgrade === void 0) { upgrade = this.getDetails(); }\r\n return (upgrade.monthlyPrice * 12 - upgrade.annualPrice) / 100;\r\n };\r\n SubscriptionSvc.prototype.getAnnualPrice = function (details, discountPercentOff) {\r\n if (details === void 0) { details = this.getDetails(); }\r\n if (discountPercentOff === void 0) { discountPercentOff = details.discount && details.discount.percentOff; }\r\n return this.round(details.annualPrice * this.calcDiscount(discountPercentOff) / 100 / 12);\r\n };\r\n SubscriptionSvc.prototype.getMonthlyPrice = function (details, discountPercentOff) {\r\n if (details === void 0) { details = this.getDetails(); }\r\n if (discountPercentOff === void 0) { discountPercentOff = details.discount && details.discount.percentOff; }\r\n return this.round(details.monthlyPrice * this.calcDiscount(discountPercentOff) / 100);\r\n };\r\n SubscriptionSvc.prototype.isFree = function (currentSubscription) {\r\n if (currentSubscription === void 0) { currentSubscription = this.getDetails(); }\r\n var freeSubscriptions = ['WaveFree', 'Free'];\r\n return freeSubscriptions.includes(currentSubscription.name);\r\n };\r\n SubscriptionSvc.prototype.isHigh = function (currentSubscription) {\r\n if (currentSubscription === void 0) { currentSubscription = this.getDetails(); }\r\n var highSubscriptions = ['WaveBusiness', 'Business'];\r\n return highSubscriptions.includes(currentSubscription.name);\r\n };\r\n SubscriptionSvc.prototype.isSpecial = function (currentSubscription) {\r\n if (currentSubscription === void 0) { currentSubscription = this.getDetails(); }\r\n return this.specialSubscriptionNames.includes(currentSubscription.name);\r\n };\r\n SubscriptionSvc.prototype.isAppSumo = function (_a) {\r\n var _b = _a === void 0 ? this.getDetails() : _a, billingPeriod = _b.billingPeriod, discount = _b.discount;\r\n return discount\r\n && (discount.provider === 'AppSumo117'\r\n || (!true && discount.provider === 'MightyDeals417'));\r\n };\r\n SubscriptionSvc.prototype.getDetails = function () {\r\n var product = this.product.toLowerCase();\r\n var subscription = options.user.subscriptionDetails[product];\r\n return this.prepareSubscription(subscription);\r\n };\r\n SubscriptionSvc.prototype.setUpgradesDiscount = function () {\r\n var _this = this;\r\n this.affiliateSvc.getAffiliateUser().then(function (affiliateInfo) {\r\n _this.upgradesDiscount = affiliateInfo.discount;\r\n });\r\n };\r\n SubscriptionSvc.prototype.getCardDetails = function () {\r\n var _this = this;\r\n return this.HttpSvc('subscription', 'history')\r\n .secureGet(this.productParams)\r\n .then(this.handlerHttpResponse)\r\n .then(function (res) {\r\n _this.isStripeError = res.card.type === 'N/A';\r\n _this.checkExpired(res.card.expires);\r\n _this.cardDetailsCashed = res;\r\n return res;\r\n })\r\n .catch(function (errMsg) {\r\n _this.isStripeError = true;\r\n _this.cardDetailsErrorMessage = errMsg;\r\n return _this.$q.reject(errMsg);\r\n });\r\n };\r\n SubscriptionSvc.prototype.getUpgradesByName = function (name) {\r\n var upgrade = this.getDetails().upgrades.filter(function (upgradeItem) { return upgradeItem && (upgradeItem.name === name || upgradeItem.displayName === name); })[0];\r\n return upgrade && this.prepareSubscription(upgrade);\r\n };\r\n SubscriptionSvc.prototype.getDowngradesByName = function (name, displayName) {\r\n var _this = this;\r\n return this.getDowngrades().then(function (downgrades) {\r\n var downgrade = downgrades.filter(function (downgradeItem) { return downgradeItem && (downgradeItem.name === name || downgradeItem.displayName === displayName); })[0];\r\n return downgrade && _this.prepareSubscription(downgrade);\r\n });\r\n };\r\n SubscriptionSvc.prototype.getUpgrades = function () {\r\n return this.getDetails()\r\n .upgrades\r\n .filter(function (upgrade) { return !upgrade.excludeFromUI && !upgrade.hidden && upgrade.name !== 'WaveEnterprise'; });\r\n };\r\n SubscriptionSvc.prototype.getDowngrades = function () {\r\n return this.HttpSvc('subscription', 'downgrade')\r\n .secureGet(this.productParams)\r\n .then(this.handlerHttpResponse)\r\n .then(function (downgrades) {\r\n return downgrades.filter(function (downgrade) { return !downgrade.excludeFromUI && !downgrade.hidden; });\r\n });\r\n };\r\n SubscriptionSvc.prototype.cancelSubscription = function () {\r\n var _this = this;\r\n var _a = this.getDetails(), displayName = _a.displayName, billingPeriod = _a.billingPeriod;\r\n return this.HttpSvc('subscription', 'cancel')\r\n .secureDelete(this.productParams)\r\n .then(this.handlerHttpResponse)\r\n .then(function () {\r\n _this.cardDetailsCashed = null;\r\n _this.cardDetailsErrorMessage = null;\r\n _this.analyticSvc.changeSubscription('downgrade', displayName, billingPeriod);\r\n return _this.AuthenticationSvc.updateUser();\r\n });\r\n };\r\n SubscriptionSvc.prototype.checkExpired = function (expires) {\r\n var dateArr = expires.split('/');\r\n if (dateArr.length === 2) {\r\n var monthDays = underscore_extensions_1.Utils.getMonthDaysCount().toString();\r\n dateArr.splice(1, 0, monthDays);\r\n }\r\n var formattedDate = dateArr.join('/');\r\n var expiredDate = new Date(formattedDate).getTime();\r\n var currentDate = _.now();\r\n this.isExpired = currentDate >= expiredDate;\r\n };\r\n SubscriptionSvc.prototype.changeSubscription = function (params) {\r\n var _this = this;\r\n var request = function () { return _this.HttpSvc('subscription', 'change')\r\n .securePut(params, { headers: _this.analyticSvc.getGaHeader() }); };\r\n return this.changeSubscriptionErrorHandler(request);\r\n };\r\n SubscriptionSvc.prototype.changeSubscriptionErrorHandler = function (request) {\r\n var _this = this;\r\n var getErrorPromise = function () {\r\n var errorMessage = 'credit.card.processing.error.[expired_card]';\r\n var deferred = _this.$q.defer();\r\n deferred.resolve({ data: { errorMessage: errorMessage } });\r\n return deferred.promise;\r\n };\r\n return this.isExpired ? getErrorPromise() : request();\r\n };\r\n SubscriptionSvc.prototype.updateCard = function (token) {\r\n var _this = this;\r\n var url = options.apiDomain + \"/subscription/card/update\";\r\n var headers = _.extend({\r\n 'Content-Type': 'application/json'\r\n }, options.headers);\r\n return this.$http\r\n .post(url, { token: token }, { headers: headers })\r\n .then(function (r) {\r\n _this.$rootScope.$emit(exports.UPDATE_SUBSCRIPTION_CARD);\r\n return r;\r\n })\r\n .catch(function (err) { return err.status !== -1 ? err : {\r\n data: {\r\n errorCode: 400,\r\n errorMessage: 'subscription.update-card.default-error'\r\n }\r\n }; });\r\n };\r\n SubscriptionSvc.prototype.round = function (num) {\r\n return Math.ceil(num);\r\n };\r\n SubscriptionSvc.prototype.calcDiscount = function (discount) {\r\n return discount ? 1 - discount / 100 : 1;\r\n };\r\n SubscriptionSvc.prototype.makeSpecialSubscription = function (subscription) {\r\n subscription.monthlyPrice = undefined;\r\n return subscription;\r\n };\r\n SubscriptionSvc.prototype.prepareSubscription = function (subscription) {\r\n return this.specialSubscriptionNames.includes(subscription.name) ?\r\n this.makeSpecialSubscription(subscription) : subscription;\r\n };\r\n SubscriptionSvc.prototype.showSubscriptionCanceledMessage = function () {\r\n var details = this.getDetails();\r\n var currentPlan = details.displayName;\r\n var expTime = details.expirationDate;\r\n var date = this.$filter('date')(expTime * 1000, 'short');\r\n var msg = expTime ? \"Subscription will be canceled on \" + date : 'Already canceled';\r\n _.notification.showSuccess(msg);\r\n };\r\n SubscriptionSvc.prototype.getStripeCardError = function (error) {\r\n var matched = error.match(/\\[([A-Za-z_]+)\\]/);\r\n var stripeKey = matched && matched[1];\r\n return stripeKey && this.TranslateSvc.has(stripeKey) ? this.TranslateSvc.get(stripeKey) : null;\r\n };\r\n SubscriptionSvc.prototype.getStripeCouponError = function (error) {\r\n var errorsCode = [\r\n 'Coupon expired',\r\n 'No such coupon',\r\n 'Coupon is not valid',\r\n 'Coupon inapplicable'\r\n ];\r\n var reg = new RegExp(errorsCode.join('|'));\r\n var isCouponError = _.isString(error) && reg.test(error);\r\n return isCouponError && this.TranslateSvc.get('coupon.error');\r\n };\r\n SubscriptionSvc.prototype.getRequiredSubscriptionError = function (error) {\r\n var isRequiredSubscriptionError = _.isString(error) && /required subscription:/.test(error);\r\n if (!isRequiredSubscriptionError)\r\n return false;\r\n var _a = error.match(/\\(([0-9a-zA-Z]+)\\|([0-9a-zA-Z]+)\\)/), plan = _a[1], period = _a[2];\r\n var subscriptionName = plan + \" \" + period;\r\n var productName = underscore_extensions_1.Utils.getProduct().toLowerCase();\r\n var coupon = this.$state.params.coupon;\r\n var upgradeParams = underscore_extensions_1.Utils.toParams({\r\n plan: plan,\r\n coupon: coupon,\r\n period: period.toLowerCase()\r\n });\r\n var url = \"/\" + productName + \"/pricing/upgrade?\" + upgradeParams;\r\n return this.TranslateSvc.get('required.subscription.error', url, subscriptionName);\r\n };\r\n return SubscriptionSvc;\r\n}());\r\nexports.SubscriptionSvc = SubscriptionSvc;\r\nangular.module('animatronApp.SubscriptionSvc', []).service('subscriptionSvc', SubscriptionSvc);\r\n\n\n/***/ }),\n\n/***/ \"WF19\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar underscore_extensions_1 = __webpack_require__(\"R0iF\");\r\nvar PlanAnimation = (function () {\r\n PlanAnimation.$inject = [\"$rootScope\", \"$element\"];\r\n function PlanAnimation($rootScope, $element) {\r\n this.$rootScope = $rootScope;\r\n this.$element = $element;\r\n }\r\n PlanAnimation.prototype.$onInit = function () {\r\n var _this = this;\r\n if (options.handHeld)\r\n return;\r\n underscore_extensions_1.Utils.rAF(function () {\r\n var _a = _this.$element[0].parentElement.getBoundingClientRect(), width = _a.width, height = _a.height;\r\n _this.url = PlanAnimation.Animations[_this.plan.toLowerCase()];\r\n _this.width = width;\r\n _this.height = height;\r\n var video = _this.$element[0].querySelector('video');\r\n var safe = function (f) { return video && _.isFunction(video[f]) && video[f](); };\r\n _this.$rootScope.$on(\"onScreen:\" + _this.url, function () { return safe('play'); });\r\n _this.$rootScope.$on(\"notOnScreen:\" + _this.url, function () { return safe('pause'); });\r\n _this.inited = true;\r\n });\r\n };\r\n PlanAnimation.prototype.$onDestroy = function () {\r\n _.isFunction(window.stop) && window.stop();\r\n };\r\n return PlanAnimation;\r\n}());\r\nPlanAnimation.Animations = _.object(['free', 'pro', 'business'].map(function (plan) {\r\n return [plan, \"https://videos.animatron.com/pricing/\" + plan + (options.retina ? '_2x' : '') + \".mp4\"];\r\n}));\r\nangular.module('animatronApp.planAnimation', []).component('planAnimation', {\r\n bindings: {\r\n plan: '@'\r\n },\r\n controller: PlanAnimation,\r\n template: \"
\\n \\n
\\n
\"\r\n});\r\n\n\n/***/ }),\n\n/***/ \"YMs+\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar underscore_extensions_1 = __webpack_require__(\"R0iF\");\r\nvar TypeformSvc = (function () {\r\n TypeformSvc.$inject = [\"$state\", \"$stateParams\", \"$q\", \"TranslateSvc\", \"subscriptionSvc\", \"AuthenticationSvc\", \"HttpSvc\"];\r\n function TypeformSvc($state, $stateParams, $q, TranslateSvc, subscriptionSvc, AuthenticationSvc, HttpSvc) {\r\n this.$state = $state;\r\n this.$stateParams = $stateParams;\r\n this.$q = $q;\r\n this.TranslateSvc = TranslateSvc;\r\n this.subscriptionSvc = subscriptionSvc;\r\n this.AuthenticationSvc = AuthenticationSvc;\r\n this.HttpSvc = HttpSvc;\r\n this.showDeletedModal = false;\r\n this.userId = this.$stateParams.userid;\r\n }\r\n TypeformSvc.prototype.openTypeFormCancel = function () {\r\n var formId = this.getProduct() === 'wave' ? 'K6si1N' : 'oOu1yB';\r\n var typeformUrl = this.getUrl('downgrade', formId);\r\n window.open(typeformUrl, '_self');\r\n };\r\n TypeformSvc.prototype.openTypeFormDelete = function () {\r\n var formId = this.getProduct() === 'wave' ? 'W3TtpN' : 'OcPZVX';\r\n var typeformUrl = this.getUrl('delete', formId);\r\n this.deleteAccountRequest().then(function () { return window.open(typeformUrl, '_self'); });\r\n };\r\n TypeformSvc.prototype.deleteAccountRequest = function () {\r\n var _this = this;\r\n return this.HttpSvc('profile')\r\n .secureDelete()\r\n .then(function (data) {\r\n return underscore_extensions_1.Utils.isApiError(data)\r\n ? _this.$q.reject(data.errorMessage)\r\n : data;\r\n })\r\n .then(function () { return _this.AuthenticationSvc.logout(); })\r\n .catch(function (err) { return _.notification.showError(err); });\r\n };\r\n TypeformSvc.prototype.getProduct = function () {\r\n return underscore_extensions_1.Utils.getProduct().toLowerCase();\r\n };\r\n TypeformSvc.prototype.getUrl = function (action, typeformId) {\r\n var url = location.host + \"/\" + this.getProduct();\r\n if (action === 'downgrade') {\r\n url = url + \"/settings/subscription\";\r\n }\r\n return \"https://animatron.typeform.com/to/\" + typeformId + \"?email=\" + options.user.email;\r\n };\r\n TypeformSvc.prototype.isLogged = function () {\r\n if (!this.AuthenticationSvc.loggedIn) {\r\n this.openModalLogin();\r\n return false;\r\n }\r\n if (this.userId !== options.user.userId) {\r\n this.AuthenticationSvc.logout();\r\n this.openModalLogin();\r\n return false;\r\n }\r\n return true;\r\n };\r\n TypeformSvc.prototype.openModalLogin = function () {\r\n var _this = this;\r\n var currentUrl = this.$state.current.url + \"=\" + this.$stateParams.userid;\r\n var message = this.TranslateSvc.get('login.redirect-email');\r\n this.$state\r\n .go(this.getProduct() + \"-landing\")\r\n .then(function () { return setTimeout(function () { return _this.AuthenticationSvc.toggleLoginModal(currentUrl, message); }, 0); });\r\n };\r\n return TypeformSvc;\r\n}());\r\nexports.TypeformSvc = TypeformSvc;\r\nangular.module('animatronApp.settings').service('typeformSvc', TypeformSvc);\r\n\n\n/***/ }),\n\n/***/ \"edCO\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar tslib_1 = __webpack_require__(\"TToO\");\r\nvar SubscriptionSvc_1 = __webpack_require__(\"VXOl\");\r\nvar underscore_extensions_1 = __webpack_require__(\"R0iF\");\r\nexports.PREDICT_PRICE_ERROR = 'website/subscription/predictPriceError';\r\nvar SubscriptionPredictPriceContainer = (function () {\r\n SubscriptionPredictPriceContainer.$inject = [\"$q\", \"$scope\", \"$state\", \"subscriptionMessageSvc\", \"subscriptionCouponMessageSvc\", \"$stateParams\", \"$rootScope\", \"subscriptionSvc\"];\r\n function SubscriptionPredictPriceContainer($q, $scope, $state, subscriptionMessageSvc, subscriptionCouponMessageSvc, $stateParams, $rootScope, subscriptionSvc) {\r\n var _this = this;\r\n this.$q = $q;\r\n this.$scope = $scope;\r\n this.$state = $state;\r\n this.subscriptionMessageSvc = subscriptionMessageSvc;\r\n this.subscriptionCouponMessageSvc = subscriptionCouponMessageSvc;\r\n this.$stateParams = $stateParams;\r\n this.$rootScope = $rootScope;\r\n this.subscriptionSvc = subscriptionSvc;\r\n this.applyCouponListener = _.noop;\r\n this.handlerHttpResponse = function (responses) {\r\n var deferred = _this.$q.defer();\r\n var errors = [];\r\n responses.forEach(function (res) {\r\n if (underscore_extensions_1.Utils.isApiError(res)) {\r\n errors.push(_this.subscriptionSvc.getError(res.errorMessage));\r\n }\r\n });\r\n if (errors.length > 0) {\r\n deferred.reject(errors);\r\n }\r\n else {\r\n deferred.resolve(responses);\r\n }\r\n return deferred.promise;\r\n };\r\n var init = function (coupon) { return _this.setCurrentSubscription(coupon)\r\n .then(function () { return _this.setPrice(); }); };\r\n !this.hide && init(this.$stateParams.coupon);\r\n this.applyCouponListener = this.$rootScope.$on(SubscriptionSvc_1.APPLY_COUPON, function (e, coupon) { return init(coupon); });\r\n }\r\n SubscriptionPredictPriceContainer.prototype.$onDestroy = function () {\r\n this.applyCouponListener();\r\n };\r\n SubscriptionPredictPriceContainer.prototype.$onChanges = function (onChangesObj) {\r\n var _this = this;\r\n if (!onChangesObj.period || onChangesObj.period.isFirstChange())\r\n return;\r\n this.$rootScope.$emit(exports.PREDICT_PRICE_ERROR, ''); // clear previous error message\r\n this.currentPeriod = onChangesObj.period.currentValue.toLowerCase();\r\n this.$state\r\n .go(this.$state.current, tslib_1.__assign({}, this.$stateParams, { period: this.currentPeriod }), { notify: false })\r\n .finally(function () { return !_this.loading && _this.setPrice(); });\r\n };\r\n SubscriptionPredictPriceContainer.prototype.setCurrentSubscription = function (coupon) {\r\n var _this = this;\r\n this.loading = true;\r\n return this.$q.all([\r\n this.getPredictPrice(coupon),\r\n this.getStaticSubscription()\r\n ])\r\n .then(this.handlerHttpResponse)\r\n .then(function (subscriptions) {\r\n var predictSubscription = subscriptions[0], staticSubscription = subscriptions[1];\r\n _this.predictSubscription = predictSubscription;\r\n _this.staticSubscription = staticSubscription;\r\n })\r\n .catch(function (errors) {\r\n _this.subscriptionMessageSvc.hideMassage();\r\n _this.$rootScope.$emit(exports.PREDICT_PRICE_ERROR, errors[0]);\r\n return _this.$q.reject(errors);\r\n })\r\n .finally(function () {\r\n _this.loading = false;\r\n });\r\n };\r\n SubscriptionPredictPriceContainer.prototype.setPrice = function () {\r\n var _a = this.$stateParams, period = _a.period, plan = _a.plan;\r\n if (!plan)\r\n return;\r\n this.currentPeriod = this.currentPeriod || period;\r\n var _b = this.staticSubscription, annualPrice = _b.annualPrice, monthlyPrice = _b.monthlyPrice, displayName = _b.displayName;\r\n this.planName = displayName;\r\n // transform prices from array to object\r\n var pricesObj = this.predictSubscription.prices.reduce(function (prices, price) {\r\n if (price.period === 'ANNUAL') {\r\n prices.annual = price;\r\n }\r\n else if (price.period === 'MONTHLY') {\r\n prices.monthly = price;\r\n }\r\n return prices;\r\n }, {});\r\n var currentPredictPriceData;\r\n if (this.currentPeriod === 'annual') {\r\n currentPredictPriceData = pricesObj.annual;\r\n this.currentPrice = monthlyPrice * 12 / 100 || annualPrice / 100;\r\n this.annualDiscount = this.currentPrice - (annualPrice / 100);\r\n }\r\n else if (this.currentPeriod === 'monthly') {\r\n currentPredictPriceData = pricesObj.monthly;\r\n this.currentPrice = monthlyPrice / 100;\r\n this.annualDiscount = null;\r\n }\r\n else {\r\n throw new Error('incorrect period name');\r\n }\r\n this.setupDiscount(currentPredictPriceData);\r\n var currentPredictPrice = currentPredictPriceData.price / 100;\r\n var currentPredictPriceRounded = this.subscriptionSvc.round(currentPredictPrice);\r\n var startingBalance = this.subscriptionSvc.round(this.predictSubscription.startingBalance / 100);\r\n this.credit = startingBalance < 0 ? -startingBalance : 0;\r\n this.totalPrice = currentPredictPriceRounded >= 0 ? currentPredictPriceRounded : 0;\r\n this.subscriptionSvc.totalPriceLastValue = this.totalPrice;\r\n };\r\n SubscriptionPredictPriceContainer.prototype.setupDiscount = function (_a) {\r\n var discount = _a.discount;\r\n this.subscriptionMessageSvc.hideMassage();\r\n if (!discount)\r\n return;\r\n var error = discount.error, amount = discount.amount, percents = discount.percents;\r\n if (error) {\r\n this.$rootScope.$emit(exports.PREDICT_PRICE_ERROR, this.subscriptionSvc.getError(error));\r\n }\r\n else {\r\n this.amountDiscount = amount / 100;\r\n this.percentsDiscount = percents;\r\n var message = this.subscriptionCouponMessageSvc.get(discount);\r\n this.subscriptionMessageSvc.showSuccess(message);\r\n }\r\n };\r\n SubscriptionPredictPriceContainer.prototype.getStaticSubscription = function () {\r\n return this.subscriptionSvc.findSubscriptionByName(this.$stateParams.plan);\r\n };\r\n SubscriptionPredictPriceContainer.prototype.getPredictPrice = function (coupon) {\r\n var _a = this.$stateParams, plan = _a.plan, period = _a.period;\r\n return this.subscriptionSvc.getPredictPrice({\r\n period: period,\r\n coupon: coupon,\r\n displayName: plan\r\n });\r\n };\r\n return SubscriptionPredictPriceContainer;\r\n}());\r\nangular.module('animatronApp.SubscriptionPredictPriceContainer', [])\r\n .component('subscriptionPredictPriceContainer', {\r\n bindings: {\r\n period: '<',\r\n hide: '<'\r\n },\r\n controller: SubscriptionPredictPriceContainer,\r\n templateUrl: __webpack_require__(\"gGiH\")\r\n});\r\n\n\n/***/ }),\n\n/***/ \"gGiH\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"html/subscription-predict-price-container_c43307d31652cc92c825efb25c575167.html\";\n\n/***/ }),\n\n/***/ \"gojZ\":\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nvar CouponDirective = (function () {\r\n CouponDirective.$inject = [\"$state\", \"HttpSvc\", \"AuthenticationSvc\"];\r\n function CouponDirective($state, HttpSvc, AuthenticationSvc) {\r\n this.$state = $state;\r\n this.HttpSvc = HttpSvc;\r\n this.AuthenticationSvc = AuthenticationSvc;\r\n }\r\n CouponDirective.prototype.applyCoupon = function (coupon) {\r\n var _this = this;\r\n this.couponError = undefined;\r\n this.applyingCoupon = true;\r\n this.HttpSvc('coupon', coupon).securePost().then(function (r) { return r.data; }).then(function (response) {\r\n if (_.isObject(response) && response.errorCode !== 200) {\r\n _this.couponError = response.errorMessage;\r\n }\r\n else {\r\n _this.coupon = '';\r\n _this.AuthenticationSvc.notifyUserChange();\r\n _this.AuthenticationSvc.updateUser().then(function () {\r\n _this.SubscriptionCtrl.updateSubscriptionDetails();\r\n _this.SubscriptionCtrl.upgradedTo = response.errorMessage;\r\n _this.SubscriptionCtrl.toggleUpgradeResultModal(function () { return _this.$state.go('studio-settings.subscription'); });\r\n });\r\n }\r\n }).finally(function () { return _this.applyingCoupon = false; });\r\n };\r\n ;\r\n return CouponDirective;\r\n}());\r\nangular.module('animatronApp.settings').component('coupon', {\r\n require: { SubscriptionCtrl: '^subscription' },\r\n controller: CouponDirective,\r\n templateUrl: __webpack_require__(\"52SV\")\r\n});\r\n\n\n/***/ }),\n\n/***/ \"ipbz\":\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\r\nCertificate code:\r\nOld: mhttp://youtrack.animatron.com/youtrack/issue/WEB-683\r\nNew: https://youtrack.animatron.com/youtrack/issue/WEB-2649\r\n */\r\nvar SecurePayment = (function () {\r\n function SecurePayment() {\r\n this.imageSrc = 'https://wwwsslcom.a.cdnify.io/assets/ssl_seal_1-3dfcdf69a9e544495dbcf366a74ee5c4baca7e4f8018f7ddfa22f2de9bcf464d.png';\r\n }\r\n SecurePayment.prototype.getHref = function () {\r\n return \"https://www.ssl.com/team/a3d-1b33o49/site_seals/\" + this.getId() + \"/site_report\";\r\n };\r\n SecurePayment.prototype.openWindow = function (e) {\r\n e.preventDefault();\r\n window.open(\"https://www.ssl.com/team/a3d-1b33o49/site_seals/\" + this.getId() + \"/site_report\", 'site_report', 'height=500, width=400, top=100, left=100');\r\n };\r\n SecurePayment.prototype.getId = function () {\r\n var user = options.user, isProduction = true;\r\n return user.zoneCode === 'kr'\r\n ? '4c157bc0-57032320' : isProduction\r\n ? '4f7e3f09-59fb2fa3'\r\n : '48ed36cd-59a99ce5';\r\n };\r\n return SecurePayment;\r\n}());\r\nangular.module('animatronApp.settings').component('securePayment', {\r\n controller: SecurePayment,\r\n template: \"
\\n \\n \\\"Ssl\\n \\n Secure credit card payment\\n
\"\r\n});\r\n\n\n/***/ }),\n\n/***/ \"izVX\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar subscriptionTypesData = {\r\n free: [\r\n 'subscription.public-projects',\r\n 'subscription.watermark',\r\n 'subscription.limited-export-formats'\r\n ],\r\n starter: [\r\n 'subscription.unlimited-public-projects',\r\n 'subscription.unlisted-projects',\r\n 'subscription.import-stuff',\r\n 'subscription.limited-export-formats',\r\n 'subscription.no-end-screen',\r\n 'subscription.basic-permissions'\r\n ],\r\n pro3: [\r\n 'subscription.unlimited-projects',\r\n 'subscription.no-watermark',\r\n 'subscription.collaborative-video'\r\n ],\r\n business: [\r\n 'subscription.unlimited-projects',\r\n 'subscription.available-features',\r\n 'subscription.premium-storage',\r\n 'subscription.priority-rendering',\r\n 'subscription.premium-support'\r\n ],\r\n wavefree: [\r\n 'wv.subscription.5-videos',\r\n 'wv.subscription.limited-clips',\r\n 'wv.subscription.watermark'\r\n ],\r\n wavepro: [\r\n 'wv.subscription.small-businesses',\r\n 'wv.subscription.1-brand',\r\n 'wv.subscription.3m-royalty-free',\r\n 'wv.subscription.no-watermark',\r\n 'wv.subscription.unlimited-videos-per-month'\r\n ],\r\n wavebusiness: [\r\n 'wv.subscription.corporate-marketers',\r\n 'wv.subscription.600-royalty-free',\r\n 'wv.subscription.premium-clips',\r\n 'wv.subscription.no-watermark',\r\n 'wv.subscription.unlimited-videos',\r\n 'wv.subscription.customer-support'\r\n ],\r\n waveagency: [\r\n 'wv.subscription.corporate-marketers',\r\n 'wv.subscription.20brands',\r\n 'wv.subscription.white-label-preview',\r\n 'wv.subscription.no-watermark',\r\n 'wv.subscription.3m-stock',\r\n 'wv.subscription.unlimited-videos',\r\n 'wv.subscription.customer-support'\r\n ],\r\n wavebigagency: [\r\n 'wv.subscription.Ideal-for-agencies',\r\n 'wv.subscription.2.5-million-video',\r\n 'wv.subscription.3rd-party-sell-them',\r\n 'wv.subscription.videos-for-many-brands',\r\n 'wv.subscription.Import-100Gb-media'\r\n ],\r\n waveultimate: [\r\n 'wv.subscription.ideal-for-create-videos',\r\n 'wv.subscription.50brands',\r\n 'wv.subscription.3m-stock',\r\n 'wv.subscription.white-label-preview',\r\n 'wv.subscription.no-watermark',\r\n 'wv.subscription.unlimited-videos',\r\n 'wv.subscription.customer-support'\r\n ],\r\n wavesmallagency: [\r\n 'wv.subscription.best-for-small-agencies',\r\n 'wv.subscription.2.5-million-video',\r\n 'wv.subscription.3rd-party-someone-else',\r\n 'wv.subscription.videos-for-many-brands'\r\n ]\r\n};\r\nvar SubscriptionTypes = (function () {\r\n function SubscriptionTypes() {\r\n }\r\n SubscriptionTypes.prototype.$onChanges = function () {\r\n this.types = subscriptionTypesData[this.subscriptionName.toLowerCase()];\r\n };\r\n return SubscriptionTypes;\r\n}());\r\nangular.module('animatronApp.settings').component('subscriptionTypes', {\r\n bindings: {\r\n subscriptionName: '<'\r\n },\r\n controller: SubscriptionTypes,\r\n templateUrl: __webpack_require__(\"F5f2\")\r\n});\r\n\n\n/***/ }),\n\n/***/ \"o701\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"html/subscription-price-block_d930eeb8cc868aec2efbcce26babaecd.html\";\n\n/***/ }),\n\n/***/ \"py5d\":\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__.p + \"html/subscription_b19e36422bfd5919c31a5643d5642656.html\";\n\n/***/ }),\n\n/***/ \"rCIs\":\n/***/ (function(module, exports) {\n\nangular.module('animatronApp.settings').directive('upgradePlan', function () {\r\n return function (scope) {\r\n scope.coupon = {};\r\n };\r\n});\r\n\n\n/***/ })\n\n});\n\n\n// WEBPACK FOOTER //\n// javascripts/3-257c10c0995a4d25fa59.min.js","import {Strings} from 'Strings';\nimport {stripeLib} from 'services/AsyncJSLoader';\nimport {AuthenticationSvc} from '../../services/AuthenticationSvc';\n// import {UpgradeOneProjectSvc} from '../../services/upgradeOneProjectSvc';\nimport {TranslateSvc} from '../../services/TranslateSvc';\nimport {TypeformSvc} from '../services/TypeformSvc';\nimport BillingPeriod = anm.BillingPeriod;\nimport {AnalyticSvc} from '../../services/AnalyticSvc';\nimport {Utils} from '../../underscore-extensions';\nimport {APPLY_COUPON, CouponCompaniesNames, SubscriptionSvc} from '../services/SubscriptionSvc';\nimport {PREDICT_PRICE_ERROR} from '../subscription/containers/SubscriptionPredictPriceContainer';\nimport {SubscriptionMessagesSvc} from '../subscription/messages/SubscriptionMessagesSvc';\n\nexport interface UpgradeModal {\n chosen: boolean;\n}\n\ntype SubscriptionsParamsModal =\n 'editCard'\n | 'upgrade'\n | 'thank-you'\n | 'cancel'\n | 'sorry-to-see-you-go'\n | 'downgrade'\n | 'switch-period'\n | '';\n\nexport interface SubscriptionsParams extends ng.ui.IStateParamsService {\n period?: string;\n redeem?: boolean;\n plan?: string;\n coupon?: string;\n special?: string;\n modal?: SubscriptionsParamsModal;\n}\n\ninterface SubscriptionsScope extends ng.IScope {\n billing?: { period: string };\n}\n\nexport const SUBSCRIPTION_OPEN_MODAL = 'website/subscription/openModal';\n\nexport class SubscriptionCtrl {\n responseError: string;\n planName: string;\n subscriptionPredictPrice: anm.SubscriptionDetails;\n upgradedTo: string;\n cardDetails: anm.CardDetails;\n isRedeem = this.$state.params.redeem;\n cbUpgradeResult: Function = angular.noop;\n loading = false;\n upgradeAction: anm.UpgradeAction;\n confirmDowngradeShown = false;\n cancelModalShown = false;\n isChangeCard = false;\n upgradeResultShown = false;\n changeBillingShowNext = false;\n downgradeResultShown = false;\n upgradeProjectResultShown = false;\n cardEditSuccessShown = false;\n billingChangeSuccessShown = false;\n changeBillingShown = false;\n showEditCard = false;\n productName: string;\n cardDetailsErrorMessage: string;\n couponCompanyName: string;\n loadingDetails: boolean;\n showDetails: boolean;\n subscriptionDetails: anm.SubscriptionDetails;\n isFree: boolean;\n isHigh: boolean;\n isSpecial: boolean;\n isAppSumo: boolean;\n isStripe = () => this.subscriptionSvc.isStripe();\n\n mapSpecialUpgrades = {\n 'small-agency': 'WaveSmallAgency',\n agency: 'WaveBigAgency',\n };\n\n getStarterPricing = {\n monthlyPrice: 600,\n annualPrice: 6000\n };\n\n private clearOpenModalListener = _.noop;\n private clearPredictPriceErrorListener = _.noop;\n\n constructor(private $scope: SubscriptionsScope,\n private $q: ng.IQService,\n private $state: ng.ui.IStateService,\n private $stateParams: SubscriptionsParams,\n private $rootScope: ng.IRootScopeService,\n private AuthenticationSvc: AuthenticationSvc,\n private subscriptionMessageSvc: SubscriptionMessagesSvc,\n private analyticSvc: AnalyticSvc,\n // private upgradeOneProjectSvc: UpgradeOneProjectSvc,\n private typeformSvc: TypeformSvc,\n private subscriptionSvc: SubscriptionSvc,\n private TranslateSvc: TranslateSvc) {\n this.productName = Utils.getProduct() === 'WAVE' ? 'Wave.video' : 'Studio';\n\n if (/typeform/.test(document.referrer)) {\n this.subscriptionSvc.showSubscriptionCanceledMessage();\n }\n this.trackVisit();\n this.updateSubscriptionDetails();\n\n if (this.subscriptionSvc.cardDetailsCashed) {\n this.showDetails = this.isStripe();\n this.cardDetails = this.subscriptionSvc.cardDetailsCashed;\n } else if (this.subscriptionSvc.cardDetailsErrorMessage) {\n this.cardDetailsErrorMessage = this.subscriptionSvc.cardDetailsErrorMessage;\n } else {\n this.setCardDetails();\n }\n\n this.subscriptionSvc.setUpgradesDiscount();\n this.openModal();\n stripeLib().then(() => window.Stripe.setPublishableKey(options.user.stripeKey()));\n\n this.setBillingPeriodScope();\n\n this.clearPredictPriceErrorListener = this.$rootScope.$on(PREDICT_PRICE_ERROR, (e, errorMessage: string) => this.responseError = errorMessage);\n this.clearOpenModalListener = this.$rootScope.$on(\n SUBSCRIPTION_OPEN_MODAL,\n (e, {modal, ...params}: SubscriptionsParams) => this.changeModalUrl(modal, params)\n );\n }\n\n $onDestroy() {\n this.clearOpenModalListener();\n this.clearPredictPriceErrorListener();\n }\n\n processResponse = (httpResponse: ng.IHttpPromiseCallbackArg): ng.IPromise => {\n const deferred = this.$q.defer();\n const response = httpResponse.data;\n\n if (Utils.isApiError(response)) {\n const errorMsg = this.errorResponse(response);\n deferred.reject(errorMsg);\n } else {\n this.successResponse().then(() => deferred.resolve(response));\n }\n return deferred.promise;\n }\n\n stopLoading = () => this.loading = false;\n\n get upgrades() {\n return this.$stateParams.special ? this.getSpecialUpgrades() : this.subscriptionSvc.getUpgrades();\n }\n\n private setBillingPeriodScope() {\n const {period} = this.$stateParams;\n const currentPeriod = period && period.toLowerCase() === 'annual'\n ? 'ANNUAL'\n : 'MONTHLY';\n\n this.$scope.billing = {period: currentPeriod};\n }\n\n applyCoupon(coupon: string) {\n this.responseError = '';\n this.subscriptionMessageSvc.hideMassage();\n this.$rootScope.$emit(APPLY_COUPON, coupon);\n this.$state.go(this.$state.current, {coupon}, {notify: false});\n }\n\n goTo(url: string) {\n const product = Utils.getProduct().toLocaleLowerCase();\n this.$state.go(`${product}-${url}`);\n }\n\n trackVisit() {\n if (!this.$stateParams.modal) {\n this.analyticSvc.visitPage('Subscription');\n }\n }\n\n getBillingPrice(price: number, isRound = true) {\n const newPrice = price * this.subscriptionSvc.calcDiscount(this.subscriptionSvc.upgradesDiscount) / 100.0;\n return isRound ? Math.ceil(newPrice) : newPrice;\n }\n\n getBillingSaving(upgrade: anm.SubscriptionDetails) {\n const monthly = this.getBillingPrice(upgrade.monthlyPrice, false);\n const annual = this.getBillingPrice(upgrade.annualPrice, false);\n const save = monthly * 12 - annual;\n const saveFixed = Number((save).toFixed(2));\n\n return Math.ceil(saveFixed);\n }\n\n isPriceShown() {\n const period = this.subscriptionDetails.billingPeriod.toLowerCase();\n return period === 'coupon' || options.user.isStripe();\n }\n\n showUpgradeModal(upgrade: anm.SubscriptionDetails, billingPeriod: anm.BillingPeriod) {\n this.changeModalUrl('upgrade', {plan: upgrade.displayName, period: billingPeriod.toLowerCase()})\n }\n\n getFree() {\n const free = {\n wave: {\n name: 'WaveFree',\n displayName: 'WaveFree'\n },\n studio: {\n name: 'Free',\n displayName: 'Free'\n }\n };\n return free[this.subscriptionSvc.product.toLowerCase()]\n }\n\n getError(error?: string | StripeError): string {\n return this.subscriptionSvc.getError(error);\n }\n\n showChangeCardView() {\n this.isChangeCard = true;\n this.responseError = null;\n }\n\n errorResponse(response?: ApiError & StripeTokenResponse | any) {\n this.responseError = '';\n if (!response) return true;\n const error = this.getError(response.error || response.errorMessage);\n if (error) {\n this.loading = false;\n this.responseError = error;\n } else {\n return false;\n }\n return error;\n }\n\n successResponse() {\n this.AuthenticationSvc.notifyUserChange();\n return this.setCardDetails()\n .then(() => this.AuthenticationSvc.updateUser())\n .then(() => this.updateSubscriptionDetails())\n .finally(() => this.stopLoading());\n }\n\n setCardDetails() {\n this.loadingDetails = true;\n return this.subscriptionSvc.getCardDetails()\n .then((response: anm.CardDetails) => {\n this.showDetails = this.isStripe();\n this.cardDetails = response;\n })\n .catch((errorMessage) => this.cardDetailsErrorMessage = errorMessage)\n .finally(() => {\n this.loadingDetails = false;\n this.loading = false;\n });\n }\n\n changeSubscription(params: anm.ChangeSubscriptionRequest): ng.IPromise {\n this.loading = true;\n return this.subscriptionSvc\n .changeSubscription(params)\n .then(this.processResponse)\n .finally(this.stopLoading);\n }\n\n upgradeSubscription(params: anm.ChangeSubscriptionRequest, action: anm.UpgradeAction = 'upgrade') {\n const {displayName, billingPeriod} = this.subscriptionDetails;\n\n return this.changeSubscription(params).then(response => {\n if (this.changeBillingShown) {\n this.changeBillingPeriodRequestHandler(billingPeriod);\n } else {\n this.upgradedTo = response.displayName;\n\n this.analyticSvc.changeSubscription(\n action,\n displayName,\n billingPeriod,\n this.upgradedTo,\n response.billingPeriod,\n response.chargedAmount / 100.0,\n params.couponCode\n );\n\n this.toggleUpgradeModal();\n this.addTransaction();\n action === 'upgrade' ? this.toggleUpgradeResultModal() : this.toggleDowngradeResultModal();\n }\n\n });\n }\n\n upgradeWithToken(name: string,\n period: BillingPeriod,\n couponCode = '',\n upgradeModal: UpgradeModal,\n action?: anm.UpgradeAction): void {\n this.upgradeSubscription({name, period, couponCode}, action)\n .then(() => {\n if (upgradeModal) {\n upgradeModal.chosen = false;\n }\n });\n }\n\n // upgradeProject(period: string,\n // projectId: string,\n // token: string,\n // name: string,\n // couponCode: string,\n // upgradeModal: UpgradeModal) {\n // this.loading = true;\n //\n // return this.upgradeOneProjectSvc.upgrade(period, projectId, token, name, couponCode)\n // .then(() => {\n // this.upgradedTo = period;\n // if (upgradeModal) {\n // upgradeModal.chosen = false;\n // }\n // this.toggleUpgradeProjectResultModal();\n // })\n // .finally(this.stopLoading.bind(this));\n // };\n\n cancelSubscription() {\n this.loading = true;\n\n this.subscriptionSvc.cancelSubscription()\n .then(() => this.goDefaultState())\n .then(() => this.typeformSvc.openTypeFormCancel())\n .finally(() => this.loading = false);\n }\n\n changeBillingPeriod(period: anm.BillingPeriod, couponCode = '') {\n const currentSubscription = this.subscriptionDetails.name;\n const oldPeriod = this.subscriptionDetails.billingPeriod;\n\n return this.changeSubscription({period, name: currentSubscription, couponCode})\n .then(() => this.changeBillingPeriodRequestHandler(oldPeriod));\n }\n\n updateCard(token: string) {\n this.loading = true;\n return this.subscriptionSvc\n .updateCard(token)\n .then(this.processResponse)\n .then(() => {\n this.showEditCard = false;\n this.cardEditSuccessShown = true;\n })\n .finally(this.stopLoading);\n }\n\n isEmailCorrect = () => /^.+@.+$/.test(options.user.email);\n\n getAlternativePeriod = () => this.isMonthly() ? 'annual' : 'monthly';\n\n showEditCardDetails() {\n this.changeModalUrl('editCard', {plan: '', period: ''});\n }\n\n toggleConfirmDowngradeModal = () => this.confirmDowngradeShown = !this.confirmDowngradeShown;\n\n toggleCancelModal = () => {\n if (this.cancelModalShown) {\n this.cancelModalShown = false;\n this.goDefaultState();\n this.analyticSvc.upgradeShown('downgrade');\n } else {\n this.changeModalUrl('cancel');\n }\n }\n\n handlerModalClose() {\n this.goDefaultState();\n }\n\n changeBillingModalCloseHandler() {\n this.changeBillingShown = false;\n this.goDefaultState();\n }\n\n upgradeModalCloseHandler() {\n this.$scope.upgradeModal.chosen = false;\n this.goDefaultState();\n }\n\n toggleUpgradeResultModal = (cb = angular.noop) => {\n if (this.upgradeResultShown) {\n this.upgradeResultShown = false;\n this.cbUpgradeResult = cb;\n this.goDefaultState();\n } else {\n this.changeModalUrl('thank-you');\n this.cbUpgradeResult();\n }\n }\n\n toggleDowngradeResultModal = () => this.downgradeResultShown = !this.downgradeResultShown;\n\n // toggleUpgradeProjectResultModal = () => {\n // this.upgradeProjectResultShown = !this.upgradeProjectResultShown;\n // if (!this.upgradeProjectResultShown) {\n // this.upgradeOneProjectSvc.updateProjectArgs();\n // }\n // };\n\n toggleChangeBilling = () => {\n if (this.isStripe()) {\n this.changeBillingShown = !this.changeBillingShown;\n\n if (!this.changeBillingShown) {\n this.goDefaultState();\n }\n } else {\n this.changeBillingShowNext = true;\n this.showEditCardDetails();\n }\n }\n\n hideCardEditSuccess() {\n this.cardEditSuccessShown = false;\n this.openNextModal();\n }\n\n hideBillingChangeSuccess = () => this.billingChangeSuccessShown = false;\n\n renewAppSumo() {\n this.changeModalUrl('upgrade', {plan: 'Business', period: 'annual'});\n }\n\n isErrorRequiredFields(form: ng.IFormController) {\n return form && Object.keys(form.$error).length === 1 && form.$error.required;\n }\n\n isMonthly() {\n return this.subscriptionDetails.billingPeriod.toLowerCase() === 'monthly';\n }\n\n getAnnualSave() {\n return this.subscriptionSvc.getAnnualSave();\n }\n\n getPrice() {\n return this.isMonthlyPeriod() ?\n this.subscriptionSvc.getMonthlyPrice() :\n this.subscriptionSvc.getAnnualPrice();\n }\n\n updateSubscriptionDetails() {\n this.subscriptionDetails = this.subscriptionSvc.getDetails();\n this.isFree = this.subscriptionSvc.isFree();\n this.isHigh = this.subscriptionSvc.isHigh();\n this.isSpecial = this.subscriptionSvc.isSpecial();\n this.isAppSumo = this.subscriptionSvc.isAppSumo();\n this.couponCompanyName = this.isAppSumo ? this.getCouponCompanyName() : '';\n this.planName = this.getPlanName();\n }\n\n private changeBillingPeriodRequestHandler(oldPeriod: string) {\n const newPeriod = this.subscriptionDetails.billingPeriod;\n this.analyticSvc.changeBillingPeriod(oldPeriod, newPeriod);\n this.billingChangeSuccessShown = true;\n this.toggleChangeBilling();\n }\n\n private getPlanName() {\n const {displayName, billingPeriod} = this.subscriptionDetails;\n const period = /coupon/i.test(billingPeriod) ? '' : billingPeriod;\n return `${displayName} ${period}`;\n }\n\n private getCouponCompanyName() {\n const {displayName, discount: {provider}} = this.subscriptionDetails;\n const dealText = this.TranslateSvc.get('deal');\n const providerInfo = CouponCompaniesNames[provider];\n const providerText = providerInfo ? `- ${providerInfo.title} ${dealText}` : '';\n\n return `${displayName} ${providerText}`;\n }\n\n private openNextModal() {\n if (this.changeBillingShowNext) {\n this.changeBillingShown = true;\n }\n }\n\n private goDefaultState() {\n return this.$state.go(\n this.$state.current,\n {\n modal: '',\n plan: '',\n period: '',\n coupon: ''\n },\n {notify: false}\n );\n }\n\n private changeModalUrl(modal?: SubscriptionsParamsModal, params: SubscriptionsParams = {}) {\n const {displayName, billingPeriod} = this.subscriptionDetails;\n\n const extendParams = {\n plan: displayName,\n period: billingPeriod.toLowerCase(),\n ...params\n };\n\n this.$state\n .go(\n this.$state.current,\n {modal, ...extendParams},\n {notify: false}\n )\n .finally(() => this.openModal({modal, ...extendParams}));\n }\n\n private addTransaction() {\n if (this.subscriptionSvc.totalPriceLastValue <= 0) return;\n\n const {displayName, billingPeriod} = this.subscriptionSvc.getDetails();\n const subscriptionName = `${displayName} - ${billingPeriod}`;\n\n this.analyticSvc.addTransaction(`${this.subscriptionSvc.totalPriceLastValue}`, subscriptionName);\n }\n\n private openModal(params?: SubscriptionsParams) {\n const {modal, plan} = {...this.$stateParams, ...params} as SubscriptionsParams;\n this.setBillingPeriodScope();\n this.responseError = ''; // remove all previous errors\n this.subscriptionMessageSvc.hideMassage();\n this.isChangeCard = false;\n\n switch (modal) {\n case 'thank-you': {\n this.upgradedTo = plan;\n this.upgradeResultShown = true;\n break;\n }\n case 'cancel': {\n this.cancelModalShown = true;\n break;\n }\n case 'upgrade': {\n this.openChangeSubscriptionModal('upgrade')\n .then(() => this.toggleUpgradeModal());\n break;\n }\n case 'downgrade': {\n if (plan === 'Free') {\n this.toggleCancelModal();\n } else {\n this.openChangeSubscriptionModal('downgrade')\n .then(() => this.toggleUpgradeModal());\n }\n break;\n }\n case 'switch-period': {\n this.openChangeSubscriptionModal();\n this.toggleChangeBilling();\n break;\n }\n case 'editCard': {\n this.showEditCard = true;\n break;\n }\n }\n }\n\n private openChangeSubscriptionModal(action?: anm.UpgradeAction) {\n this.subscriptionPredictPrice = null; // needed for correct works ng-init directive\n return this.subscriptionSvc.findSubscriptionByName(this.$stateParams.plan)\n .then((subscription) => {\n this.subscriptionPredictPrice = subscription;\n\n if (action) {\n this.upgradeAction = action;\n }\n });\n }\n\n private toggleUpgradeModal() {\n if (!this.$scope.upgradeModal) this.$scope.upgradeModal = {};\n this.$scope.upgradeModal.chosen = !this.$scope.upgradeModal.chosen;\n\n if (!this.$scope.upgradeModal.chosen) {\n this.goDefaultState();\n }\n }\n\n private getSpecialUpgrades() {\n const specialUpgradeName = this.mapSpecialUpgrades[this.$stateParams.special];\n const specialUpgrade = this.subscriptionSvc.getUpgradesByName(specialUpgradeName);\n const specialUpgrades = [] as anm.SubscriptionDetails[];\n this.$scope.billing.period = 'ANNUAL';\n specialUpgrade && specialUpgrades.push(specialUpgrade);\n\n return specialUpgrades;\n }\n\n private isMonthlyPeriod() {\n return this.subscriptionDetails.monthlyPrice && this.subscriptionDetails.billingPeriod\n .toLowerCase()\n .includes('monthly');\n }\n}\n\n\nangular.module('animatronApp.settings').directive('subscription', () => ({\n controllerAs: 'SubscriptionCtrl',\n controller: SubscriptionCtrl\n}));\n\nangular.module('animatronApp.settings').directive('subscriptionPage', () => ({\n templateUrl: require('settings/subscription.html')\n}));\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/directives/Subscriptions.ts","module.exports = __webpack_public_path__ + \"html/coupon_a289a7646b5b15e2d94c7903ad6aef29.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./app/assets/html/upgrade/coupon.html\n// module id = 52SV\n// module chunks = 3","class InfoAppSumo implements ng.IComponentController {\n name: string;\n displayName: string;\n isFree: boolean;\n price: number;\n expirationDate: number;\n expirationMediumDate: string;\n onRenew: Function = this.onRenew || angular.noop;\n\n constructor(private $filter: ng.IFilterService) {\n this.expirationMediumDate = this.$filter('date')(this.expirationDate * 1000, 'mediumDate');\n }\n\n renew() {\n this.onRenew();\n }\n}\n\nangular.module('animatronApp.settings').component('infoAppSumo', {\n bindings: {\n name: '<',\n displayName: '<',\n isFree: '<',\n price: '<',\n expirationDate: '<',\n onRenew: '&'\n },\n controller: InfoAppSumo,\n templateUrl: require('settings/info-app-sumo.html')\n});\n\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/directives/infoAppSumo.ts","module.exports = __webpack_public_path__ + \"html/info-app-sumo_e7389d67d8d687d427f604be76e0a338.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./app/assets/html/settings/info-app-sumo.html\n// module id = AMWW\n// module chunks = 3","import {Strings} from 'Strings';\nimport {jqueryPaymentLib} from 'lazy_modules';\nimport {SubscriptionsParams, SubscriptionCtrl} from './Subscriptions';\nimport {Utils} from 'underscore-extensions';\nimport {SubscriptionSvc} from '../services/SubscriptionSvc';\nimport {AnalyticSvc} from '../../services/AnalyticSvc';\n\nclass SubscriptionPlan {\n private SubscriptionCtrl: SubscriptionCtrl = this.$element.controller('subscription');\n\n constructor(private $scope: any,\n private $stateParams: SubscriptionsParams,\n private $element: ng.IAugmentedJQuery,\n private $ocLazyLoad: oc.ILazyLoad,\n private analyticSvc: AnalyticSvc,\n private subscriptionSvc: SubscriptionSvc) {\n $scope.upgradeModal = $scope.upgradeModal || {};\n Utils.sequence(jqueryPaymentLib, $ocLazyLoad).then(() => {\n if (!Strings.isBlank($stateParams.plan) && (!$stateParams.modal || $stateParams.modal === 'upgrade')) {\n $scope.upgradeModal.chosen = $stateParams.plan === $scope.upgrade.displayName;\n $scope.$apply();\n }\n });\n\n $scope.$watch('upgradeModal.chosen', (newVal?: string) => {\n newVal && this.analyticSvc.upgradeShown(\n this.$scope.action,\n this.$scope.upgrade.displayName\n );\n this.SubscriptionCtrl.responseError = '';\n });\n }\n\n handlerClick() {\n if (this.isFree()) {\n this.SubscriptionCtrl.toggleCancelModal()\n } else {\n this.showUpgradeDialog();\n }\n }\n\n isMostPopular() {\n return ['Pro', 'WavePro'].includes(this.$scope.upgrade.name);\n }\n\n getAnnualPrice() {\n return this.subscriptionSvc.getAnnualPrice(this.$scope.upgrade);\n }\n\n getMonthlyPrice() {\n return this.subscriptionSvc.getMonthlyPrice(this.$scope.upgrade);\n }\n\n isFree() {\n return this.subscriptionSvc.isFree(this.$scope.upgrade);\n }\n\n private showUpgradeDialog() {\n if (this.$scope.action === 'upgrade') {\n this.SubscriptionCtrl.showUpgradeModal(this.$scope.upgrade, this.$scope.billing.period);\n } else {\n this.$scope.upgradeModal.chosen = true;\n }\n }\n}\n\nangular.module('animatronApp.settings').directive('subscriptionPlan', () => ({\n restrict: 'E',\n transclude: true,\n require: '^subscription',\n controller: SubscriptionPlan,\n controllerAs: '$ctrl',\n templateUrl: require('upgrade/choose-plan.html')\n}));\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/directives/subscriptionPlanDirective.ts","module.exports = __webpack_public_path__ + \"html/choose-plan_af5cdc240fc4797b24de9c2a4e37f7c2.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./app/assets/html/upgrade/choose-plan.html\n// module id = Er9j\n// module chunks = 3","module.exports = __webpack_public_path__ + \"html/subscription-types_08708959e72a6dd1f0273a228b640160.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./app/assets/html/settings/subscription-types.html\n// module id = F5f2\n// module chunks = 3","class AsyncJSLoader {\n public static getAMDLibrary = _.memoize((libraryUrl: string, globalVariable?: string) =>\n _.once((overridenLibraryUrl?: string) => {\n libraryUrl = overridenLibraryUrl || libraryUrl;\n console.log('Loading', libraryUrl);\n return new Promise(resolve =>\n loadScripts([libraryUrl], (lib: string) => resolve((window[globalVariable] || lib))));\n }));\n}\n\n/**\n * define all async libraries here\n */\nexport const googleMapsLib = AsyncJSLoader.getAMDLibrary('https://maps.googleapis.com/maps/api/js');\n\nexport const stripeLib = AsyncJSLoader.getAMDLibrary('https://js.stripe.com/v2/', 'Stripe');\nexport const reamazeLib = AsyncJSLoader.getAMDLibrary('https://d3itxuyrq7vzpz.cloudfront.net/assets/reamaze.js', 'Reamaze');\nexport const clipboardLib = AsyncJSLoader.getAMDLibrary('https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.5.5/clipboard.min.js', 'Clipboard');\n\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/services/AsyncJSLoader.ts","import {Strings} from 'Strings';\nimport {stripeLib} from 'services/AsyncJSLoader';\nimport {jqueryPaymentLib} from 'lazy_modules';\nimport {SubscriptionCtrl} from './Subscriptions';\nimport {Utils} from 'underscore-extensions';\nimport {HttpSvcFactory} from '../../services/HttpSvc';\nimport {AuthenticationSvc} from '../../services/AuthenticationSvc';\nimport {SubscriptionSvc} from '../services/SubscriptionSvc';\n\nconst testScope = {\n card_exp_month: '12',\n card_exp_year: '17',\n card: {\n number: '4242 4242 4242 4242',\n expiry: {\n month: 12,\n year: new Date().getFullYear().toString().slice(2)\n },\n cvc: '123'\n }\n};\n\ninterface StripeFormScope extends ng.IScope {\n stripeLoaded: boolean;\n pluginsLoaded: boolean;\n requiredFields: boolean;\n showFillTestCard: boolean;\n billing: {\n period: any;\n };\n stripeForm: ng.IFormController;\n card: {\n name?: string;\n number?: number;\n email?: string;\n expiry?: {\n month: number;\n year: number;\n };\n zip?: string;\n cvc?: string;\n };\n coupon: { code?: string };\n upgrade?: {\n name: string;\n project?: boolean;\n projectId: string;\n };\n setRequiredFields: () => void;\n submit: (any: any) => void;\n fillTestCard: () => void;\n}\n\nclass StripeForm {\n\n constructor(private $scope: StripeFormScope,\n private $element: ng.IAugmentedJQuery,\n private $timeout: ng.ITimeoutService,\n private $ocLazyLoad: oc.ILazyLoad,\n private $stateParams: { promo: string },\n private HttpSvc: HttpSvcFactory,\n private subscriptionSvc: SubscriptionSvc,\n private AuthenticationSvc: AuthenticationSvc) {\n const ctrl: SubscriptionCtrl = $element.controller('subscription');\n\n $scope.stripeLoaded = false;\n $scope.pluginsLoaded = false;\n $scope.card = {};\n $scope.coupon = {code: $stateParams.promo};\n\n $scope.setRequiredFields = () => $scope.requiredFields = false;\n stripeLib().then(() => {\n $scope.stripeLoaded = true;\n $scope.submit = (upgradeModal) => {\n $scope.requiredFields = true;\n $timeout(() => {\n if ($scope.stripeForm.$invalid) return;\n\n ctrl.loading = true;\n window.Stripe.setPublishableKey(options.user.stripeKey()); //IE 10 problems\n\n const formParams: anm.ChangeSubscriptionRequest = {\n token: '',\n name: $scope.upgrade ? $scope.upgrade.name : '',\n period: $scope.billing.period.toUpperCase(),\n email: undefined as string | undefined,\n couponCode: undefined as string | undefined\n };\n const email = $scope.card.email;\n if (!Strings.isBlank(email)) formParams.email = email;\n\n window.Stripe.createToken(angular.element($element)[0], (status, tokenResponse) => {\n if (!ctrl.errorResponse(tokenResponse)) {\n const token = tokenResponse.id;\n let resolvePromise: ng.IPromise;\n formParams.token = token;\n\n if (ctrl.showEditCard) {\n resolvePromise = ctrl.updateCard(token);\n } else {\n formParams.couponCode = $scope.coupon.code;\n // if ($scope.upgrade.project) {\n // ctrl.upgradeProject(formParams.period,\n // $scope.upgrade.projectId,\n // formParams.token,\n // formParams.name,\n // formParams.couponCode,\n // upgradeModal\n // );\n // } else {\n\n const {exp_month, exp_year} = tokenResponse.card;\n subscriptionSvc.checkExpired(`${exp_month}/${exp_year}`);\n\n resolvePromise = ctrl.upgradeSubscription(formParams);\n // }\n }\n if (!Strings.isBlank(email)) {\n resolvePromise.finally(() => this.updateEmail(email));\n }\n }\n });\n });\n };\n $scope.$apply();\n });\n\n Utils.sequence(jqueryPaymentLib, $ocLazyLoad).then(() => {\n $scope.pluginsLoaded = true;\n $scope.$apply();\n });\n\n $scope.showFillTestCard = !options.isProduction;\n\n $scope.fillTestCard = () => {\n ['number', 'expiry_year', 'expiry_month', 'cvc'].forEach(k => {\n $scope.stripeForm[k].isValid = true;\n });\n _.extend($scope, testScope);\n };\n }\n\n updateEmail(email: string) {\n this.HttpSvc('profile').securePut({email})\n .then(() => this.AuthenticationSvc.updateUser());\n }\n}\n\nangular.module('animatronApp.settings').directive('stripeForm', () => ({\n restrict: 'E',\n require: '^subscription',\n transclude: true,\n controller: StripeForm,\n template: `
`\n}));\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/directives/stripeFormDirective.ts","import {SubscriptionSvc} from '../services/SubscriptionSvc';\n\nclass SubscriptionPriceBlock implements ng.IComponentController {\n discountedMonthly: number;\n discountedAnnual: number;\n monthly: number;\n annual: number;\n discount: number;\n\n constructor(private subscriptionSvc: SubscriptionSvc) {\n }\n\n $onChanges() {\n if (!this.discount) return;\n this.discountedAnnual = this.getDiscountPrice(this.annual);\n this.discountedMonthly = this.getDiscountPrice(this.monthly);\n }\n\n private getDiscountPrice(price: number) {\n return this.subscriptionSvc.round(price * this.subscriptionSvc.calcDiscount(this.discount))\n }\n}\n\nangular.module('animatronApp.settings').component('subscriptionPriceBlock', {\n bindings: {\n monthly: '<',\n annual: '<',\n discount: '<'\n },\n controller: SubscriptionPriceBlock,\n templateUrl: require('settings/subscription-price-block.html')\n});\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/directives/subscriptionPriceBlock.ts","import {TranslateSvc} from '../../services/TranslateSvc';\nimport {HttpSvcFactory} from '../../services/HttpSvc';\nimport {Utils} from '../../underscore-extensions';\nimport {AuthenticationSvc, USER_LOGOUT} from '../../services/AuthenticationSvc';\nimport {AnalyticSvc} from '../../services/AnalyticSvc';\nimport {AffiliateSvc} from '../../services/AffiliateSvc';\n\nexport const UPDATE_SUBSCRIPTION_CARD = 'website/subscription/updateCard';\nexport const APPLY_COUPON = 'website/subscription/applyCoupon';\nexport const CouponCompaniesNames = {\n prod: {\n AppSumo117: {\n title: 'AppSumo'\n },\n MightyDeals417: {\n title: 'MightyDeals'\n },\n StackSocial0718: {\n title: 'StackSocial'\n },\n defaultCompany: {\n title: 'Company'\n }\n },\n\n dev: {\n MightyDeals417: {\n title: 'AppSumo'\n },\n MightyDeals417Test: {\n title: 'MightyDeals'\n },\n StackSocial0718: {\n title: 'StackSocial'\n },\n defaultCompany: {\n title: 'Company'\n }\n }\n}[options.isProduction ? 'prod' : 'dev'];\n\nexport class SubscriptionSvc {\n cardDetailsCashed: anm.CardDetails;\n cardDetailsErrorMessage: string;\n upgradesDiscount: number;\n isExpired: boolean;\n totalPriceLastValue: number;\n\n private isStripeError: boolean;\n private specialSubscriptionNames = ['WaveBigAgency', 'WaveSmallAgency'];\n\n constructor(private $q: ng.IQService,\n private $filter: ng.IFilterService,\n private $http: ng.IHttpService,\n private $rootScope: ng.IRootScopeService,\n private $state: ng.ui.IStateService,\n private TranslateSvc: TranslateSvc,\n private analyticSvc: AnalyticSvc,\n private AuthenticationSvc: AuthenticationSvc,\n private affiliateSvc: AffiliateSvc,\n private HttpSvc: HttpSvcFactory) {\n this.$rootScope.$on(USER_LOGOUT, () => {\n this.upgradesDiscount = undefined;\n this.cardDetailsCashed = undefined;\n this.cardDetailsErrorMessage = undefined;\n });\n }\n\n\n static isStripeError(error: any): error is StripeError {\n return error && error.message && error.type;\n }\n\n get product(): AnimatronProduct {\n return Utils.getProduct();\n }\n\n get productParams() {\n return {params: {product: this.product}};\n }\n\n getError(error?: string | StripeError): string {\n if (!error) return null;\n\n if (_.isString(error)) {\n return this.getStripeCouponError(error)\n || this.getRequiredSubscriptionError(error)\n || this.getStripeCardError(error)\n || (this.TranslateSvc.has(error.toLowerCase()) && this.TranslateSvc.get(error.toLowerCase()))\n || error;\n } else if (SubscriptionSvc.isStripeError(error)) {\n return error.message;\n } else {\n return error as string;\n }\n }\n\n findSubscriptionByName(displayName: string): ng.IPromise {\n // search in upgrades\n const upgrade = this.getUpgradesByName(displayName);\n if (upgrade) return this.$q.resolve(upgrade);\n\n // search in current subscription\n const currentSubscription = this.getDetails();\n if (currentSubscription.displayName === displayName) return this.$q.resolve(currentSubscription);\n\n // search in downgrade\n return this.getDowngradesByName(null, displayName);\n }\n\n getPredictPrice({displayName, coupon, ...params}: SubscriptionPredict.Params): ng.IPromise {\n return this.findSubscriptionByName(displayName)\n .then(({name}) => this.HttpSvc('subscription/calculate').secureGet({\n params: {\n ...params,\n name,\n coupon: coupon || undefined\n }\n }))\n .then(r => r.data);\n }\n\n isStripe() {\n return !this.isStripeError && options.user.isStripe();\n }\n\n getAnnualSave(upgrade = this.getDetails()) {\n return (upgrade.monthlyPrice * 12 - upgrade.annualPrice) / 100;\n }\n\n getAnnualPrice(details: anm.SubscriptionDetails = this.getDetails(),\n discountPercentOff = details.discount && details.discount.percentOff) {\n return this.round(details.annualPrice * this.calcDiscount(discountPercentOff) / 100 / 12);\n }\n\n getMonthlyPrice(details: anm.SubscriptionDetails = this.getDetails(),\n discountPercentOff = details.discount && details.discount.percentOff) {\n return this.round(details.monthlyPrice * this.calcDiscount(discountPercentOff) / 100);\n }\n\n isFree(currentSubscription = this.getDetails()) {\n const freeSubscriptions = ['WaveFree', 'Free'];\n return freeSubscriptions.includes(currentSubscription.name)\n }\n\n isHigh(currentSubscription = this.getDetails()) {\n const highSubscriptions = ['WaveBusiness', 'Business'];\n return highSubscriptions.includes(currentSubscription.name)\n }\n\n isSpecial(currentSubscription = this.getDetails()) {\n return this.specialSubscriptionNames.includes(currentSubscription.name)\n }\n\n isAppSumo({billingPeriod, discount} = this.getDetails()) {\n return discount\n && (discount.provider === 'AppSumo117'\n || (!options.isProduction && discount.provider === 'MightyDeals417'));\n }\n\n getDetails(): anm.SubscriptionDetails {\n const product = this.product.toLowerCase();\n const subscription = options.user.subscriptionDetails[product];\n return this.prepareSubscription(subscription);\n }\n\n setUpgradesDiscount() {\n this.affiliateSvc.getAffiliateUser().then((affiliateInfo: anm.AffiliateInfo) => {\n this.upgradesDiscount = affiliateInfo.discount;\n });\n }\n\n getCardDetails() {\n return this.HttpSvc('subscription', 'history')\n .secureGet(this.productParams)\n .then(this.handlerHttpResponse)\n .then((res: anm.CardDetails) => {\n this.isStripeError = res.card.type === 'N/A';\n this.checkExpired(res.card.expires);\n this.cardDetailsCashed = res;\n return res;\n })\n .catch((errMsg: string) => {\n this.isStripeError = true;\n this.cardDetailsErrorMessage = errMsg;\n return this.$q.reject(errMsg);\n });\n }\n\n getUpgradesByName(name: string) {\n const upgrade = this.getDetails().upgrades.filter(\n upgradeItem => upgradeItem && (upgradeItem.name === name || upgradeItem.displayName === name)\n )[0];\n return upgrade && this.prepareSubscription(upgrade);\n }\n\n getDowngradesByName(name: string, displayName?: string) {\n return this.getDowngrades().then(downgrades => {\n const downgrade = downgrades.filter(\n downgradeItem => downgradeItem && (downgradeItem.name === name || downgradeItem.displayName === displayName)\n )[0];\n return downgrade && this.prepareSubscription(downgrade);\n });\n\n }\n\n getUpgrades() {\n return this.getDetails()\n .upgrades\n .filter(upgrade => !upgrade.excludeFromUI && !upgrade.hidden && upgrade.name !== 'WaveEnterprise');\n }\n\n getDowngrades(): ng.IPromise {\n return this.HttpSvc('subscription', 'downgrade')\n .secureGet(this.productParams)\n .then(this.handlerHttpResponse)\n .then((downgrades: anm.SubscriptionDetails[]) => {\n return downgrades.filter(downgrade => !downgrade.excludeFromUI && !downgrade.hidden);\n });\n }\n\n cancelSubscription() {\n const {displayName, billingPeriod} = this.getDetails();\n\n return this.HttpSvc('subscription', 'cancel')\n .secureDelete(this.productParams)\n .then(this.handlerHttpResponse)\n .then(() => {\n this.cardDetailsCashed = null;\n this.cardDetailsErrorMessage = null;\n\n this.analyticSvc.changeSubscription(\n 'downgrade',\n displayName,\n billingPeriod\n );\n return this.AuthenticationSvc.updateUser();\n });\n }\n\n checkExpired(expires: string) {\n const dateArr = expires.split('/');\n\n if (dateArr.length === 2) {\n const monthDays = Utils.getMonthDaysCount().toString();\n dateArr.splice(1, 0, monthDays);\n }\n\n const formattedDate = dateArr.join('/');\n const expiredDate = new Date(formattedDate).getTime();\n\n const currentDate = _.now();\n\n this.isExpired = currentDate >= expiredDate;\n }\n\n changeSubscription(params: anm.ChangeSubscriptionRequest) {\n const request = () => this.HttpSvc('subscription', 'change')\n .securePut(params, {headers: this.analyticSvc.getGaHeader()});\n\n return this.changeSubscriptionErrorHandler(request);\n }\n\n private changeSubscriptionErrorHandler(request: Function) {\n const getErrorPromise = () => {\n const errorMessage = 'credit.card.processing.error.[expired_card]';\n const deferred = this.$q.defer();\n deferred.resolve({data: {errorMessage}});\n return deferred.promise;\n };\n\n return this.isExpired ? getErrorPromise() : request();\n }\n\n updateCard(token: string) {\n const url = `${options.apiDomain}/subscription/card/update`;\n const headers = _.extend({\n 'Content-Type': 'application/json'\n }, options.headers);\n\n return this.$http\n .post(url, {token}, {headers})\n .then((r: ng.IHttpPromiseCallbackArg) => {\n this.$rootScope.$emit(UPDATE_SUBSCRIPTION_CARD);\n return r;\n })\n .catch((err: ng.IHttpPromiseCallbackArg) => err.status !== -1 ? err : {\n data: {\n errorCode: 400,\n errorMessage: 'subscription.update-card.default-error'\n }\n });\n }\n\n round(num: number) {\n return Math.ceil(num);\n }\n\n calcDiscount(discount: number) {\n return discount ? 1 - discount / 100 : 1;\n }\n\n makeSpecialSubscription(subscription: anm.SubscriptionDetails) {\n subscription.monthlyPrice = undefined;\n return subscription;\n }\n\n private prepareSubscription(subscription: anm.SubscriptionDetails) {\n return this.specialSubscriptionNames.includes(subscription.name) ?\n this.makeSpecialSubscription(subscription) : subscription\n }\n\n showSubscriptionCanceledMessage() {\n const details = this.getDetails();\n const currentPlan = details.displayName;\n const expTime = details.expirationDate;\n const date = this.$filter('date')(expTime * 1000, 'short');\n const msg = expTime ? `Subscription will be canceled on ${date}` : 'Already canceled';\n\n _.notification.showSuccess(msg);\n }\n\n private handlerHttpResponse = (res: ng.IHttpPromiseCallbackArg) => {\n const deferred = this.$q.defer();\n if (res && res.data && Utils.isApiError(res.data)) {\n deferred.reject(res.data.errorMessage);\n console.error('subscription error: ', res.data);\n } else {\n deferred.resolve(res.data);\n }\n return deferred.promise;\n }\n\n private getStripeCardError(error: string) {\n const matched = error.match(/\\[([A-Za-z_]+)\\]/);\n const stripeKey = matched && matched[1];\n return stripeKey && this.TranslateSvc.has(stripeKey) ? this.TranslateSvc.get(stripeKey) : null;\n }\n\n private getStripeCouponError(error: string) {\n const errorsCode = [\n 'Coupon expired',\n 'No such coupon',\n 'Coupon is not valid',\n 'Coupon inapplicable'\n ];\n\n const reg = new RegExp(errorsCode.join('|'));\n const isCouponError = _.isString(error) && reg.test(error);\n return isCouponError && this.TranslateSvc.get('coupon.error');\n }\n\n private getRequiredSubscriptionError(error: string) {\n const isRequiredSubscriptionError = _.isString(error) && /required subscription:/.test(error);\n if (!isRequiredSubscriptionError) return false;\n\n const [, plan, period] = error.match(/\\(([0-9a-zA-Z]+)\\|([0-9a-zA-Z]+)\\)/);\n const subscriptionName = `${plan} ${period}`;\n const productName = Utils.getProduct().toLowerCase();\n const {coupon} = this.$state.params;\n const upgradeParams = Utils.toParams({\n plan,\n coupon,\n period: period.toLowerCase()\n });\n const url = `/${productName}/pricing/upgrade?${upgradeParams}`;\n\n return this.TranslateSvc.get('required.subscription.error', url, subscriptionName);\n }\n}\n\nangular.module('animatronApp.SubscriptionSvc', []).service('subscriptionSvc', SubscriptionSvc);\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/services/SubscriptionSvc.ts","import {Utils} from '../underscore-extensions';\n\nclass PlanAnimation implements ng.IComponentController {\n private static Animations = _.object(['free', 'pro', 'business'].map(plan =>\n [plan, `https://videos.animatron.com/pricing/${plan}${options.retina ? '_2x' : ''}.mp4`]\n ));\n private plan: string;\n private url: string;\n private width: number;\n private height: number;\n private inited: boolean;\n\n constructor(private $rootScope: ng.IRootScopeService,\n private $element: ng.IAugmentedJQuery) {}\n\n $onInit() {\n if (options.handHeld) return;\n Utils.rAF(() => {\n const {width, height} = this.$element[0].parentElement.getBoundingClientRect();\n\n this.url = PlanAnimation.Animations[this.plan.toLowerCase()];\n this.width = width;\n this.height = height;\n const video = this.$element[0].querySelector('video');\n const safe = (f: 'pause' | 'play') => video && _.isFunction(video[f]) && video[f]();\n this.$rootScope.$on(`onScreen:${this.url}`, () => safe('play'));\n this.$rootScope.$on(`notOnScreen:${this.url}`, () => safe('pause'));\n this.inited = true;\n });\n }\n\n $onDestroy() {\n _.isFunction(window.stop) && window.stop();\n }\n}\n\n\nangular.module('animatronApp.planAnimation', []).component('planAnimation', {\n bindings: {\n plan: '@'\n },\n controller: PlanAnimation,\n template: `
\n \n
\n
`\n});\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/directives/PlanAnimation.ts","import {HttpSvcFactory} from '../../services/HttpSvc';\nimport {AuthenticationSvc} from '../../services/AuthenticationSvc';\nimport {TranslateSvc} from '../../services/TranslateSvc';\nimport {Utils} from '../../underscore-extensions';\nimport {SubscriptionSvc} from './SubscriptionSvc';\n\nexport interface TypeformParams extends ng.ui.IStateParamsService {\n userid: string;\n}\n\nexport class TypeformSvc {\n showDeletedModal = false;\n private userId: string;\n\n constructor(private $state: ng.ui.IStateService,\n private $stateParams: TypeformParams,\n private $q: ng.IQService,\n private TranslateSvc: TranslateSvc,\n private subscriptionSvc: SubscriptionSvc,\n private AuthenticationSvc: AuthenticationSvc,\n private HttpSvc: HttpSvcFactory) {\n this.userId = this.$stateParams.userid;\n }\n\n openTypeFormCancel() {\n const formId = this.getProduct() === 'wave' ? 'K6si1N' : 'oOu1yB';\n const typeformUrl = this.getUrl('downgrade', formId);\n\n window.open(typeformUrl, '_self');\n }\n\n openTypeFormDelete() {\n const formId = this.getProduct() === 'wave' ? 'W3TtpN' : 'OcPZVX';\n const typeformUrl = this.getUrl('delete', formId);\n\n this.deleteAccountRequest().then(() => window.open(typeformUrl, '_self'));\n }\n\n deleteAccountRequest() {\n return this.HttpSvc('profile')\n .secureDelete()\n .then((data: ApiError) => {\n return Utils.isApiError(data)\n ? this.$q.reject(data.errorMessage)\n : data;\n })\n .then(() => this.AuthenticationSvc.logout())\n .catch((err: string) => _.notification.showError(err));\n }\n\n private getProduct() {\n return Utils.getProduct().toLowerCase();\n }\n\n private getUrl(action: 'downgrade' | 'delete', typeformId: string) {\n let url = `${location.host}/${this.getProduct()}`;\n if (action === 'downgrade') {\n url = `${url}/settings/subscription`;\n }\n\n return `https://animatron.typeform.com/to/${typeformId}?email=${options.user.email}`;\n }\n\n private isLogged(): boolean {\n if (!this.AuthenticationSvc.loggedIn) {\n this.openModalLogin();\n return false;\n }\n\n if (this.userId !== options.user.userId) {\n this.AuthenticationSvc.logout();\n this.openModalLogin();\n return false;\n }\n\n return true;\n }\n\n private openModalLogin() {\n const currentUrl = `${this.$state.current.url}=${this.$stateParams.userid}`;\n const message = this.TranslateSvc.get('login.redirect-email');\n\n this.$state\n .go(`${this.getProduct()}-landing`)\n .then(() => setTimeout(() => this.AuthenticationSvc.toggleLoginModal(currentUrl, message), 0));\n }\n}\n\nangular.module('animatronApp.settings').service('typeformSvc', TypeformSvc);\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/services/TypeformSvc.ts","import {APPLY_COUPON, SubscriptionSvc} from '../../services/SubscriptionSvc';\nimport {SubscriptionsParams} from '../../directives/Subscriptions';\nimport {Utils} from '../../../underscore-extensions';\nimport {SubscriptionMessagesSvc} from '../messages/SubscriptionMessagesSvc';\nimport {SubscriptionCouponMessagesSvc} from '../messages/SubscriptionCouponMessagesSvc';\n\nexport const PREDICT_PRICE_ERROR = 'website/subscription/predictPriceError';\n\nclass SubscriptionPredictPriceContainer implements ng.IComponentController {\n currentPrice: number;\n currentPeriod: string;\n period: string;\n planName: string;\n annualDiscount: number;\n percentsDiscount: number;\n amountDiscount: number;\n totalPrice: number;\n credit: number;\n loading: boolean;\n hide: boolean;\n private applyCouponListener: Function = _.noop;\n private staticSubscription: anm.SubscriptionDetails;\n private predictSubscription: SubscriptionPredict.Details;\n\n constructor(private $q: ng.IQService,\n private $scope: ng.IScope,\n private $state: ng.ui.IStateService,\n private subscriptionMessageSvc: SubscriptionMessagesSvc,\n private subscriptionCouponMessageSvc: SubscriptionCouponMessagesSvc,\n private $stateParams: SubscriptionsParams,\n private $rootScope: ng.IRootScopeService,\n private subscriptionSvc: SubscriptionSvc) {\n const init = (coupon?: string) => this.setCurrentSubscription(coupon)\n .then(() => this.setPrice());\n\n !this.hide && init(this.$stateParams.coupon);\n\n this.applyCouponListener = this.$rootScope.$on(\n APPLY_COUPON,\n (e, coupon: string) => init(coupon)\n );\n }\n\n $onDestroy() {\n this.applyCouponListener();\n }\n\n $onChanges(onChangesObj: ng.IOnChangesObject) {\n if (!onChangesObj.period || onChangesObj.period.isFirstChange()) return;\n this.$rootScope.$emit(PREDICT_PRICE_ERROR, ''); // clear previous error message\n this.currentPeriod = onChangesObj.period.currentValue.toLowerCase();\n\n this.$state\n .go(\n this.$state.current,\n {\n ...this.$stateParams,\n period: this.currentPeriod\n },\n {notify: false}\n )\n .finally(() => !this.loading && this.setPrice());\n }\n\n private setCurrentSubscription(coupon?: string) {\n this.loading = true;\n\n return this.$q.all([\n this.getPredictPrice(coupon),\n this.getStaticSubscription()\n ])\n .then(this.handlerHttpResponse)\n .then(subscriptions => {\n const [predictSubscription, staticSubscription] = subscriptions;\n\n this.predictSubscription = predictSubscription;\n this.staticSubscription = staticSubscription;\n })\n .catch((errors: any[]) => {\n this.subscriptionMessageSvc.hideMassage();\n this.$rootScope.$emit(PREDICT_PRICE_ERROR, errors[0]);\n return this.$q.reject(errors);\n })\n .finally(() => {\n this.loading = false;\n });\n }\n\n private setPrice() {\n const {period, plan} = this.$stateParams;\n if (!plan) return;\n\n this.currentPeriod = this.currentPeriod || period;\n\n const {\n annualPrice,\n monthlyPrice,\n displayName\n } = this.staticSubscription;\n\n this.planName = displayName;\n\n // transform prices from array to object\n const pricesObj: {\n annual: SubscriptionPredict.Price;\n monthly: SubscriptionPredict.Price;\n } = this.predictSubscription.prices.reduce((prices: any, price: SubscriptionPredict.Price) => {\n if (price.period === 'ANNUAL') {\n prices.annual = price;\n } else if (price.period === 'MONTHLY') {\n prices.monthly = price;\n }\n return prices;\n }, {});\n\n let currentPredictPriceData: SubscriptionPredict.Price;\n\n if (this.currentPeriod === 'annual') {\n currentPredictPriceData = pricesObj.annual;\n this.currentPrice = monthlyPrice * 12 / 100 || annualPrice / 100;\n this.annualDiscount = this.currentPrice - (annualPrice / 100);\n } else if (this.currentPeriod === 'monthly') {\n currentPredictPriceData = pricesObj.monthly;\n this.currentPrice = monthlyPrice / 100;\n this.annualDiscount = null;\n } else {\n throw new Error('incorrect period name');\n }\n\n this.setupDiscount(currentPredictPriceData);\n\n const currentPredictPrice = currentPredictPriceData.price / 100;\n const currentPredictPriceRounded = this.subscriptionSvc.round(currentPredictPrice);\n\n const startingBalance = this.subscriptionSvc.round(this.predictSubscription.startingBalance / 100);\n this.credit = startingBalance < 0 ? -startingBalance : 0;\n this.totalPrice = currentPredictPriceRounded >= 0 ? currentPredictPriceRounded : 0;\n this.subscriptionSvc.totalPriceLastValue = this.totalPrice;\n }\n\n private setupDiscount({discount}: SubscriptionPredict.Price) {\n this.subscriptionMessageSvc.hideMassage();\n\n if (!discount) return;\n\n const {error, amount, percents} = discount;\n\n if (error) {\n this.$rootScope.$emit(PREDICT_PRICE_ERROR, this.subscriptionSvc.getError(error));\n } else {\n this.amountDiscount = amount / 100;\n this.percentsDiscount = percents;\n const message = this.subscriptionCouponMessageSvc.get(discount);\n this.subscriptionMessageSvc.showSuccess(message);\n }\n }\n\n\n private handlerHttpResponse = (responses: (any | ApiError)[]): ng.IPromise<[\n SubscriptionPredict.Details,\n anm.SubscriptionDetails\n ]> => {\n const deferred = this.$q.defer();\n const errors: string[] = [];\n\n responses.forEach((res) => {\n if (Utils.isApiError(res)) {\n errors.push(this.subscriptionSvc.getError(res.errorMessage));\n }\n });\n\n if (errors.length > 0) {\n deferred.reject(errors);\n } else {\n deferred.resolve(responses);\n }\n\n return deferred.promise;\n }\n\n private getStaticSubscription() {\n return this.subscriptionSvc.findSubscriptionByName(this.$stateParams.plan);\n }\n\n private getPredictPrice(coupon?: string) {\n const {plan, period} = this.$stateParams;\n return this.subscriptionSvc.getPredictPrice({\n period,\n coupon,\n displayName: plan as anm.SubscriptionDisplayName\n });\n }\n}\n\nangular.module('animatronApp.SubscriptionPredictPriceContainer', [])\n .component('subscriptionPredictPriceContainer', {\n bindings: {\n period: '<',\n hide: '<'\n },\n controller: SubscriptionPredictPriceContainer,\n templateUrl: require('settings/subscription/containers/subscription-predict-price-container.html')\n });\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/subscription/containers/SubscriptionPredictPriceContainer.ts","module.exports = __webpack_public_path__ + \"html/subscription-predict-price-container_c43307d31652cc92c825efb25c575167.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./app/assets/html/settings/subscription/containers/subscription-predict-price-container.html\n// module id = gGiH\n// module chunks = 3 8 16","import {HttpSvcFactory} from '../../services/HttpSvc';\nimport {AuthenticationSvc} from '../../services/AuthenticationSvc';\nimport {SubscriptionCtrl} from './Subscriptions';\nclass CouponDirective implements ng.IComponentController {\n\n private readonly SubscriptionCtrl: SubscriptionCtrl;\n private applyingCoupon: boolean;\n private coupon: string;\n private couponError: string | undefined;\n\n constructor(private $state: ng.ui.IStateService,\n private HttpSvc: HttpSvcFactory,\n private AuthenticationSvc: AuthenticationSvc) {\n }\n\n applyCoupon(coupon: string) {\n this.couponError = undefined;\n this.applyingCoupon = true;\n this.HttpSvc('coupon', coupon).securePost().then((r: any) => r.data).then((response: ApiError) => {\n if (_.isObject(response) && response.errorCode !== 200) {\n this.couponError = response.errorMessage;\n } else {\n this.coupon = '';\n this.AuthenticationSvc.notifyUserChange();\n this.AuthenticationSvc.updateUser().then(() => {\n this.SubscriptionCtrl.updateSubscriptionDetails();\n this.SubscriptionCtrl.upgradedTo = response.errorMessage;\n this.SubscriptionCtrl.toggleUpgradeResultModal(() => this.$state.go('studio-settings.subscription'));\n });\n }\n }).finally(() => this.applyingCoupon = false);\n };\n}\n\nangular.module('animatronApp.settings').component('coupon', {\n require: {SubscriptionCtrl: '^subscription'},\n controller: CouponDirective,\n templateUrl: require('upgrade/coupon.html')\n});\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/directives/couponDirective.ts","/*\nCertificate code:\nOld: mhttp://youtrack.animatron.com/youtrack/issue/WEB-683\nNew: https://youtrack.animatron.com/youtrack/issue/WEB-2649\n */\n\nclass SecurePayment {\n imageSrc = 'https://wwwsslcom.a.cdnify.io/assets/ssl_seal_1-3dfcdf69a9e544495dbcf366a74ee5c4baca7e4f8018f7ddfa22f2de9bcf464d.png';\n\n getHref() {\n return `https://www.ssl.com/team/a3d-1b33o49/site_seals/${this.getId()}/site_report`;\n }\n\n openWindow(e: Event) {\n e.preventDefault();\n window.open(\n `https://www.ssl.com/team/a3d-1b33o49/site_seals/${this.getId()}/site_report`,\n 'site_report',\n 'height=500, width=400, top=100, left=100'\n );\n }\n\n private getId() {\n const {user, isProduction} = options;\n return user.zoneCode === 'kr'\n ? '4c157bc0-57032320' : isProduction\n ? '4f7e3f09-59fb2fa3'\n : '48ed36cd-59a99ce5';\n }\n}\n\nangular.module('animatronApp.settings').component('securePayment', {\n controller: SecurePayment,\n template: `
\n \n \"Ssl\n \n Secure credit card payment\n
`\n});\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/directives/securePaymentDirective.ts","const subscriptionTypesData = {\n free: [\n 'subscription.public-projects',\n 'subscription.watermark',\n 'subscription.limited-export-formats'\n ],\n starter: [\n 'subscription.unlimited-public-projects',\n 'subscription.unlisted-projects',\n 'subscription.import-stuff',\n 'subscription.limited-export-formats',\n 'subscription.no-end-screen',\n 'subscription.basic-permissions'\n ],\n pro3: [\n 'subscription.unlimited-projects',\n 'subscription.no-watermark',\n 'subscription.collaborative-video'\n ],\n business: [\n 'subscription.unlimited-projects',\n 'subscription.available-features',\n 'subscription.premium-storage',\n 'subscription.priority-rendering',\n 'subscription.premium-support'\n ],\n wavefree: [\n 'wv.subscription.5-videos',\n 'wv.subscription.limited-clips',\n 'wv.subscription.watermark'\n ],\n wavepro: [\n 'wv.subscription.small-businesses',\n 'wv.subscription.1-brand',\n 'wv.subscription.3m-royalty-free',\n 'wv.subscription.no-watermark',\n 'wv.subscription.unlimited-videos-per-month'\n ],\n wavebusiness: [\n 'wv.subscription.corporate-marketers',\n 'wv.subscription.600-royalty-free',\n 'wv.subscription.premium-clips',\n 'wv.subscription.no-watermark',\n 'wv.subscription.unlimited-videos',\n 'wv.subscription.customer-support'\n ],\n waveagency: [\n 'wv.subscription.corporate-marketers',\n 'wv.subscription.20brands',\n 'wv.subscription.white-label-preview',\n 'wv.subscription.no-watermark',\n 'wv.subscription.3m-stock',\n 'wv.subscription.unlimited-videos',\n 'wv.subscription.customer-support'\n ],\n wavebigagency: [\n 'wv.subscription.Ideal-for-agencies',\n 'wv.subscription.2.5-million-video',\n 'wv.subscription.3rd-party-sell-them',\n 'wv.subscription.videos-for-many-brands',\n 'wv.subscription.Import-100Gb-media'\n ],\n waveultimate: [\n 'wv.subscription.ideal-for-create-videos',\n 'wv.subscription.50brands',\n 'wv.subscription.3m-stock',\n 'wv.subscription.white-label-preview',\n 'wv.subscription.no-watermark',\n 'wv.subscription.unlimited-videos',\n 'wv.subscription.customer-support'\n ],\n wavesmallagency: [\n 'wv.subscription.best-for-small-agencies',\n 'wv.subscription.2.5-million-video',\n 'wv.subscription.3rd-party-someone-else',\n 'wv.subscription.videos-for-many-brands'\n ]\n};\nclass SubscriptionTypes implements ng.IComponentController {\n subscriptionName: string;\n types: {[key: string]: string[]};\n\n $onChanges() {\n this.types = subscriptionTypesData[this.subscriptionName.toLowerCase()];\n }\n}\n\nangular.module('animatronApp.settings').component('subscriptionTypes', {\n bindings: {\n subscriptionName: '<'\n },\n controller: SubscriptionTypes,\n templateUrl: require('settings/subscription-types.html')\n});\n\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/directives/subscriptionTypes.ts","module.exports = __webpack_public_path__ + \"html/subscription-price-block_d930eeb8cc868aec2efbcce26babaecd.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./app/assets/html/settings/subscription-price-block.html\n// module id = o701\n// module chunks = 3","module.exports = __webpack_public_path__ + \"html/subscription_b19e36422bfd5919c31a5643d5642656.html\";\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./app/assets/html/settings/subscription.html\n// module id = py5d\n// module chunks = 3 8","angular.module('animatronApp.settings').directive('upgradePlan', () => {\n return (scope: any) => {\n scope.coupon = {};\n };\n});\n\n\n\n// WEBPACK FOOTER //\n// ./app/assets/javascripts/settings/directives/upgradePlanDirective.ts"],"sourceRoot":""}