{"version":3,"file":"books-for-email.js","sources":["../../../w3t_front/components/books-for-email/decorators.js","../../../w3t_front/components/books-for-email/errors.js","../../../w3t_front/components/books-for-email/field.js","../../../w3t_front/components/books-for-email/getBooksModal.ts","../../../w3t_front/components/books-for-email/validate.js","../../../w3t_front/components/books-for-email/books-for-email.js"],"sourcesContent":["/**\n * @param {FormApi} form\n */\nexport function createLoadingDecorator(form) {\n return form.subscribe(\n ({ submitting }) => {\n const button = document.querySelector('.bfe-submit');\n const container = document.querySelector('.bfe-form');\n const input = document.getElementById('bfe-email');\n\n if (submitting) {\n button.disabled = true;\n input.disabled = true;\n container.classList.add('submitting');\n } else {\n button.disabled = false;\n input.disabled = false;\n container.classList.remove('submitting');\n }\n },\n {\n submitting: true,\n },\n );\n}\n","/**\n * @param {HTMLElement} field\n * @param {FieldState} fieldState\n */\nexport function fieldErrors(field, fieldState) {\n const { touched, error, submitError, dirtySinceLastSubmit } = fieldState;\n\n const fieldBlock = field.closest('.bfe__field');\n const errorTextElement = document.querySelector(`.bfe__field-error[for=\"${field.id}\"]`);\n\n if (touched && (error || submitError)) {\n fieldBlock.classList.add('error');\n\n if (field.type !== 'checkbox' && submitError) {\n if (dirtySinceLastSubmit) {\n errorTextElement.innerText = '';\n fieldBlock.classList.remove('error');\n } else {\n errorTextElement.innerText = submitError;\n }\n }\n\n if (field.type !== 'checkbox' && error) {\n errorTextElement.innerText = error;\n }\n } else {\n if (errorTextElement) {\n errorTextElement.innerText = '';\n }\n\n if (fieldBlock) fieldBlock.classList.remove('error');\n }\n}\n","/* eslint-disable no-restricted-globals */\nimport { position } from 'caret-pos';\n\nimport { fieldErrors } from './errors';\n\n/**\n * @param {HTMLElement} field\n * @param {FieldState} fieldState\n */\nexport function addFieldListeners(field, fieldState, form) {\n const { blur, change, focus } = fieldState;\n\n const blurHandler = e => blur(e);\n\n field.addEventListener('input', event => change(event.target.value));\n field.addEventListener('blur', blurHandler);\n field.addEventListener('focus', () => focus());\n}\n\nconst cacheFields = {};\n\n/**\n * Safari reactive input carret fix\n * @param {Function} update\n * @param {HTMLElement} field\n * @param {FieldState} fieldState\n */\nfunction updateWithCarretPosition(update, field, fieldState) {\n const ignoreFields = ['checkbox', 'select', 'select-one', 'hidden'];\n const { active } = fieldState;\n\n let carretPosition = NaN;\n\n if (ignoreFields.includes(field.type)) {\n update();\n return;\n }\n\n if (active) {\n carretPosition = position(field).pos;\n }\n\n update();\n\n if (active && !isNaN(carretPosition)) {\n position(field, carretPosition);\n }\n}\n\n/**\n * Render\n * @param {HTMLElement} field\n * @param {FormApi} form\n * @returns {Unregister} unregister\n */\nexport function registerField(field, form) {\n const { name } = field;\n\n return form.registerField(\n name,\n fieldState => {\n const { value } = fieldState;\n\n if (!cacheFields[field.name]) {\n cacheFields[field.name] = true;\n addFieldListeners(field, fieldState, form);\n }\n\n updateWithCarretPosition(\n () => {\n field.value = value === undefined ? '' : value;\n },\n field,\n fieldState,\n );\n\n fieldErrors(field, fieldState);\n },\n {\n active: true,\n value: true,\n error: true,\n touched: true,\n submitError: true,\n dirtySinceLastSubmit: true,\n },\n );\n}\n","/**\n * Markup for the about us modal\n * @returns string\n */\nexport default function getBooksModal() {\n return `\n
\n
\n \"Books\"\n
\n
\n
\n Check your mail\n
\n
\n \"Amazon\" e-books are yours now\n
\n
\n
\n Get your paper done by a pro writer\n
\n
\n \"techpro12\"\n \"qademiar-tpn\"\n \"nunziolin\"\n \"cathykathy\"\n
\n Find a writer
\n
\n
\n
\n `;\n}\n","import { emailRegExp, ERROR_EMAIL_EMPTY } from '../../constants';\n\nexport function validateForm(values) {\n const errors = {};\n\n if (!emailRegExp.test(values.email)) {\n errors.email = ERROR_EMAIL_EMPTY;\n }\n\n return errors;\n}\n","import { createForm, FORM_ERROR } from 'final-form';\n\nimport { apiClient, ApiError, genRecaptchaToken, getSettings } from '../../api';\nimport { toUrlEncoded } from '../../api/utils';\nimport { _apipe, _is, _when } from '../../utils';\nimport { createFocusDecorator } from '../../utils/decorators';\nimport { openModal } from '../modal/modal';\n\nimport { createLoadingDecorator } from './decorators';\nimport { registerField } from './field';\nimport getBooksModalContent from './getBooksModal';\nimport { validateForm } from './validate';\n\nimport './books-for-email.css';\n\n/**\n * @typedef BFEState\n */\n\nconst BFEState = {\n captcha_token: undefined,\n recaptcha_site_key: undefined,\n errors: {},\n};\n\nexport function getBooksByEmail(state) {\n const { email, captcha_token, errors } = state;\n return apiClient({\n path: '/widgets/tools/books-by-email',\n init: {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded;',\n },\n body: toUrlEncoded({\n email,\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]: true } }\n : { ...state, books_success: true };\n });\n}\n\nexport function formatErrors(state) {\n const { errors } = state;\n\n const errorsToFields = {\n invalid_email: 'email',\n error: 'email',\n incorrect_email: 'email',\n requests_flood_1: 'email',\n };\n\n const errorsTexts = {\n invalid_email: 'Please enter a valid email',\n error: 'This e-mail already exists in our database.',\n incorrect_email: 'Incorrect e-mail address.',\n requests_flood_1: 'Too many requests. Please try again in 5 minutes.',\n };\n\n const formError = Object.keys(errorsToFields).reduce(\n (acc, code) => (errors[code] ? code : acc),\n '',\n );\n\n const fieldsErrors = Object.keys(errors).reduce(\n (acc, code) =>\n errors[code]\n ? {\n ...acc,\n [errorsToFields[code]]: errorsTexts[code],\n }\n : acc,\n {},\n );\n\n return formError\n ? {\n [FORM_ERROR]: formError,\n ...fieldsErrors,\n }\n : undefined;\n}\n\nconst successMessage = document.querySelector('.bfe__message-success');\n\nconst handleSuccess = () => {\n const formContainer = document.querySelector('.bfe-form__container');\n successMessage.classList.add('visible');\n openModal({\n id: 'books-modal',\n content: getBooksModalContent(),\n contentClasses: 'bg-blue-900 max-w-[728px]',\n closeButtonClasses: 'text-white hover:text-slate-50',\n });\n\n formContainer.remove();\n};\n\n/**\n * @param {FormValues} formValues\n * @param {FormApi} form\n * @param {Function} callback\n */\nconst onSubmit = formValues =>\n _apipe(\n _when(_is('email'), genRecaptchaToken, 'genRecaptchaToken'),\n _when(_is('email'), getBooksByEmail, 'getBooksByEmail'),\n _when(_is('books_success'), handleSuccess),\n formatErrors,\n )({\n ...BFEState,\n ...formValues,\n recaptcha_action: 'POST/widgets/tool/books_by_email',\n });\n\nconst form = createForm({\n onSubmit,\n initialValues: {\n email: '',\n name: 'bfe',\n },\n validate: validateForm,\n});\n\ncreateLoadingDecorator(form);\ncreateFocusDecorator(form);\n\nform.subscribe(() => {}, {\n hasSubmitErrors: true,\n submitting: true,\n submitError: true,\n submitErrors: true,\n submitFailed: true,\n submitSucceeded: true,\n values: true,\n});\n\ndocument.querySelector('form[name=bfe]').addEventListener('submit', event => {\n event.preventDefault();\n form.submit();\n});\n\ndocument.addEventListener('DOMContentLoaded', () => {\n [document.querySelector('input.bfe__input[name=email]')].forEach(htmlElement => {\n if (htmlElement.name) {\n registerField(htmlElement, form);\n }\n });\n});\n\ngetSettings().then(response => {\n BFEState.recaptcha_site_key = response.body.env.recaptcha_site_key;\n});\n"],"names":["createLoadingDecorator","form","submitting","button","container","input","fieldErrors","field","fieldState","touched","error","submitError","dirtySinceLastSubmit","fieldBlock","errorTextElement","addFieldListeners","blur","change","focus","blurHandler","e","event","cacheFields","updateWithCarretPosition","update","ignoreFields","active","carretPosition","position","registerField","name","value","getBooksModal","validateForm","values","errors","emailRegExp","ERROR_EMAIL_EMPTY","BFEState","getBooksByEmail","state","email","captcha_token","apiClient","toUrlEncoded","response","ApiError","formatErrors","errorsToFields","errorsTexts","formError","acc","code","fieldsErrors","FORM_ERROR","successMessage","handleSuccess","formContainer","openModal","getBooksModalContent","onSubmit","formValues","_apipe","_when","_is","genRecaptchaToken","createForm","createFocusDecorator","htmlElement","getSettings"],"mappings":"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"}