{"version":3,"file":"modal-7a355ecb-chunk.js","sources":["../../../w3t_front/api/constants.js","../../../node_modules/.pnpm/recaptcha-v3@1.10.0/node_modules/recaptcha-v3/dist/ReCaptchaInstance.js","../../../node_modules/.pnpm/recaptcha-v3@1.10.0/node_modules/recaptcha-v3/dist/ReCaptchaLoader.js","../../../node_modules/.pnpm/recaptcha-v3@1.10.0/node_modules/recaptcha-v3/dist/ReCaptcha.js","../../../w3t_front/api/utils.js","../../../w3t_front/api/index.js","../../../w3t_front/components/modal/modal.ts"],"sourcesContent":["export const API_CODE_FAILURE = 0;\nexport const CLIENT_TYPE_BROWSER = 'browser';\nexport const USER_ROLE_CUSTOMER = 'customer';\nexport const USER_ROLE_WRITER = 'writer';\nexport const USER_ROLE_OPERATOR = 'operator';\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (_) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ReCaptchaInstance = void 0;\nvar ReCaptchaInstance = (function () {\n function ReCaptchaInstance(siteKey, recaptchaID, recaptcha) {\n this.siteKey = siteKey;\n this.recaptchaID = recaptchaID;\n this.recaptcha = recaptcha;\n this.styleContainer = null;\n }\n ReCaptchaInstance.prototype.execute = function (action) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2, this.recaptcha.enterprise ? this.recaptcha.enterprise.execute(this.recaptchaID, { action: action }) : this.recaptcha.execute(this.recaptchaID, { action: action })];\n });\n });\n };\n ReCaptchaInstance.prototype.getSiteKey = function () {\n return this.siteKey;\n };\n ReCaptchaInstance.prototype.hideBadge = function () {\n if (this.styleContainer !== null) {\n return;\n }\n this.styleContainer = document.createElement('style');\n this.styleContainer.innerHTML = '.grecaptcha-badge{visibility:hidden !important;}';\n document.head.appendChild(this.styleContainer);\n };\n ReCaptchaInstance.prototype.showBadge = function () {\n if (this.styleContainer === null) {\n return;\n }\n document.head.removeChild(this.styleContainer);\n this.styleContainer = null;\n };\n return ReCaptchaInstance;\n}());\nexports.ReCaptchaInstance = ReCaptchaInstance;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getInstance = exports.load = void 0;\nvar ReCaptchaInstance_1 = require(\"./ReCaptchaInstance\");\nvar ELoadingState;\n(function (ELoadingState) {\n ELoadingState[ELoadingState[\"NOT_LOADED\"] = 0] = \"NOT_LOADED\";\n ELoadingState[ELoadingState[\"LOADING\"] = 1] = \"LOADING\";\n ELoadingState[ELoadingState[\"LOADED\"] = 2] = \"LOADED\";\n})(ELoadingState || (ELoadingState = {}));\nvar ReCaptchaLoader = (function () {\n function ReCaptchaLoader() {\n }\n ReCaptchaLoader.load = function (siteKey, options) {\n if (options === void 0) { options = {}; }\n if (typeof document === 'undefined') {\n return Promise.reject(new Error('This is a library for the browser!'));\n }\n if (ReCaptchaLoader.getLoadingState() === ELoadingState.LOADED) {\n if (ReCaptchaLoader.instance.getSiteKey() === siteKey) {\n return Promise.resolve(ReCaptchaLoader.instance);\n }\n else {\n return Promise.reject(new Error('reCAPTCHA already loaded with different site key!'));\n }\n }\n if (ReCaptchaLoader.getLoadingState() === ELoadingState.LOADING) {\n if (siteKey !== ReCaptchaLoader.instanceSiteKey) {\n return Promise.reject(new Error('reCAPTCHA already loaded with different site key!'));\n }\n return new Promise(function (resolve, reject) {\n ReCaptchaLoader.successfulLoadingConsumers.push(function (instance) { return resolve(instance); });\n ReCaptchaLoader.errorLoadingRunnable.push(function (reason) { return reject(reason); });\n });\n }\n ReCaptchaLoader.instanceSiteKey = siteKey;\n ReCaptchaLoader.setLoadingState(ELoadingState.LOADING);\n var loader = new ReCaptchaLoader();\n return new Promise(function (resolve, reject) {\n loader.loadScript(siteKey, options.useRecaptchaNet || false, options.useEnterprise || false, options.renderParameters ? options.renderParameters : {}, options.customUrl).then(function () {\n ReCaptchaLoader.setLoadingState(ELoadingState.LOADED);\n var widgetID = loader.doExplicitRender(grecaptcha, siteKey, options.explicitRenderParameters ? options.explicitRenderParameters : {}, options.useEnterprise || false);\n var instance = new ReCaptchaInstance_1.ReCaptchaInstance(siteKey, widgetID, grecaptcha);\n ReCaptchaLoader.successfulLoadingConsumers.forEach(function (v) { return v(instance); });\n ReCaptchaLoader.successfulLoadingConsumers = [];\n if (options.autoHideBadge) {\n instance.hideBadge();\n }\n ReCaptchaLoader.instance = instance;\n resolve(instance);\n }).catch(function (error) {\n ReCaptchaLoader.errorLoadingRunnable.forEach(function (v) { return v(error); });\n ReCaptchaLoader.errorLoadingRunnable = [];\n reject(error);\n });\n });\n };\n ReCaptchaLoader.getInstance = function () {\n return ReCaptchaLoader.instance;\n };\n ReCaptchaLoader.setLoadingState = function (state) {\n ReCaptchaLoader.loadingState = state;\n };\n ReCaptchaLoader.getLoadingState = function () {\n if (ReCaptchaLoader.loadingState === null) {\n return ELoadingState.NOT_LOADED;\n }\n else {\n return ReCaptchaLoader.loadingState;\n }\n };\n ReCaptchaLoader.prototype.loadScript = function (siteKey, useRecaptchaNet, useEnterprise, renderParameters, customUrl) {\n var _this = this;\n if (useRecaptchaNet === void 0) { useRecaptchaNet = false; }\n if (useEnterprise === void 0) { useEnterprise = false; }\n if (renderParameters === void 0) { renderParameters = {}; }\n if (customUrl === void 0) { customUrl = ''; }\n var scriptElement = document.createElement('script');\n scriptElement.setAttribute('recaptcha-v3-script', '');\n var scriptBase = 'https://www.google.com/recaptcha/api.js';\n if (useRecaptchaNet) {\n if (useEnterprise) {\n scriptBase = 'https://recaptcha.net/recaptcha/enterprise.js';\n }\n else {\n scriptBase = 'https://recaptcha.net/recaptcha/api.js';\n }\n }\n if (useEnterprise) {\n scriptBase = 'https://www.google.com/recaptcha/enterprise.js';\n }\n if (customUrl) {\n scriptBase = customUrl;\n }\n if (renderParameters.render) {\n renderParameters.render = undefined;\n }\n var parametersQuery = this.buildQueryString(renderParameters);\n scriptElement.src = scriptBase + '?render=explicit' + parametersQuery;\n return new Promise(function (resolve, reject) {\n scriptElement.addEventListener('load', _this.waitForScriptToLoad(function () {\n resolve(scriptElement);\n }, useEnterprise), false);\n scriptElement.onerror = function (error) {\n ReCaptchaLoader.setLoadingState(ELoadingState.NOT_LOADED);\n reject(error);\n };\n document.head.appendChild(scriptElement);\n });\n };\n ReCaptchaLoader.prototype.buildQueryString = function (parameters) {\n var parameterKeys = Object.keys(parameters);\n if (parameterKeys.length < 1) {\n return '';\n }\n return '&' + Object.keys(parameters)\n .filter(function (parameterKey) {\n return !!parameters[parameterKey];\n })\n .map(function (parameterKey) {\n return parameterKey + '=' + parameters[parameterKey];\n }).join('&');\n };\n ReCaptchaLoader.prototype.waitForScriptToLoad = function (callback, useEnterprise) {\n var _this = this;\n return function () {\n if (window.grecaptcha === undefined) {\n setTimeout(function () {\n _this.waitForScriptToLoad(callback, useEnterprise);\n }, ReCaptchaLoader.SCRIPT_LOAD_DELAY);\n }\n else {\n if (useEnterprise) {\n window.grecaptcha.enterprise.ready(function () {\n callback();\n });\n }\n else {\n window.grecaptcha.ready(function () {\n callback();\n });\n }\n }\n };\n };\n ReCaptchaLoader.prototype.doExplicitRender = function (grecaptcha, siteKey, parameters, isEnterprise) {\n var augmentedParameters = {\n sitekey: siteKey,\n badge: parameters.badge,\n size: parameters.size,\n tabindex: parameters.tabindex\n };\n if (parameters.container) {\n if (isEnterprise) {\n return grecaptcha.enterprise.render(parameters.container, augmentedParameters);\n }\n else {\n return grecaptcha.render(parameters.container, augmentedParameters);\n }\n }\n else {\n if (isEnterprise) {\n return grecaptcha.enterprise.render(augmentedParameters);\n }\n else {\n return grecaptcha.render(augmentedParameters);\n }\n }\n };\n ReCaptchaLoader.loadingState = null;\n ReCaptchaLoader.instance = null;\n ReCaptchaLoader.instanceSiteKey = null;\n ReCaptchaLoader.successfulLoadingConsumers = [];\n ReCaptchaLoader.errorLoadingRunnable = [];\n ReCaptchaLoader.SCRIPT_LOAD_DELAY = 25;\n return ReCaptchaLoader;\n}());\nexports.load = ReCaptchaLoader.load;\nexports.getInstance = ReCaptchaLoader.getInstance;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ReCaptchaInstance = exports.getInstance = exports.load = void 0;\nvar ReCaptchaLoader_1 = require(\"./ReCaptchaLoader\");\nObject.defineProperty(exports, \"load\", { enumerable: true, get: function () { return ReCaptchaLoader_1.load; } });\nObject.defineProperty(exports, \"getInstance\", { enumerable: true, get: function () { return ReCaptchaLoader_1.getInstance; } });\nvar ReCaptchaInstance_1 = require(\"./ReCaptchaInstance\");\nObject.defineProperty(exports, \"ReCaptchaInstance\", { enumerable: true, get: function () { return ReCaptchaInstance_1.ReCaptchaInstance; } });\n","import formatISO from 'date-fns/formatISO';\n\n/**\n * @sideeffect {Function} encodeURIComponent\n * @param {Object} obj\n * @returns {String} searchParams\n */\nexport function toSearchParams(obj) {\n return Object.keys(obj)\n .reduce((searchStr, key, i, arr) => {\n const delimiter = arr.length - 1 === i\n ? ''\n : '&';\n\n return searchStr.concat(`${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}${delimiter}`);\n }, '?');\n}\n\n/**\n * @sideeffect {Function} encodeURIComponent\n * @param {Object} obj\n * @returns {String} searchParams\n */\nexport function toUrlEncoded(obj) {\n return Object.keys(obj)\n .reduce((searchStr, key, i, arr) => {\n const delimiter = arr.length - 1 === i\n ? ''\n : '&';\n\n return searchStr.concat(`${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}${delimiter}`);\n }, '');\n}\n\n/**\n * @param {Date} date\n * @returns {String} iso\n */\nexport function formatISOUtc(date = new Date()) {\n const timeISO = formatISO(date);\n\n return timeISO.includes('Z')\n ? timeISO\n : `${timeISO.slice(0, -6)}Z`;\n}\n","import { addMinutes, parse } from 'date-fns';\nimport { load } from 'recaptcha-v3';\n\nimport { _apipe } from '../utils';\n\nimport { API_CODE_FAILURE, CLIENT_TYPE_BROWSER, USER_ROLE_CUSTOMER } from './constants';\nimport { formatISOUtc, toSearchParams, toUrlEncoded } from './utils';\n\nexport class ApiError extends Error {\n constructor(response) {\n super(response.message_text);\n this.name = response.message_slug;\n }\n}\n\n/**\n * @param {Object} params\n * @param {String} params.path\n * @param {Function} [params.success]\n * @param {Function} [params.failue]\n * @param {Object} [params.init]\n */\nexport const apiClient = ({ path, success = a => a, init = {} }) =>\n fetch(`/api/en/1${path}`, {\n method: 'GET',\n mode: 'same-origin',\n cache: 'no-cache',\n credentials: 'same-origin',\n headers: {\n 'Content-Type': 'application/json',\n },\n ...init,\n })\n .then(response => {\n const contentType = response.headers.get('content-type');\n\n if (contentType && contentType.includes('application/json')) {\n return response.json();\n } else {\n throw new Error('test');\n }\n })\n .then(({ meta, body }) =>\n meta.response.code === API_CODE_FAILURE ? new ApiError(meta.response) : { body, meta },\n )\n .then(success)\n .catch(error => {\n switch (true) {\n default:\n throw new Error(error);\n }\n });\n\n/**\n * @param {SorderState} sorderState\n * @returns {SorderState} sorderState\n */\nexport function preCheckUser(sorderState) {\n const { login, user_role = USER_ROLE_CUSTOMER, errors } = sorderState;\n\n return apiClient({\n path: `/users/pre-check${toSearchParams({ login, user_role })}`,\n }).then(user => ({\n ...sorderState,\n ...user,\n errors: {\n ...errors,\n policy_required: user.policy_agree_required,\n user_blocked: !user.login_ability && !user.register_ability && user.user_role_matched,\n auth_token_required_user_not_matched: !user.user_role_matched && !user.register_ability,\n login_incorrect: !user.login_ability && !user.user_role_matched,\n },\n }));\n}\n\n/**\n * @param {SorderState} sorderState\n */\nexport function createCustomer(sorderState) {\n const {\n login,\n utc_offset_min,\n force_auth = true,\n client_type = CLIENT_TYPE_BROWSER,\n policy_agree,\n marketing_agree,\n errors,\n } = sorderState;\n\n return policy_agree\n ? apiClient({\n path: '/customers',\n init: {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;',\n },\n body: toUrlEncoded({\n login,\n utc_offset_min,\n force_auth,\n policy_agree,\n marketing_agree,\n client_type,\n }),\n },\n }).then(error =>\n error instanceof ApiError\n ? {\n ...sorderState,\n errors: {\n ...errors,\n [error.name]: true,\n policy_required: undefined,\n },\n }\n : {\n ...sorderState,\n login_ability: true,\n isNewCustomer: true,\n password: '',\n errors: { ...errors, policy_required: undefined },\n },\n )\n : {\n ...sorderState,\n login_ability: false,\n errors: { ...errors, policy_required: true },\n };\n}\n\n/**\n * @param {SorderState} sorderState\n * @returns {SorderState} sorderState\n */\nexport function createSession(sorderState) {\n const {\n login,\n password,\n utc_offset_min,\n client_type = CLIENT_TYPE_BROWSER,\n captcha_token,\n errors,\n stay_signed_in,\n policy_agree,\n } = sorderState;\n\n return apiClient({\n path: '/users/sessions',\n init: {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;',\n },\n body: toUrlEncoded({\n login,\n password,\n utc_offset_min,\n client_type,\n captcha_token,\n stay_signed_in,\n policy_agree,\n }),\n },\n }).then(session =>\n session instanceof ApiError\n ? { ...sorderState, errors: { ...errors, [session.name]: true } }\n : { ...sorderState, ...session },\n );\n}\n\n/**\n * @param {SorderState} sorderState\n * @returns {SorderState} sorderState\n */\nexport function getSession(sorderState) {\n const { errors } = sorderState;\n\n return apiClient({\n path: '/users/sessions',\n }).then(session =>\n session instanceof ApiError\n ? { ...sorderState, errors: { ...errors, [session.name]: true } }\n : session === null\n ? { ...sorderState, errors: { ...errors, password_incorrect: true } }\n : { ...sorderState, ...session },\n );\n}\n\n/**\n * @TODO DEADLINE_FORMAT_CLIENT_DATE_FNS\n * @param {SorderState} sorderState\n */\nexport function preOrder(sorderState) {\n const DEADLINE_FORMAT_CLIENT_DATE_FNS = \"MMM d 'at' haaa y\";\n\n const {\n paper_type,\n writer_req_slug,\n pages_qty,\n deadline_datetime,\n captcha_token,\n utc_offset_min,\n } = sorderState;\n\n const deadlineUTC = addMinutes(\n parse(deadline_datetime, DEADLINE_FORMAT_CLIENT_DATE_FNS, new Date()),\n -utc_offset_min,\n );\n\n return apiClient({\n path: '/customers/pre-orders',\n init: {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;',\n },\n body: toUrlEncoded({\n deadline_datetime: formatISOUtc(deadlineUTC),\n paper_type,\n pages_qty,\n captcha_token,\n ...(writer_req_slug ? { writer_req_slug } : null),\n }),\n },\n }).then(({ key }) => ({ ...sorderState, key }));\n}\n\n/**\n * @param {string} writer_req_slug\n */\nexport function getWriter(writer_req_slug) {\n return apiClient({\n path: `/widgets/writers/${writer_req_slug}`,\n });\n}\n\n/**\n * @param {Array} slugs\n */\nexport function getWriters(slugs) {\n return apiClient({\n path: `/widgets/writers/${slugs.join(',')}`,\n });\n}\n\nexport function navigateUser(state) {\n const { route } = state;\n\n window.location.href = `/api/en/1/users/redirect-to-dashboard${route ? `?route=${route}` : ''}`;\n return state;\n}\n\nexport function getSettings() {\n return apiClient({ path: '/common/settings' });\n}\n\n/**\n * @param {Object} state\n * @param {string} recaptcha_site_key\n */\nexport function genRecaptchaToken(state) {\n const { recaptcha_site_key, recaptcha_action, errors } = state;\n\n return _apipe(\n () => load(recaptcha_site_key, { autoHideBadge: true }),\n recaptcha => recaptcha.execute(recaptcha_action),\n captcha_token => ({\n ...state,\n captcha_token,\n errors: { ...errors, recaptcha_gen_error: !captcha_token },\n }),\n )();\n}\n\nexport function applyEmailForGiveAway(state) {\n const { email, policy_agree, captcha_token, errors } = state;\n return apiClient({\n path: '/widgets/tools/eh-giveaway',\n init: {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;',\n },\n body: toUrlEncoded({\n email,\n policy_agree,\n captcha_token,\n captcha_token_type: 'recaptcha_v3_web',\n }),\n },\n }).then(response => {\n return response instanceof ApiError\n ? { ...state, errors: { ...errors, [response.name]: response.message } }\n : { ...state, succeed: true };\n });\n}\n\nexport async function getStats() {\n try {\n const response = await apiClient({\n path: '/widgets/statistics',\n init: {\n method: 'GET',\n },\n });\n return response.body;\n } catch (error) {\n console.log('Use stats placeholder');\n return {\n writers_count: 132,\n returning_customers: 8364,\n returning_customers_avg: 57000,\n years_on_market: new Date().getFullYear() - 2011,\n quality_score: 9.65,\n };\n }\n}\n","import { _on } from '../../utils';\n\nconst defaultZIndex = 11000;\n\ntype ModalConfig = {\n id: string;\n content: string;\n contentClasses?: string;\n closeButtonClasses?: string;\n};\n\nexport function openModal({ id, content, contentClasses, closeButtonClasses }: ModalConfig) {\n const allModals = document.querySelectorAll('.modal');\n const modal = document.createElement('div');\n modal.id = id;\n modal.style.zIndex = (defaultZIndex + allModals.length).toString();\n modal.role = 'dialog';\n modal.classList.add('modal');\n modal.innerHTML = `\n