{"version":3,"file":"app-3c927aba.981ca8458d389c9a476a.bundle.js","mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAKA;AACA;;AAEA;AACA;;AAGA;AACA;AAQA;AALA;AAAA;AACA;AACA;AAIA;AACA;AACA;;AAGA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;;;;;;;;;;;;;;;;;;;ACnDA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AAGA;AAAA;AAIA;AAAA;AAPA;AAEA;AAAA;AAGA;AACA;AAAA;AAAA;AAIA;AAAA;AAAA;AAAA;AAAA;AAAA;AANA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBA;;AAEA;AACA;;AAOA;AACA;AACA;;AAEA;AACA;AACA;;AAIA;AACA;AACA;AACA;;AAEA;AACA;;AAGA;AACA;AAQA;AAAA;AACA;AAAA;AACA;AAAA;AAKA;AARA;AAAA;AAAA;AAAA;AAKA;AAAA;AAQA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAxKA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxCA;;AAEA;AACA;AACA;;AAOA;AACA;AACA;;AAEA;AACA;AACA;;AAKA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAGA;AACA;AASA;AAAA;AACA;AAAA;AACA;AAAA;AAMA;AATA;AAAA;AAAA;AAAA;AAKA;AAAA;AACA;AASA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AAEA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAAA;AAAA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AAGA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AApPA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;;;;;;;;;;;AC5CA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA","sources":["webpack://latinera/./sources/components/etc/navigation-bar-logo.js","webpack://latinera/./sources/components/etc/off-canvas.js","webpack://latinera/./sources/components/etc/offer-item.js","webpack://latinera/./sources/components/etc/offer.js","webpack://latinera/./sources/components/etc/navigation-bar-logo.html","webpack://latinera/./sources/components/etc/off-canvas.html","webpack://latinera/./sources/components/etc/offer-item.html","webpack://latinera/./sources/components/etc/offer.html"],"sourcesContent":["// Define the view-model for the \"navigation-bar-logo\" component\n\n// Import library modules\nimport { computedFrom, inject } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport {\n uiVersion,\n uiBaseUrl\n} from \"parameters/environment\";\n\n// Import service modules\nimport UserService from \"services/user\";\n\n// Import image modules\nimport latineraIconAndText from \"images/logos/latinera/latinera-icon+text.svg\";\n\n\n// Export the \"NavigationBarLogo\" class\n@inject(Router, UserService)\nexport class NavigationBarLogo {\n\n // Local attributes\n latineraIconAndText = latineraIconAndText;\n uiVersion = uiVersion;\n i18nParams = i18nParams;\n\n constructor(router, userService) {\n this.router = router;\n this.userService = userService;\n }\n\n\n // Getter and setter methods\n @computedFrom(\"uiVersion\")\n get showUIVersion() {\n return this.uiVersion.length > 0;\n }\n\n @computedFrom(\"userService.isSessionOpen\")\n get isSessionOpen() {\n return this.userService.isSessionOpen;\n }\n @computedFrom(\"isSessionOpen\")\n get startHref() {\n return this.isSessionOpen ?\n this.router.generate(\"dashboard\") : uiBaseUrl;\n }\n\n}\n","// Define the view-model for the \"off-canvas\" component\n// note: for some reason, Aurelia's binding engine refuses to bind the\n// \"options\" bindable attribute in the view-model to the \"uk-offcanvas\"\n// attribute in the view, The net effect is that it is not possible to\n// specify the \"options\" string from the outside, and a pre-defined set of\n// options is used instead \n\n// Import library modules\nimport { bindable, bindingMode } from \"aurelia-framework\";\n\n// Export OffCanvas class\n//@containerless()\nexport class OffCanvas {\n\n // Attributes\n @bindable({ defaultBindingMode: bindingMode.toView })\n canvasId = \"off-canvas-id\";\n //@bindable({ defaultBindingMode: bindingMode.toView })\n //options = \"mode: reveal; esc-close: true; bg-close: true\";\n @bindable({ defaultBindingMode: bindingMode.toView })\n showCloseButton = true;\n\n}\n","// Define the view-model for the \"offer-item\" component\n\n// Import library modules\nimport {\n bindable,\n bindingMode,\n computedFrom,\n inject\n} from \"aurelia-framework\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { computeAbsoluteTimeString } from \"utilities/time\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { \n runMode as defaultRunMode,\n} from \"parameters/environment\";\n\n// Import service modules\nimport OfferService from \"services/offer\";\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst eventsData = [];\n\n\n// Export the \"OfferItem\" class\n@inject(\n OfferService,\n EventService,\n UserService\n)\nexport class OfferItem {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) offerData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) activatesData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n\n // Local attributes\n i18nParams = i18nParams;\n\n constructor(\n offerService,\n eventService,\n userService\n ) {\n this.offerService = offerService;\n this.eventService = eventService;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n async bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"offerItem\",\n entityKey: this.offerKey,\n eventService: this.eventService,\n eventsData\n });\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"offerData.key\")\n get offerKey() {\n const { key: offerKey = \"\" } = this.offerData || {};\n return offerKey;\n }\n\n @computedFrom(\"offerData.name\")\n get offerI18nName() {\n const { name: offerName = \"\" } = this.offerData || {};\n return `enums:longOfferName.${offerName}`;\n }\n\n @computedFrom(\"offerData.type\")\n get offerType() {\n const { type: offerType = \"\" } = this.offerData || {};\n return offerType;\n }\n\n @computedFrom(\"offerData.target\")\n get offerTarget() {\n const { target: offerTarget = \"usr\" } = this.offerData || {};\n return offerTarget;\n }\n @computedFrom(\"offerTarget\")\n get isTeachersOffer() {\n return this.offerTarget === \"tch\";\n }\n\n @computedFrom(\"offerData.span\")\n get offerSpan() {\n const { span: offerSpan = \"\" } = this.offerData || {};\n return offerSpan;\n }\n @computedFrom(\"offerSpan\")\n get offerSpanI18nKey() {\n return `enums:offerSpan.${this.offerSpan.replace(/\\d+$/, \"\")}`;\n }\n @computedFrom(\"offerSpan\")\n get offerSpanYear() {\n return this.offerSpan.replace(/(\\D+)(\\d+)$/, (_, __, year) => year);\n }\n\n @computedFrom(\"activatesData.key\")\n get activatesKey() {\n const { key: activatesKey = \"\" } = this.activatesData || {};\n return activatesKey;\n }\n\n @computedFrom(\"activatesData.status\")\n get offerActivationStatus() {\n const { status: offerActivationStatus = \"\" } = this.activatesData || {};\n return offerActivationStatus;\n }\n @computedFrom(\"offerActivationStatus\", \"offerType\")\n get offerActivationLongStatus() {\n switch (this.offerActivationStatus) {\n case \"crt\":\n return \"created\";\n case \"can\":\n return \"canceled\";\n case \"act\":\n return this.offerType === \"crd\" ? \"activated\" : \"active\";\n case \"fut\":\n return \"future\";\n case \"dis\":\n return \"disabled\";\n case \"exp\":\n return \"expired\";\n default:\n console.warn(`Unknown offer activation status ` +\n `\"${this.offerActivationStatus}\"`);\n return \"\"\n }\n }\n @computedFrom(\"offerActivationStatus\")\n get offerActivationStatusI18nKey() {\n return `enums:offerActivationStatuses.${this.offerActivationLongStatus}`;\n }\n @computedFrom(\"offerActivationStatus\")\n get offerActivationStatusTextClasses() {\n switch (this.offerActivationStatus) {\n case \"act\":\n return \"uk-text uk-text-success\";\n case \"can\":\n case \"dis\":\n return \"uk-text uk-text-warning\";\n case \"fut\":\n return \"uk-text uk-text-primary\";\n case \"crt\":\n case \"exp\":\n return \"uk-text uk-text-muted\";\n default:\n console.warn(`Unknown offer activation status ` +\n `\"${this.offerActivationStatus}\"`);\n return \"\"\n }\n }\n @computedFrom(\"offerType\")\n get showOfferActivationExpiry() {\n return [\"flt\"].includes(this.offerType);\n }\n\n @computedFrom(\"activatesData.activatedOn\")\n get offerActivatedOnMs() {\n const { activatedOn: offerActivatedOnMs = 0 } = this.activatesData || {};\n return offerActivatedOnMs;\n }\n @computedFrom(\"activatesData.expiresOn\")\n get offerExpiresOnMs() {\n const { expiresOn: offerExpiresOnMs = 0 } = this.activatesData || {};\n return offerExpiresOnMs;\n }\n @computedFrom(\"offerActivatedOnMs\")\n get offerActivatedOnDateI18nString() {\n return computeAbsoluteTimeString({\n timeStampMs: this.offerActivatedOnMs,\n formatString: \"P\", // Long localized date (e.g. 05/31/2020)\n localeCode: this.userService.uiLocaleCode\n });\n }\n @computedFrom(\"offerExpiresOnMs\")\n get offerExpiresOnDateI18nString() {\n if (this.offerExpiresOnMs) {\n return computeAbsoluteTimeString({\n timeStampMs: this.offerExpiresOnMs,\n formatString: \"P\", // Long localized date (e.g. 05/31/2020)\n localeCode: this.userService.uiLocaleCode\n });\n }\n return \"\";\n }\n\n}\n","// Define the view-model for the \"offer\" component\n\n// Import library modules\nimport { Router } from \"aurelia-router\";\nimport {\n bindable,\n bindingMode,\n computedFrom,\n inject\n} from \"aurelia-framework\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { computeAbsoluteTimeString } from \"utilities/time\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { \n runMode as defaultRunMode,\n spaBaseUrl\n} from \"parameters/environment\";\n\n// Import service modules\nimport OfferService from \"services/offer\";\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst knownCurrencyCodes = [\"EUR\", \"GBP\", \"USD\"];\nconst eventsData = [];\n\n\n// Export the \"Offer\" class\n@inject(\n OfferService,\n EventService,\n Router,\n UserService\n)\nexport class Offer {\n\n // Bound attributes\n @bindable({ defaultBindingMode: bindingMode.toView }) offerData = null;\n @bindable({ defaultBindingMode: bindingMode.toView }) runMode = defaultRunMode;\n @bindable({ defaultBindingMode: bindingMode.toView }) isEnabled = true;\n\n // Local attributes\n isLoadingData = false;\n i18nParams = i18nParams;\n\n constructor(\n offerService,\n eventService,\n router,\n userService\n ) {\n this.offerService = offerService;\n this.eventService = eventService;\n this.router = router;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n async bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"offer\",\n entityKey: this.offerKey,\n eventService: this.eventService,\n eventsData\n });\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"offerData.key\")\n get offerKey() {\n const { key: offerKey = \"\" } = this.offerData || {};\n return offerKey;\n }\n\n @computedFrom(\"offerData.name\")\n get offerI18nName() {\n const { name: offerName = \"\" } = this.offerData || {};\n return `enums:longOfferName.${offerName}`;\n }\n\n @computedFrom(\"offerData.type\")\n get offerType() {\n const { type: offerType = \"\" } = this.offerData || {};\n return offerType;\n }\n\n @computedFrom(\"offerData.target\")\n get offerTarget() {\n const { target: offerTarget = \"usr\" } = this.offerData || {};\n return offerTarget;\n }\n @computedFrom(\"offerTarget\")\n get isTeachersOffer() {\n return this.offerTarget === \"tch\";\n }\n\n @computedFrom(\"offerData.span\")\n get offerSpan() {\n const { span: offerSpan = \"\" } = this.offerData || {};\n return offerSpan;\n }\n @computedFrom(\"offerSpan\")\n get offerSpanI18nKey() {\n return `enums:offerSpan.${this.offerSpan.replace(/\\d+$/, \"\")}`;\n }\n @computedFrom(\"offerSpan\")\n get offerSpanYear() {\n return this.offerSpan.replace(/(\\D+)(\\d+)$/, (_, __, year) => year);\n }\n\n @computedFrom(\"offerData.availabilityWindow\")\n get offerExpiryMs() {\n const { \n availabilityWindow: offerAvailabilityWindow = []\n } = this.offerData || {};\n return offerAvailabilityWindow.at(1) || null;\n }\n @computedFrom(\"offerExpiryMs\")\n get offerExpiryDateI18nString() {\n return computeAbsoluteTimeString({\n timeStampMs: this.offerExpiryMs,\n formatString: \"P\", // Long localized date (e.g. 05/31/2020)\n localeCode: this.userService.uiLocaleCode\n });\n }\n\n @computedFrom(\"offerData.originalPrice\")\n get offerOriginalPrice () {\n const { originalPrice: offerOriginalPrice = 0 } = this.offerData || {};\n return offerOriginalPrice >= 0 ? offerOriginalPrice.toFixed(2) : `N.A.`;\n }\n @computedFrom(\"offerData.discountedPrice\")\n get offerDiscountedPrice () {\n const { discountedPrice: offerDiscountedPrice = 0 } = this.offerData || {};\n return offerDiscountedPrice > 0 ? offerDiscountedPrice.toFixed(2) : \n offerDiscountedPrice === 0 ? offerDiscountedPrice.toFixed(0) : `N.A.`;\n }\n @computedFrom(\"offerData.discountRate\")\n get offerDiscountRate() {\n const { discountRate: offerDiscountRate = 0 } = this.offerData || {};\n return offerDiscountRate;\n }\n @computedFrom(\"offerDiscountRate\")\n get offerDiscountPercentI18nParams () {\n const discountPercent = `${Math.floor(100*this.offerDiscountRate)}`;\n return { ...i18nParams, discountPercent };\n }\n\n @computedFrom(\"offerData.currencyCode\")\n get offerCurrencyCodeI18nKey () {\n const { currencyCode: offerCurrencyCode = \"\" } = this.offerData || {};\n return knownCurrencyCodes.includes(offerCurrencyCode) ?\n `enums:currencyCodeToSymbol.${offerCurrencyCode}` :\n offerCurrencyCode;\n }\n\n @computedFrom(\"offerData.duration\")\n get offerDurationString() {\n const { duration: offerDurationString = \"\" } = this.offerData || {};\n return offerDurationString;\n }\n @computedFrom(\"offerDurationString\")\n get offerDurationMonths() {\n const [offerDurationMonthsString = \"\"] =\n this.offerDurationString.match(/^\\d+/);\n return offerDurationMonthsString ? Number(offerDurationMonthsString) : 0;\n }\n @computedFrom(\"offerData.credit\")\n get offerCredit() {\n const { credit: offerCredit = 0 } = this.offerData || {};\n return offerCredit;\n }\n\n @computedFrom(\"offerType\", \"isTeachersOffer\")\n get offerPointsData() {\n switch (this.offerType) {\n case \"flt\": // flat\n switch (this.offerTarget) {\n case \"usr\":\n return [{\n i18nKey: \"elements:offer.useWithoutLimits\",\n i18nParams: {\n ...i18nParams,\n durationMonths: this.offerDurationMonths\n }\n }, {\n i18nKey: \"elements:offer.freezeYourCredit\",\n i18nParams\n }, {\n i18nKey: \"elements:offer.recommendedForHeavyUsers\",\n i18nParams: i18nParams\n }, {\n i18nKey: \"elements:offer.additionalDiscountsMayApply\",\n i18nParams: {\n ...i18nParams,\n discountsUrl: `${spaBaseUrl}/invitation-discounts`\n }\n }];\n case \"tch\":\n return [{\n i18nKey: \"elements:offer.freeOfferReservedForTeachers\",\n i18nParams\n }, {\n i18nKey: \"elements:offer.useWithoutLimits\",\n i18nParams: {\n ...i18nParams,\n durationMonths: this.offerDurationMonths\n }\n }, {\n i18nKey: \"elements:offer.freezeYourCredit\",\n i18nParams\n }];\n default:\n throw new Error(`Unknown flat offer target \"${this.offerTarget}\"`);\n }\n case \"crd\": // credit\n switch (this.offerTarget) {\n case \"usr\":\n return [{\n i18nKey: \"elements:offer.topUpYourCredit\",\n i18nParams: {\n ...i18nParams,\n credit: this.offerCredit\n }\n }, {\n i18nKey: \"elements:offer.recommendedForCasualUsers\",\n i18nParams: i18nParams\n }, {\n i18nKey: \"elements:offer.additionalDiscountsMayApply\",\n i18nParams: i18nParams\n }];\n case \"tch\":\n return [{\n i18nKey: \"elements:offer.freeOfferReservedForTeachers\",\n i18nParams\n }, {\n i18nKey: \"elements:offer.topUpYourCredit\",\n i18nParams: {\n ...i18nParams,\n credit: this.offerCredit\n }\n }];\n case \"dnr\":\n return [{\n i18nKey: \"elements:offer.offerAimedAtDonors\",\n i18nParams\n }, {\n i18nKey: \"elements:offer.supportOurWork\",\n i18nParams\n }, {\n i18nKey: \"elements:offer.obtainOneSymbolicCredit\",\n i18nParams\n }, {\n i18nKey: \"elements:offer.earnOurLoveAndGratitude\",\n i18nParams\n }];\n default:\n throw new Error(`Unknown credit offer target \"${this.offerTarget}\"`);\n }\n default:\n console.warn(`Unknown offer type \"${this.offerType}\"`);\n return [];\n }\n }\n\n\n // Core methods\n activateOffer() {\n this.router.navigateToRoute(`offer`, {\n offerKey: this.offerKey\n });\n }\n\n}\n","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;","// Module\nvar code = \"\\n\";\n// Exports\nexport default code;"],"names":[],"sourceRoot":""}