{"version":3,"file":"app-9e647ce2.981ca8458d389c9a476a.bundle.js","mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAOA;AACA;;AAEA;AACA;;AAGA;AACA;AAUA;AAPA;AAAA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;;AAGA;AACA;AAEA;AACA;AAEA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AACA;AAEA;AAAA;AAAA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;;;;;;;;;;;;;;;ACrHA;;AAEA;AACA;;AAGA;AACA;AAAA;AAEA;AAAA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAEA;;;;;;;;;;;;;;;;;;AC5BA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAGA;AACA;AAkBA;AAfA;AAAA;AACA;AAOA;AACA;AAEA;AAAA;AACA;AAIA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;;;AClDA;;AAEA;AACA;;AAGA;AACA;AAAA;AAEA;AAAA;AACA;AACA;AACA;AAGA;AAKA;AAEA;;;;;;;;;;;;;;;;;;;;;;;ACtBA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAGA;AACA;;AAEA;AACA;AAeA;AAPA;AAAA;AACA;AACA;AACA;AACA;AASA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AAEA;AACA;AAEA;;AAGA;AACA;AAEA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;AC/DA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAKA;AACA;;AAGA;AACA;AAMA;AAHA;AAAA;AAIA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;;AAGA;AACA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnEA;;AAEA;AACA;;AAKA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AAAA;;AAIA;AACA;AAeA;AAPA;AAAA;AACA;AACA;AACA;AACA;AASA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AAIA;AAFA;AACA;AACA;AACA;AACA;AAIA;AAFA;AAAA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AAEA;AAIA;AAFA;AACA;AACA;AACA;AACA;AAIA;AAFA;AAAA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAIA;AAFA;AAAA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AAAA;AAAA;AAIA;AAFA;AAAA;AAAA;AACA;AAAA;AAEA;AACA;AACA;AAEA;AAEA;AACA;AAAA;AAAA;AACA;AACA;AAIA;AAFA;AAAA;AAAA;AACA;AAAA;AAEA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;ACpNA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAIA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AAQA;AAPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;ACxEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAGA;AACA;AACA;AACA;AACA;AAGA;AAFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;ACjDA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAKA;AACA;AACA;;AAEA;AACA;AACA;AAAA;;AAIA;AACA;AAYA;AALA;AAAA;AACA;AACA;AAQA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;ACvGA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAEA;AAAA;AACA;AAEA;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;AAEA;;;;;;;;;;;;;;;;;;;;;;;AClDA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AAIA;;AAMA;AACA;;AAGA;AACA;AAaA;AAVA;AAAA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AAIA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;;AAIA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;AC7EA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AAIA;;AAKA;AACA;AACA;;AAEA;AACA;AAAA;AAAA;AACA;AACA;AACA;;AAOA;AACA;AASA;AANA;AAAA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AAGA;AACA;AAEA;AACA;AAEA;AAEA;AAEA;;AAGA;AACA;AACA;AACA;;AAGA;AACA;AAAA;AAAA;AAAA;AACA;AACA;AAEA;;;;;;;;;;;AC3GA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA;;;;;;;;;;;ACHA;AACA;AACA;AACA","sources":["webpack://latinera/./sources/screens/etc/footer-area.js","webpack://latinera/./sources/screens/etc/free-credit.js","webpack://latinera/./sources/screens/etc/frequently-asked-questions.js","webpack://latinera/./sources/screens/etc/invitation-discounts.js","webpack://latinera/./sources/screens/etc/navigation-bar.js","webpack://latinera/./sources/screens/etc/not-found.js","webpack://latinera/./sources/screens/etc/offers.js","webpack://latinera/./sources/screens/etc/offers/get-activated-offers.js","webpack://latinera/./sources/screens/etc/offers/get-active-offers.js","webpack://latinera/./sources/screens/etc/privacy-policy.js","webpack://latinera/./sources/screens/etc/supported-browsers.js","webpack://latinera/./sources/screens/etc/terms-of-service.js","webpack://latinera/./sources/screens/etc/video-guide.js","webpack://latinera/./sources/screens/etc/footer-area.html","webpack://latinera/./sources/screens/etc/free-credit.html","webpack://latinera/./sources/screens/etc/frequently-asked-questions.html","webpack://latinera/./sources/screens/etc/invitation-discounts.html","webpack://latinera/./sources/screens/etc/navigation-bar.html","webpack://latinera/./sources/screens/etc/not-found.html","webpack://latinera/./sources/screens/etc/offers.html","webpack://latinera/./sources/screens/etc/privacy-policy.html","webpack://latinera/./sources/screens/etc/supported-browsers.html","webpack://latinera/./sources/screens/etc/terms-of-service.html","webpack://latinera/./sources/screens/etc/video-guide.html"],"sourcesContent":["// Define the view-model for the private \"footer-area\" screen\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 projectName,\n companyName,\n companyAddress,\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 \"FooterArea\" class\n@inject(Router, UserService)\nexport class FooterArea {\n\n // Local attributes\n projectName = projectName;\n companyName = companyName;\n companyAddress = companyAddress;\n latineraIconAndText = latineraIconAndText;\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(\"userService.isSessionOpen\")\n get isSessionOpen() {\n return this.userService.isSessionOpen;\n }\n\n @computedFrom(\"router.currentInstruction\")\n get currentInstructionData() {\n const { currentInstruction: currentInstructionData = null } = this.router;\n return currentInstructionData;\n }\n @computedFrom(\"currentInstructionData.config\")\n get routeConfigData() {\n const { config: routeConfigData = null } = this.currentInstructionData || {};\n return routeConfigData;\n }\n @computedFrom(\"routeConfigData.name\")\n get currentRouteName() {\n const { name: currentRouteName = \"\" } = this.routeConfigData || {};\n return currentRouteName;\n }\n\n @computedFrom(\"isSessionOpen\")\n get startHref() {\n return this.isSessionOpen ?\n this.router.generate(\"dashboard\") : uiBaseUrl;\n }\n\n @computedFrom(\"currentRouteName\")\n get showOffers() {\n return ![\"offers\"].includes(this.currentRouteName);\n }\n @computedFrom(\"isSessionOpen\")\n get offersHref() {\n return this.isSessionOpen ?\n this.router.generate(\"offers\") : `${uiBaseUrl}/offers`;\n }\n\n @computedFrom(\"currentRouteName\")\n get showVideoGuide() {\n return ![\"videoGuide\"].includes(this.currentRouteName);\n }\n @computedFrom(\"isSessionOpen\")\n get videoGuideHref() {\n return this.isSessionOpen ?\n this.router.generate(\"videoGuide\") : `${uiBaseUrl}/video-guide`;\n }\n\n @computedFrom(\"currentRouteName\")\n get showFaq() {\n return ![\"faq\"].includes(this.currentRouteName);\n }\n @computedFrom(\"isSessionOpen\")\n get faqHref() {\n return this.isSessionOpen ?\n this.router.generate(\"faq\") : `${uiBaseUrl}/faq`;\n }\n\n @computedFrom(\"currentRouteName\")\n get showPrivacyPolicy() {\n return ![\"privacyPolicy\"].includes(this.currentRouteName);\n }\n @computedFrom(\"isSessionOpen\")\n get privacyPolicyHref() {\n return this.isSessionOpen ?\n this.router.generate(\"privacyPolicy\") : `${uiBaseUrl}/privacy-policy`;\n }\n\n @computedFrom(\"currentRouteName\")\n get showTermsOfService() {\n return ![ \"termsOfService\", \"signUp\" ].includes(this.currentRouteName);\n }\n @computedFrom(\"isSessionOpen\")\n get termsOfServiceHref() {\n return this.isSessionOpen ?\n this.router.generate(\"termsOfService\") : `${uiBaseUrl}/terms-of-service`;\n }\n\n}\n","// Define the view-model for the \"free-credit\" screen\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n\n// Export the \"FreeCredit\" class\nexport class FreeCredit {\n\n // Local attributes\n i18nParams = i18nParams;\n freeCreditsData = [{\n weeks: \"1\",\n credit: \"80\"\n }, {\n weeks: \"2\",\n credit: \"60\"\n }, {\n weeks: \"3\",\n credit: \"40\"\n }, {\n weeks: \"4\",\n credit: \"20\"\n }, {\n weeks: \"5+\",\n credit: \"0\"\n }];\n\n}\n","// Define the view-model for the \"frequently-asked-questions\" screen\n\n// Import library modules\nimport { inject } from \"aurelia-framework\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n// Import service modules\nimport UserService from \"services/user\";\n\n\n// Export the \"FrequentlyAskedQuestions\" class\n@inject(UserService)\nexport class FrequentlyAskedQuestions {\n\n // Local attributes\n activeQuestionName = \"\";\n questionsNames = [\n \"whereCanIFindHelp\",\n \"whatIfISpotABug\",\n \"whyNotUsingPaperAndPencil\",\n \"whyNotUsingAI\",\n \"areYouUsingAI\",\n // \"whyNotAFreeApp\",\n \"whyNotAndroidIosApp\",\n \"whyNotOnSocialNetworks\",\n //\"howToRequestAFeature\"\n ];\n i18nParams = i18nParams;\n\n constructor(userService) {\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n activate({ questionName = \"\" }) {\n if (questionName) {\n console.info(`Opening URL-provided question name \"${questionName}\"`);\n this.activeQuestionName = questionName;\n }\n }\n\n\n // Core methods\n toggleHelpCanvas() {\n this.userService.conditionallyExtendSession(); // do not await\n }\n\n}\n","// Define the view-model for the \"invitation-discounts\" screen\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n\n// Export the \"invitationDiscounts\" class\nexport class invitationDiscounts {\n\n // Local attributes\n i18nParams = i18nParams;\n discountsData = [ // this is just a placeholder with the required length\n \"activateFlatOffer\",\n \"activateCreditOffer\",\n \"activateAccount\"\n ];\n discountExamplesData = [\n \"example1\",\n \"example2\",\n \"example3\",\n ];\n\n}\n","// Define the view-model for the public \"navigation-bar\" screen\n\n// Import library modules\nimport { inject, computedFrom } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\n\n// Import parameter modules\nimport { runMode as defaultRunMode } from \"parameters/environment\";\n\n// Import service modules\nimport ApplicationService from \"services/application\";\nimport LocaleService from \"services/locale\";\nimport UserService from \"services/user\";\n\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n// Export the \"NavigationBar\" class\n@inject(\n ApplicationService,\n LocaleService, \n Router, \n UserService\n)\nexport class NavigationBar {\n\n // Local attributes\n activeUILocaleData = null;\n uiLocalesData = [];\n defaultRunMode = defaultRunMode;\n runMode = defaultRunMode;\n i18nParams = i18nParams;\n\n constructor(\n applicationService,\n localeService, \n router, \n userService\n ) {\n this.applicationService = applicationService;\n this.localeService = localeService;\n this.router = router;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n async activate() {\n this.runMode = await this.applicationService.getRunMode();\n\n this.uiLocalesData = this.localeService.getUILocalesData();\n this.activeUILocaleData = this.localeService\n .getLocaleDataByCode(this.userService.uiLocaleCode);\n }\n\n\n // Getter and setter methods\n @computedFrom(\"runMode\")\n get uiLocaleDropdownEnabled() {\n return [\"dev\"].includes(this.runMode);\n }\n\n}\n","// Define the view-model for the \"not-found\" screen\n\n// Import library modules\nimport { computedFrom, inject } from \"aurelia-framework\";\nimport { Router } from \"aurelia-router\";\nimport { I18N } from \"aurelia-i18n\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { uiBaseUrl } from \"parameters/environment\";\nimport {\n autoRedirectionTimeoutMs,\n autoRedirectionIntervalMs\n} from \"parameters/time\";\n\n// Import service modules\nimport UserService from \"services/user\";\n\n\n// Export the \"NotFound\" class\n@inject(I18N, Router, UserService)\nexport class NotFound {\n\n // Local attributes\n i18nParams = i18nParams;\n\n constructor(i18n, router, userService) {\n this.i18n = i18n;\n this.router = router;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n attached() {\n this.autoRedirectionTimeoutMs = autoRedirectionTimeoutMs;\n this.autoRedirectionIntervalId = setInterval(() => {\n this.autoRedirectionTimeoutMs -= autoRedirectionIntervalMs;\n if (this.autoRedirectionTimeoutMs <= 0) {\n clearInterval(this.autoRedirectionIntervalId);\n console.info(`Redirected to the fallback route`);\n this.router.navigate(this.startHref);\n }\n }, autoRedirectionIntervalMs);\n }\n\n detached() {\n clearInterval(this.autoRedirectionIntervalId);\n }\n\n\n // Getter and setter methods\n @computedFrom(\"autoRedirectionTimeoutMs\")\n get autoRedirectionTimeoutSec() {\n return this.autoRedirectionTimeoutMs/1000;\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 \"offers\" screen\n\n// Import library modules\nimport {\n computedFrom,\n inject\n} from \"aurelia-framework\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\nimport { getCurrentTimeStampMs } from \"utilities/time\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { runMode as defaultRunMode } from \"parameters/environment\";\n\n// Import method modules\nimport { getActiveOffers } from \"./offers/get-active-offers\";\nimport { getActivatedOffers } from \"./offers/get-activated-offers\";\n\n// Import service modules\nimport ApplicationService from \"services/application\";\nimport EventService from \"services/event\";\nimport OfferService from \"services/offer\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst dayDurationMs = 24*60*60*1000;\nconst offersActivationOverlapMs = 28*dayDurationMs; // 4 weeks\nconst eventsData = [\n { name: \"runModeChanged\" }\n];\n\n\n// Export the \"Offers\" class\n@inject(\n ApplicationService,\n EventService,\n OfferService,\n UserService\n)\nexport class Offers {\n\n // Local attributes\n offersData = [];\n showFlatOffers = true;\n isLoadingData = false;\n i18nParams = i18nParams;\n runMode = defaultRunMode;\n\n constructor(\n applicationService,\n eventService,\n offerService,\n userService\n ) {\n this.applicationService = applicationService;\n this.eventService = eventService;\n this.offerService = offerService;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n async bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"offers\",\n eventService: this.eventService,\n eventsData\n });\n }\n\n async activate() {\n this.runMode = await this.applicationService.getRunMode();\n\n // Verify whether the user can see/activate flat offers\n if (this.userService.isSessionOpen) {\n const activatedFlatOffersData = await this.getActivatedFlatOffers();\n if (activatedFlatOffersData.length === 0) { // no active flat offers\n this.showFlatOffers = true;\n } else {\n const currentTimeStampMs = getCurrentTimeStampMs();\n this.showFlatOffers = !(activatedFlatOffersData\n .some(({ activatesData: flatOfferActivatesData = null }) => {\n const { \n expiresOn: activatedFlatOfferExpiresOn = 0 \n } = flatOfferActivatesData || {};\n const activatedFlatOfferExpiresIn = \n activatedFlatOfferExpiresOn - currentTimeStampMs;\n return activatedFlatOfferExpiresIn > offersActivationOverlapMs;\n }));\n }\n } else {\n this.showFlatOffers = true;\n }\n if (this.showFlatOffers) {\n console.info(\"User is allowed to activate flat offers\");\n } else {\n console.info(\"User is not allowed to activate flat offers\");\n }\n\n // Fetch offers from the index/server\n this.offersData = await this.getActiveOffers();\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"offersData\")\n get flatOffersData() {\n return this.offersData\n .filter(({ \n type: offerType = \"\",\n target: offerTarget = \"usr\"\n }) => {\n return offerType === \"flt\" && offerTarget === \"usr\";\n })\n .sort((\n { discountedPrice: dPrice1 = 0 }, \n { discountedPrice: dPrice2 = 0 }\n ) => {\n return Math.sign(dPrice1 - dPrice2);\n });\n }\n\n @computedFrom(\"offersData\")\n get creditOffersData() {\n return this.offersData\n .filter(({ \n type: offerType = \"\",\n target: offerTarget = \"usr\"\n }) => {\n return offerType === \"crd\" && offerTarget === \"usr\";\n })\n .sort((\n { discountedPrice: dPrice1 = 0 }, \n { discountedPrice: dPrice2 = 0 }\n ) => {\n return Math.sign(dPrice1 - dPrice2);\n });\n }\n\n @computedFrom(\"offersData\")\n get teachersOffersData() {\n return this.offersData\n .filter(({ target: offerTarget = \"usr\" }) => offerTarget === \"tch\")\n .sort((\n { discountedPrice: dPrice1 = 0 }, \n { discountedPrice: dPrice2 = 0 }\n ) => {\n return Math.sign(dPrice1 - dPrice2);\n });\n }\n\n @computedFrom(\"offersData\")\n get donorsOffersData() {\n return this.offersData\n .filter(({ target: offerTarget = \"usr\" }) => offerTarget === \"dnr\")\n .sort((\n { discountedPrice: dPrice1 = 0 }, \n { discountedPrice: dPrice2 = 0 }\n ) => {\n return Math.sign(dPrice1 - dPrice2);\n });\n }\n\n @computedFrom(\"offersData\")\n get otherOffersData() {\n return this.offersData\n .filter(({ target: offerTarget = \"usr\" }) => {\n return ![\"usr\", \"tch\", \"dnr\"].includes(offerTarget);\n })\n .sort((\n { discountedPrice: dPrice1 = 0 }, \n { discountedPrice: dPrice2 = 0 }\n ) => {\n return Math.sign(dPrice1 - dPrice2);\n });\n }\n\n\n // Core methods\n async getActiveOffers() {\n return await getActiveOffers.call(this, {\n statuses: [\"act\"],\n runMode: this.runMode\n });\n }\n\n async getActivatedFlatOffers() {\n return await getActivatedOffers.call(this, {\n statuses: [\"act\", \"fut\"],\n types: [\"flt\"],\n limit: 3,\n fetchFromIndex: false,\n saveToIndex: false,\n runMode: this.runMode\n })\n }\n\n\n\n // Event handlers\n handleRunModeChangedEvent({ runMode = defaultRunMode }) {\n this.runMode = runMode;\n }\n\n}\n","// Define the \"getActivatedOffers\" offers screen method\n\n// Import utility modules\nimport { typeOf } from \"utilities/etc\";\nimport { pause } from \"utilities/promise\";\n\n// Import parameter modules\nimport { mockLoadingDataDurationMs } from \"parameters/time\";\nimport { \n runMode as defaultRunMode \n} from \"parameters/environment\";\n\n// Define internal parameters\nconst defaultOfferStatuses = [\"act\"];\nconst defaultOfferTypes = [ \"crd\", \"flt\" ];\nconst defaultSortDirection = \"dsc\";\nconst defaultLimit = 3;\n\n\n// getActivatedOffers: async\n// returns a promise which either resolves with an array of offerd\n// activated by the user matching the specified fiter parameters,\n// or rejects with an error\nexport async function getActivatedOffers({\n statuses: offerStatuses = defaultOfferStatuses,\n types: offerTypes = defaultOfferTypes,\n sortDirection = defaultSortDirection,\n limit = defaultLimit,\n fetchFromIndex = true,\n saveToIndex = true,\n runMode = defaultRunMode\n}) {\n if (typeOf(offerStatuses) !== \"array\" || offerStatuses.length === 0) {\n throw new Error(`Parameter \"offerStatuses\" should be a non-empty array`);\n } else if (typeOf(offerTypes) !== \"array\" || offerTypes.length === 0) {\n throw new Error(`Parameter \"offerTypes\" should be a non-empty array`);\n } else if (typeOf(sortDirection) !== \"string\" || !sortDirection) {\n throw new Error(`Parameter \"sortDirection\" should be a string`);\n } else if (typeOf(limit) !== \"number\" || limit <= 0) {\n throw new Error(`Parameter \"limit\" should be a positive number`);\n } else if (!this.offerService) {\n throw new Error(`Missing required \"offer\" service`);\n }\n\n this.isLoadingData = true;\n\n // Mock finite loading duration\n if ([\"dev\"].includes(runMode)) {\n await pause(mockLoadingDataDurationMs);\n }\n\n // Get offers by filter from index/server\n let activatedOffersData;\n try {\n activatedOffersData = await this.offerService.getActivatedOffersByFilter({\n filterData: {\n statuses: offerStatuses,\n types: offerTypes,\n sortDirection,\n limit\n },\n fetchFromIndex,\n saveToIndex\n });\n } catch(error) {\n console.warn(`Error getting activated offers from index/server`, error);\n activatedOffersData = [];\n }\n this.isLoadingData = false;\n\n // Return array of active offers\n return activatedOffersData;\n}\n","// Define the \"getActiveOffers\" offers screen method\n\n// Import utility modules\nimport { typeOf } from \"utilities/etc\";\nimport { pause } from \"utilities/promise\";\n\n// Import parameter modules\nimport { runMode as defaultRunMode } from \"parameters/environment\";\nimport { mockLoadingDataDurationMs } from \"parameters/time\";\n\n// Define internal parameters\nconst defaultStatuses = [\"act\"];\n\n\n// getActiveOffers: async\n// returns a promise which either resolves with an array of currently\n// active offers for the specified array country/currency codes,\n// or rejects with an error\nexport async function getActiveOffers({\n statuses = defaultStatuses,\n runMode = defaultRunMode\n}) {\n if (typeOf(statuses) !== \"array\" || statuses.length === 0) {\n throw new Error(`Parameter \"statuses\" should be a non-empty array`);\n } else if (!this.offerService) {\n throw new Error(`Missing required \"offer\" service`);\n }\n\n this.isLoadingData = true;\n\n // Mock finite loading duration\n if ([\"dev\"].includes(runMode)) {\n await pause(mockLoadingDataDurationMs);\n }\n\n // Get offers by filter from index/server\n let activeOffersData;\n try {\n activeOffersData = await this.offerService.getOffersByFilter({\n statuses\n });\n } catch(error) {\n console.warn(`Error getting active offers from index/server`, error);\n activeOffersData = [];\n }\n this.isLoadingData = false;\n\n // Return array of active offers\n return activeOffersData;\n}\n","// Define the view-model for the \"privacy-policy\" screen\n\n// Import library modules\nimport { inject } from \"aurelia-framework\";\nimport { I18N } from \"aurelia-i18n\";\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 privacyPolicyTimeStampMs,\n privacyPolicySectionNames \n} from \"parameters/etc\";\n\n// Import service modules\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst eventsData = [\n { name: \"acceptPrivacyPolicyToggled\" }\n];\n\n\n// Export the \"PrivacyPolicy\" class\n@inject(\n I18N, \n EventService, \n UserService\n)\nexport class PrivacyPolicy {\n\n // Local attributes\n sectionNames = privacyPolicySectionNames;\n privacyPolicyAccepted = false;\n i18nParams = i18nParams;\n\n constructor(\n i18n, \n eventService, \n userService\n ) {\n this.i18n = i18n;\n this.eventService = eventService;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"privacyPolicy\",\n eventService: this.eventService,\n eventsData\n });\n\n this.updatePrivacyPolicyAccepted();\n\n this.privacyPolicyDateString = computeAbsoluteTimeString({\n timeStampMs: privacyPolicyTimeStampMs,\n formatString: \"PPP\",\n localeCode: this.userService.uiLocaleCode\n });\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Core methods\n togglePrivacyPolicy() {\n this.userService.acceptPrivacyPolicy = !this.userService.acceptPrivacyPolicy;\n this.updatePrivacyPolicyAccepted();\n this.publishAcceptPrivacyNoticeToggledEvent();\n }\n updatePrivacyPolicyAccepted() {\n this.privacyPolicyAccepted = this.userService.acceptPrivacyPolicy;\n }\n\n\n // Event handlers\n handleAcceptPrivacyPolicyToggledEvent() {\n this.updatePrivacyPolicyAccepted();\n }\n\n\n // Event publishers\n publishAcceptPrivacyNoticeToggledEvent(eventData) {\n this.eventService.publish({\n eventName: \"acceptPrivacyPolicyToggled\",\n eventData: {\n acceptPrivacyPolicy: this.userService.acceptPrivacyPolicy,\n ...(eventData || {})\n }\n });\n }\n\n}\n","// Define the view-model for the \"supported-browsers\" screen\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\n\n// Import image modules\nimport googleChromeLogo from \"images/logos/browsers/google-chrome.svg\";\nimport mozillaFirefoxLogo from \"images/logos/browsers/mozilla-firefox.svg\";\nimport appleSafariLogo from \"images/logos/browsers/apple-safari.svg\";\nimport microsoftEdgeLogo from \"images/logos/browsers/microsoft-edge.svg\";\nimport operaOperaLogo from \"images/logos/browsers/opera-opera.svg\";\nimport vivaldiVivaldiLogo from \"images/logos/browsers/vivaldi-vivaldi.svg\";\nimport braveBraveLogo from \"images/logos/browsers/brave-brave.svg\";\n\n\n// Export the \"SupportedBrowsers\" class\nexport class SupportedBrowsers {\n\n // Local attributes\n i18nParams = i18nParams;\n browsersData = [{\n name: \"Chrome / Chromium\",\n version: \"> 42\",\n logo: googleChromeLogo\n }, {\n name: \"Firefox\",\n version: \"> 40\",\n logo: mozillaFirefoxLogo\n }, {\n name: \"Safari\",\n version: \"> 10.1\",\n logo: appleSafariLogo\n }, {\n name: \"Edge\",\n version: \"> 79\",\n logo: microsoftEdgeLogo\n }, {\n name: \"Opera\",\n version: \"> 29\",\n logo: operaOperaLogo\n }, {\n name: \"Vivaldi\",\n version: \"> 1.0\",\n logo: vivaldiVivaldiLogo\n }, {\n name: \"Brave\",\n version: \"> 1.0\",\n logo: braveBraveLogo\n }];\n\n}\n","// Define the view-model for the \"terms-of-service\" screen\n// note: using class name \"TermsOfServicScreen\" to avoid conflect with the\n// \"TermsOfService\" element class\n\n// Import library modules\nimport { computedFrom, inject } from \"aurelia-framework\"\nimport { Router } from \"aurelia-router\";\n\n// Import utility modules\nimport { computeAbsoluteTimeString } from \"utilities/time\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { \n termsOfServiceTimeStampMs,\n termsOfServiceSectionNames \n} from \"parameters/etc\";\nimport {\n companyName,\n domainName,\n uiBaseUrl\n} from \"parameters/environment\";\n\n// Import service modules\nimport UserService from \"services/user\";\n\n\n// Export the \"TermsOfServicScreen\" class\n@inject(Router, UserService)\nexport class TermsOfServiceScreen {\n\n // Local attributes\n i18nParams = i18nParams;\n termsOfServiceI18nParams = {\n ...i18nParams,\n companyName,\n domainName\n };\n activeSectionName = \"\";\n sectionNames = termsOfServiceSectionNames;\n\n constructor(router, userService) {\n this.router = router;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n activate({ sectionName = \"\" }) {\n if (sectionName) {\n console.info(`Opening section name \"${sectionName}\"`);\n this.activeSectionName = sectionName;\n }\n }\n\n\n\n // Getter and setter methods\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 @computedFrom(\"userService.uiLocaleCode\")\n get termsOfServiceDateString() {\n return computeAbsoluteTimeString({\n timeStampMs: termsOfServiceTimeStampMs,\n formatString: \"PPP\",\n localeCode: this.userService.uiLocaleCode\n });\n }\n\n}\n","// Define the view-model for the \"video-guide\" screen\n\n// Import library modules\nimport { inject, computedFrom } from \"aurelia-framework\";\nimport { I18N } from \"aurelia-i18n\";\n\n// Import utility modules\nimport { setEventHandlers, unsetEventHandlers } from \"utilities/event\";\n\n// Import parameter modules\nimport { tBindingBehavior as i18nParams } from \"parameters/i18n\";\nimport { \n runMode as defaultRunMode,\n uiLocaleCode as defaultUILocaleCode\n} from \"parameters/environment\";\nimport {\n videosUrl as vimeoVideosUrl,\n queryParamsString as vimeoQueryParamsString\n} from \"parameters/vimeo\";\n\n// Import service modules\nimport EventService from \"services/event\";\nimport UserService from \"services/user\";\n\n// Define internal parameters\nconst eventsData = [{ name: \"runModeChanged\" }];\nconst availableUILocales = [\"it-it\"];\nconst incompleteUILocales = [\"it-it\"];\nconst sectionsNames = [\n \"inflectionTheory\",\n \"translationProcess1\",\n \"translationProcess2\",\n];\n\n\n// Export the \"VideoGuide\" class\n@inject(EventService, I18N, UserService)\nexport class VideoGuide {\n\n // Local attributes\n sectionsData = [];\n i18nParams = i18nParams;\n runMode = defaultRunMode;\n uiLocaleCode = defaultUILocaleCode;\n\n constructor(eventService, i18n, userService) {\n this.eventService = eventService;\n this.i18n = i18n;\n this.userService = userService;\n }\n\n\n // Lifecycle methods\n async bind() {\n this.eventsSubscriptions = setEventHandlers.call(this, {\n entityName: \"videoGuide\",\n eventService: this.eventService,\n eventsData\n });\n\n\n // Compute sections' data\n this.sectionsData = sectionsNames.map(sectionName => {\n const baseI18nKey = `screens:videoGuide.videos.${sectionName}`;\n const videosIdsString = this.i18n.tr(`${baseI18nKey}.videosIds`);\n const videosIds = videosIdsString.split(/\\W*[,;]\\W*/g);\n return {\n titleI18nKey: `[html]${baseI18nKey}.title`,\n descriptionI18nKey: `[html]${baseI18nKey}.description`,\n videosUrls: videosIds.map(videoId => {\n return `${vimeoVideosUrl}/${videoId}?${vimeoQueryParamsString}`;\n })\n };\n });\n }\n\n unbind() {\n unsetEventHandlers.call(this, {\n eventsSubscriptions: this.eventsSubscriptions\n });\n }\n\n\n // Getter and setter methods\n @computedFrom(\"uiLocaleCode\")\n get showUnavailableAlert() {\n return !availableUILocales.includes(this.uiLocaleCode);\n }\n\n @computedFrom(\"uiLocaleCode\")\n get showIncompleteAlert() {\n return !this.showUnavailableAlert &&\n incompleteUILocales.includes(this.uiLocaleCode);\n }\n\n\n // Core methods\n toggleHelpCanvas() {\n this.userService.conditionallyExtendSession(); // do not await\n }\n\n\n // Event handlers\n handleRunModeChangedEvent({ runMode = defaultRunMode }) {\n this.runMode = runMode;\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;","// 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;","// 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":""}