{"version":3,"file":"membership-login-min.js","mappings":"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","sources":["webpack://waves/webpack/bootstrap","webpack://waves/webpack/runtime/compat get default export","webpack://waves/webpack/runtime/define property getters","webpack://waves/webpack/runtime/hasOwnProperty shorthand","webpack://waves/external var \"React\"","webpack://waves/./src/DAL/data-provider.ts","webpack://waves/./src/projects/products/enums/product-department-enum.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/last-payment-option-enum.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/payment-tabs-enum.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/credit-card-service-enum.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/credit-card-tab.ts","webpack://waves/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://waves/./src/domain/validation/validation.ts","webpack://waves/./src/domain/math-provider.ts","webpack://waves/./node_modules/jwt-decode/build/jwt-decode.esm.js","webpack://waves/./src/DAL/storage-provider.ts","webpack://waves/./node_modules/date-fns/esm/_lib/requiredArgs/index.js","webpack://waves/./node_modules/date-fns/esm/toDate/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/getTimezoneOffsetInMilliseconds/index.js","webpack://waves/./node_modules/date-fns/esm/startOfDay/index.js","webpack://waves/./node_modules/date-fns/esm/differenceInDays/index.js","webpack://waves/./src/domain/marketing/utm/utm-provider.ts","webpack://waves/./node_modules/date-fns/esm/differenceInCalendarDays/index.js","webpack://waves/./src/projects/membership/enums/external-service-enum.ts","webpack://waves/./src/domain/common.ts","webpack://waves/./src/domain/hidden-data-provider.ts","webpack://waves/./node_modules/date-fns/esm/locale/en-US/_lib/formatDistance/index.js","webpack://waves/./node_modules/date-fns/esm/locale/_lib/buildFormatLongFn/index.js","webpack://waves/./node_modules/date-fns/esm/locale/en-US/_lib/formatLong/index.js","webpack://waves/./node_modules/date-fns/esm/locale/_lib/buildMatchPatternFn/index.js","webpack://waves/./node_modules/date-fns/esm/locale/en-US/_lib/formatRelative/index.js","webpack://waves/./node_modules/date-fns/esm/locale/_lib/buildLocalizeFn/index.js","webpack://waves/./node_modules/date-fns/esm/locale/_lib/buildMatchFn/index.js","webpack://waves/./node_modules/date-fns/esm/locale/en-US/index.js","webpack://waves/./node_modules/date-fns/esm/locale/en-US/_lib/localize/index.js","webpack://waves/./node_modules/date-fns/esm/locale/en-US/_lib/match/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/toInteger/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/startOfUTCISOWeek/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/getUTCISOWeekYear/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/startOfUTCWeek/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/getUTCWeekYear/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/addLeadingZeros/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/format/lightFormatters/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/format/formatters/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/getUTCWeek/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/startOfUTCWeekYear/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/getUTCISOWeek/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/startOfUTCISOWeekYear/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/getUTCDayOfYear/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/format/longFormatters/index.js","webpack://waves/./node_modules/date-fns/esm/_lib/protectedTokens/index.js","webpack://waves/./node_modules/date-fns/esm/format/index.js","webpack://waves/./node_modules/date-fns/esm/isValid/index.js","webpack://waves/./node_modules/date-fns/esm/isDate/index.js","webpack://waves/./node_modules/date-fns/esm/subMilliseconds/index.js","webpack://waves/./node_modules/date-fns/esm/addMilliseconds/index.js","webpack://waves/./src/projects/gdpr/domain/gdpr-provider.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/cart-steps.ts","webpack://waves/./src/domain/marketing/gtm-provider.ts","webpack://waves/./src/domain/marketing/marketing-provider.ts","webpack://waves/./src/domain/marketing/adwords-provider.ts","webpack://waves/./src/domain/marketing/tiktok-provider.ts","webpack://waves/./src/domain/marketing/outbrain-provider.ts","webpack://waves/./src/domain/marketing/impact-radius-provider.ts","webpack://waves/./src/domain/google/google-login-provider.ts","webpack://waves/./src/domain/facebook/facebook-types.ts","webpack://waves/./src/domain/facebook/facebook-login-provider.ts","webpack://waves/./src/projects/membership/dal/data-provider.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/domain/shopping-cart-provider.ts","webpack://waves/./src/domain/validation/server-errors/validation-errors.tsx","webpack://waves/./src/ui/svg/common/refresh.tsx","webpack://waves/./src/domain/captcha/simple-captcha.tsx","webpack://waves/./src/domain/captcha/recaptcha-provider.ts","webpack://waves/./src/domain/captcha/recaptcha3-terms.tsx","webpack://waves/./src/ui/svg/common/waves-logo.tsx","webpack://waves/./src/ui/svg/common/preloader.tsx","webpack://waves/./src/projects/membership/logout/logout-screen.tsx","webpack://waves/./src/projects/membership/purchased-products/user-purchased-products.ts","webpack://waves/./src/ui/svg/common/eye.tsx","webpack://waves/./src/ui/svg/svg-provider.ts","webpack://waves/./src/ui/forms/fields/text-field.tsx","webpack://waves/./src/ui/forms/fields/checkbox-field.tsx","webpack://waves/./src/ui/forms/fields/captcha-china-field.tsx","webpack://waves/./src/ui/forms/form-title.tsx","webpack://waves/./src/ui/forms/form-logo.tsx","webpack://waves/./src/ui/forms/form-terms.tsx","webpack://waves/./src/ui/forms/form-border.tsx","webpack://waves/./src/ui/forms/form-preloader.tsx","webpack://waves/./src/projects/recently-viewed-products/data/data-service.tsx","webpack://waves/./src/ui/forms/text-above-line.tsx","webpack://waves/./src/ui/svg/common/social-icons/facebook.tsx","webpack://waves/./src/domain/external-login/external-login-types.ts","webpack://waves/./src/domain/waves-apps/browser-detection.ts","webpack://waves/./src/projects/membership/login/external-login/external-login.tsx","webpack://waves/./src/domain/animations/animations-provider.ts","webpack://waves/./src/projects/membership/login/standard-login/login.tsx","webpack://waves/external var \"ReactDOM\"","webpack://waves/./src/domain/url-provider.ts","webpack://waves/./src/projects/membership/login/waves-app-login/waves-apps-provider.ts","webpack://waves/./src/projects/membership/login/waves-app-login/logged-in.tsx","webpack://waves/./src/projects/membership/login/waves-app-login/login.tsx","webpack://waves/./src/projects/membership/login/index.tsx"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","const __WEBPACK_NAMESPACE_OBJECT__ = React;","import { IResponse } from '../interfaces/common-interfaces';\r\n\r\nexport const DEFAULT_ERROR = 'An error has occurred.';\r\n\r\n/**\r\n * encode and format the data\r\n */\r\nexport const encodeData = (data: any) => {\r\n\r\n const params = [];\r\n\r\n for(let key in data) {\r\n if (data.hasOwnProperty(key)) {\r\n params.push(key + '=' + window.encodeURIComponent(data[key]));\r\n }\r\n }\r\n\r\n return params.join('&');\r\n};\r\n\r\n/**\r\n * Returns true if access is denied.\r\n */\r\nconst ifShouldDenyOnReadOnly = async (response: Response|null) => {\r\n if(response?.status !== 999) return false;\r\n window.location.href = '/maintenance';\r\n\r\n /*\r\n let isLoggedIn = false;\r\n\r\n try{\r\n // {\"message\":\"Waves.com is undergoing maintenance.\",\"isLoggedIn\":false}\r\n const text = await response.text();\r\n const parsed = JSON.parse(text);\r\n isLoggedIn = parsed.isLoggedIn;\r\n if(isLoggedIn){\r\n window.location.href = '/maintenance';\r\n }\r\n }\r\n catch(ex){\r\n console.log(ex);\r\n }*/\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * get request\r\n */\r\nexport const get = async (url: string, data: any = null) : Promise => {\r\n\r\n if(data){\r\n\r\n const qs = encodeData(data);\r\n url += `?${qs}`;\r\n }\r\n\r\n const headers = new Headers();\r\n headers.append('pragma', 'no-cache');\r\n headers.append('cache-control', 'no-cache');\r\n headers.append('Content-Type', 'application/json');\r\n\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n credentials: 'same-origin' //'include', 'omit'\r\n });\r\n\r\n if(await ifShouldDenyOnReadOnly(response)){\r\n throw new Error('Waves.com is undergoing maintenance.');\r\n }\r\n\r\n return {\r\n data: await response.json(),\r\n statusCode: response.status\r\n }\r\n};\r\n\r\n/**\r\n * post request\r\n */\r\nexport const post = async (url: string, data: any) : Promise => {\r\n\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(data)\r\n });\r\n\r\n if(await ifShouldDenyOnReadOnly(response)){\r\n throw new Error('Waves.com is undergoing maintenance.');\r\n }\r\n\r\n return {\r\n data: await response.json(),\r\n statusCode: response.status\r\n }\r\n};\r\n\r\nexport const del = async (url: string, data: any) : Promise => {\r\n\r\n const response = await fetch(url, {\r\n method: 'DELETE',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(data)\r\n });\r\n\r\n if(await ifShouldDenyOnReadOnly(response)){\r\n throw new Error('Waves.com is undergoing maintenance.');\r\n }\r\n\r\n return {\r\n data: await response.json(),\r\n statusCode: response.status\r\n }\r\n};\r\n\r\nexport const put = async (url: string, data: any) : Promise => {\r\n\r\n const response = await fetch(url, {\r\n method: 'PUT',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(data)\r\n });\r\n\r\n if(await ifShouldDenyOnReadOnly(response)){\r\n throw new Error('Waves.com is undergoing maintenance.');\r\n }\r\n\r\n return {\r\n data: await response.json(),\r\n statusCode: response.status\r\n }\r\n};\r\n\r\n/**\r\n * upload file\r\n */\r\nexport const upload = async (url: string, data: FormData, headers?: any) => {\r\n\r\n let response: Response | null = null;\r\n const config: RequestInit = {\r\n method: 'POST',\r\n body: data\r\n };\r\n\r\n if(headers){\r\n config.headers = headers;\r\n }\r\n\r\n try{\r\n response = await fetch(url, config);\r\n }\r\n catch(ex){\r\n console.log('Error:', ex);\r\n }\r\n\r\n if(await ifShouldDenyOnReadOnly(response)){\r\n throw new Error('Waves.com is undergoing maintenance.');\r\n }\r\n\r\n return {\r\n data: await response?.json(),\r\n statusCode: response?.status\r\n }\r\n};\r\n\r\nexport const download = (fileName: string, blob: Blob) => {\r\n const url = window.URL.createObjectURL(blob);\r\n const $a = document.createElement('a');\r\n $a.style.display = 'none';\r\n $a.href = url;\r\n // the filename you want\r\n $a.download = fileName;\r\n document.body.appendChild($a);\r\n $a.click();\r\n window.URL.revokeObjectURL(url);\r\n};\r\n\r\nexport const getDownload = async (fileName: string, url: string, data: any = null) => {\r\n\r\n if(data){\r\n\r\n const qs = encodeData(data);\r\n url += `?${qs}`;\r\n }\r\n\r\n const headers = new Headers();\r\n headers.append('pragma', 'no-cache');\r\n headers.append('cache-control', 'no-cache');\r\n headers.append('Content-Type', 'application/json');\r\n\r\n const response = await fetch(url, {\r\n method: 'GET',\r\n headers,\r\n credentials: 'same-origin' //'include', 'omit'\r\n });\r\n\r\n if(await ifShouldDenyOnReadOnly(response)){\r\n throw new Error('Waves.com is undergoing maintenance.');\r\n }\r\n\r\n const blob = await response.blob();\r\n download(fileName, blob);\r\n};\r\n\r\nexport const postDownload = async (fileName: string, url: string, data: any = null) => {\r\n\r\n const response = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(data)\r\n });\r\n\r\n if(await ifShouldDenyOnReadOnly(response)){\r\n throw new Error('Waves.com is undergoing maintenance.');\r\n }\r\n\r\n const blob = await response.blob();\r\n download(fileName, blob);\r\n};\r\n\r\n\r\n","export enum ProductDepartmentEnum {\r\n Bundles = 1,\r\n Plugins = 2,\r\n General = 5,\r\n Books = 6,\r\n InactiveItems = 7,\r\n LiveSound = 8,\r\n Hardware = 9,\r\n Software = 10,\r\n Subscription = 12,\r\n Consumer = 13,\r\n RentToOwnDynamic = 14,\r\n RentToOwnStatic = 15,\r\n Merch = 16,\r\n WavesUpdatePlan = 17,\r\n Upgrades = 18,\r\n Courses = 19,\r\n SubscriptionDynamic = 20,\r\n Gifts = 21,\r\n CoursesWithSoftware = 22,\r\n SubscriptionNonRecurring = 23,\r\n Mastering = 24,\r\n}","/**\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-3278\r\n * ap = alipay, pp = paypal, cc = credit card, null = no previous purchase\r\n */\r\nexport enum LastPaymentOption {\r\n NONE = '',\r\n CreditCard = 'cc',\r\n PayPal = 'pp',\r\n AliPay = 'ap',\r\n}","export enum PaymentTabsEnum {\r\n CreditCard = 1,\r\n PayPal = 2,\r\n AliPay = 3,\r\n}","export enum CreditCardServiceEnum {\r\n None = 0,\r\n FirstData = 1,\r\n Pinnacle = 2,\r\n Stripe = 3\r\n}","export enum CreditCardTabTabsEnum {\r\n NewCreditCard = 1,\r\n SavedCreditCards = 2,\r\n}","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","import { IValidationRules } from './interfaces';\r\nimport { ClipboardEvent, Dispatch } from 'react';\r\nimport { IFormControl } from '../../ui/forms/interfaces';\r\nimport { getDecimalPlaces, isNumber } from '../math-provider';\r\n\r\n/**\r\n * Validation\r\n * ----------\r\n const userNameControl = createControl('userName', '', {\r\n required: true // required also can be a function\r\n requiredMessage: '...', // optional\r\n\r\n regex: string,\r\n regexMessage: '...', // optional\r\n\r\n email: true,\r\n emailMessage: '...', // optional\r\n\r\n name: true,\r\n nameMessage: '...', // optional\r\n\r\n password: true,\r\n passwordMessage: '...', // optional\r\n\r\n minlength: number, // minlength also can be a function\r\n minlengthMessage: '...', // optional\r\n\r\n maxlength: number, // maxlength also can be a function\r\n maxlengthMessage: '...', // optional\r\n\r\n minValue: number,\r\n minValueMessage: '...', // optional\r\n\r\n maxValue: number,\r\n maxValueMessage: '...', // optional\r\n\r\n length: number,\r\n lengthMessage: '...', // optional\r\n\r\n phone: true,\r\n phoneMessage: '...', // optional\r\n\r\n int: true,\r\n intMessage: '...', // optional\r\n\r\n number: true,\r\n numberMessage: '...', // optional\r\n\r\n general: (control) => false,\r\n generalMessage: '...',\r\n\r\n decimalPlaces: 2,\r\n decimalPlacesMessage: '...', // optional\r\n });\r\n const [userName, setUserName] = useState(userNameControl);\r\n */\r\n\r\nconst defaultMessages = {\r\n requiredMessage: 'This field is required.',\r\n regexMessage: 'This field is wrong.',\r\n emailMessage: 'Please enter a valid email address. Use letters (a-z), numbers, and the following characters: + - _ @ . only',\r\n nameMessage: 'Please use letters (a-z), numbers, spaces, and the following characters: - _ . ,\\' / # \" only.',\r\n passwordMessage: 'Please enter a mix of at least 8 characters, including at least one of each group: a-z, A-Z, 0-9, special characters (e.g. ! @ #).',\r\n minlengthMessage: 'Please enter at least $1 character$2.',\r\n maxlengthMessage: 'Please enter at most $1 character$2.',\r\n lengthMessage: 'Please enter $1 character$2.',\r\n phoneMessage: 'Invalid phone number.',\r\n intMessage: 'Please enter a valid number.',\r\n dateMessage: 'Please enter a valid date.',\r\n numberMessage: 'Please enter a valid number.',\r\n generalMessage: 'An error has occurred.',\r\n atLeastOneDigitMessage: 'At least one letter or digit is required.',\r\n handleMessage: 'Please use letters letters (a-z), numbers, and the following characters: - _ . only.',\r\n decimalPlacesMessage: 'Number of decimal places should be no more than $1.',\r\n maxValueMessage: 'The maximum value cannot exceed $1',\r\n minValueMessage: 'The minimum value cannot be less than $1',\r\n};\r\n\r\nexport const emailRegex = '^([a-zA-Z0-9_\\\\.\\\\-\\\\+]+)@([a-zA-Z0-9_\\\\-\\\\+\\\\.]+)((\\\\.([a-zA-Z0-9_\\\\-\\\\+]){2,20})+)$';\r\n\r\n/**\r\n * create form control\r\n */\r\nexport const createControl = (id: string, initialValue: any, rules: IValidationRules) : IFormControl => {\r\n return {\r\n id,\r\n value: initialValue,\r\n touched: false,\r\n isValid: true,\r\n error: '',\r\n rules: rules || []\r\n }\r\n};\r\n\r\n/**\r\n * validate form control\r\n */\r\nexport const validateControl = (control: IFormControl) : IFormControl => {\r\n\r\n const updatedControl : IFormControl = {\r\n ...control,\r\n isValid: true,\r\n error: '',\r\n };\r\n \r\n const rules = control.rules;\r\n\r\n // required ---------------------\r\n if(updatedControl.isValid && rules.required){\r\n if(typeof rules.required === 'function'){\r\n updatedControl.isValid = updatedControl.isValid && rules.required(updatedControl);\r\n }\r\n else{\r\n const _value = (typeof updatedControl.value === 'string') ? (updatedControl.value || '').trim() : updatedControl.value;\r\n updatedControl.isValid = updatedControl.isValid && !!_value;\r\n }\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.requiredMessage || defaultMessages.requiredMessage;\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // handle ---------------------\r\n if(updatedControl.isValid && rules.handle){\r\n\r\n const handleRegex = '^[a-zA-Z0-9-_\\\\.]+$';\r\n const re = new RegExp(handleRegex);\r\n\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.toString().trim() === '' || re.test(updatedControl.value));\r\n\r\n if(!updatedControl.isValid){\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.handleMessage || defaultMessages.handleMessage;\r\n return updatedControl;\r\n }\r\n\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // minlength -------------------------\r\n if(updatedControl.isValid && rules.minlength){\r\n\r\n const minlength = typeof rules.minlength === 'function' ? rules.minlength() : rules.minlength;\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.length <= 0 || updatedControl.value.length >= minlength);\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.minlengthMessage || defaultMessages.minlengthMessage;\r\n updatedControl.error = updatedControl.error.replace('$1', minlength.toString());\r\n updatedControl.error = updatedControl.error.replace('$2', minlength === 1 ? '' : 's');\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // maxlength ---------------------\r\n if(updatedControl.isValid && rules.maxlength){\r\n\r\n const maxlength = typeof rules.maxlength === 'function' ? rules.maxlength() : rules.maxlength;\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.length <= maxlength);\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.maxlengthMessage || defaultMessages.maxlengthMessage;\r\n updatedControl.error = updatedControl.error.replace('$1', maxlength.toString());\r\n updatedControl.error = updatedControl.error.replace('$2', maxlength === 1 ? '' : 's');\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // length ---------------------\r\n if(updatedControl.isValid && rules.length){\r\n\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.length === rules.length);\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.lengthMessage || defaultMessages.lengthMessage;\r\n updatedControl.error = updatedControl.error.replace('$1', rules.length.toString());\r\n updatedControl.error = updatedControl.error.replace('$2', rules.length === 1 ? '' : 's');\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // decimalPlaces ---------------------\r\n if(updatedControl.isValid && rules.decimalPlaces !== undefined && Number.isInteger(rules.decimalPlaces)){\r\n\r\n updatedControl.isValid = updatedControl.isValid && (getDecimalPlaces(Number(updatedControl.value)) <= rules.decimalPlaces);\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.decimalPlacesMessage || defaultMessages.decimalPlacesMessage;\r\n updatedControl.error = updatedControl.error.replace('$1', rules.decimalPlaces.toString());\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // email ---------------------\r\n if(updatedControl.isValid && rules.email){\r\n const re = new RegExp(emailRegex);\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.trim() === '' || re.test(updatedControl.value));\r\n\r\n if(updatedControl.isValid){\r\n updatedControl.isValid = updatedControl.value.indexOf('..') === -1;\r\n }\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.emailMessage || defaultMessages.emailMessage;\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // name ---------------------\r\n if(updatedControl.isValid && rules.name){\r\n\r\n const nameRegex = '^[a-zA-Z0-9-_\\\\.\\\\,\\\\/#\\'\\\\\" ]+$';\r\n const re = new RegExp(nameRegex);\r\n\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.trim() === '' || re.test(updatedControl.value));\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.nameMessage || defaultMessages.nameMessage;\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // password ---------------------\r\n if(updatedControl.isValid && rules.password){\r\n\r\n let isValid = true;\r\n\r\n if(updatedControl.value.length < 8){\r\n isValid = false;\r\n }\r\n else{\r\n const regexes = [/[0-9]+/, /[a-z]+/, /[A-Z]+/, /[^A-Za-z0-9]+/];\r\n\r\n for (let r = 0; r < regexes.length; r++){\r\n\r\n if ((updatedControl.value.match(regexes[r]) || []).length <= 0){\r\n isValid = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.trim() === '' || isValid);\r\n\r\n if(!updatedControl.isValid){\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.passwordMessage || defaultMessages.passwordMessage;\r\n return updatedControl;\r\n }\r\n\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // regex ---------------------\r\n if(updatedControl.isValid && rules.regex){\r\n\r\n const re = new RegExp(rules.regex);\r\n\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.trim() === '' || re.test(updatedControl.value));\r\n\r\n if(!updatedControl.isValid){\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.regexMessage || defaultMessages.regexMessage;\r\n return updatedControl;\r\n }\r\n\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // phone ---------------------\r\n if(updatedControl.isValid && rules.phone){\r\n\r\n const intRegex = /^[0-9]{5,12}$/;\r\n const onlyZerosRegex = /^0+$/;\r\n\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.toString().trim() === '' || (intRegex.test(updatedControl.value) && !onlyZerosRegex.test(updatedControl.value)));\r\n\r\n if(!updatedControl.isValid){\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.phoneMessage || defaultMessages.phoneMessage;\r\n return updatedControl;\r\n }\r\n\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // number ---------------------\r\n if(updatedControl.isValid && rules.number){\r\n\r\n const isNumeric = !isNaN(parseFloat(updatedControl.value)) && isFinite(updatedControl.value);\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.toString().trim() === '' || isNumeric);\r\n\r\n if(!updatedControl.isValid){\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.numberMessage || defaultMessages.numberMessage;\r\n return updatedControl;\r\n }\r\n\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // int ---------------------\r\n if(updatedControl.isValid && rules.int){\r\n\r\n const intRegex = '^[0-9]+$';\r\n const re = new RegExp(intRegex);\r\n\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.toString().trim() === '' || re.test(updatedControl.value));\r\n\r\n if(!updatedControl.isValid){\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.intMessage || defaultMessages.intMessage;\r\n return updatedControl;\r\n }\r\n\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // minDate - min date value ---------------------\r\n if(updatedControl.isValid && rules.minDate){\r\n //if the field is required and the filed is empty or null --> valid\r\n const validEmpty = (updatedControl.value === null || updatedControl.value.length === 0) && !rules.required;\r\n\r\n if(validEmpty){\r\n updatedControl.isValid = true;\r\n }else{\r\n const min = new Date(rules.minDate);\r\n updatedControl.isValid = min < new Date(updatedControl.value);\r\n }\r\n\r\n if(!updatedControl.isValid){\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.minDateMessage || defaultMessages.dateMessage;\r\n return updatedControl;\r\n }\r\n\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // maxDate - max date value ---------------------\r\n if(updatedControl.isValid && rules.maxDate){\r\n //if the field is required and the filed is empty or null --> valid\r\n const validEmpty = (updatedControl.value === null || updatedControl.value.length === 0) && !rules.required;\r\n\r\n if(validEmpty){\r\n updatedControl.isValid = true;\r\n }else{\r\n const max = new Date(rules.maxDate);\r\n updatedControl.isValid = max > new Date(updatedControl.value);\r\n }\r\n\r\n\r\n if(!updatedControl.isValid){\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.maxDateMessage || defaultMessages.dateMessage;\r\n return updatedControl;\r\n }\r\n\r\n return updatedControl;\r\n }\r\n }\r\n\r\n\r\n // maxValue ---------------------\r\n if(updatedControl.isValid && rules.maxValue){\r\n\r\n const maxValue = typeof rules.maxValue === 'function' ? rules.maxValue() : rules.maxValue;\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value <= maxValue);\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.maxValueMessage || defaultMessages.maxValueMessage;\r\n updatedControl.error = updatedControl.error.replace('$1', maxValue.toString());\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // minValue ---------------------\r\n if(updatedControl.isValid && isNumber(rules.minValue)){\r\n\r\n const minValue = typeof rules.minValue === 'function' ? rules.minValue() : (rules.minValue ?? 0);\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value >= minValue);\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.minValueMessage || defaultMessages.minValueMessage;\r\n updatedControl.error = updatedControl.error.replace('$1', minValue.toString());\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // general ---------------------\r\n if(updatedControl.isValid && rules.general){\r\n\r\n if(typeof rules.general === 'function'){\r\n updatedControl.isValid = updatedControl.isValid && rules.general(updatedControl);\r\n }\r\n\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.generalMessage || defaultMessages.generalMessage;\r\n return updatedControl;\r\n }\r\n }\r\n\r\n // atLeastOneDigit ---------------------\r\n if(updatedControl.isValid && rules.atLeastOneDigit){\r\n\r\n const atLeastOneDigitRegex = '.*[A-Za-z0-9].*';\r\n const re = new RegExp(atLeastOneDigitRegex);\r\n\r\n updatedControl.isValid = updatedControl.isValid && (updatedControl.value.toString().trim() === '' || re.test(updatedControl.value));\r\n\r\n if(!updatedControl.isValid){\r\n if(!updatedControl.isValid){\r\n updatedControl.error = rules.atLeastOneDigitMessage || defaultMessages.atLeastOneDigitMessage;\r\n return updatedControl;\r\n }\r\n\r\n return updatedControl;\r\n }\r\n }\r\n\r\n return updatedControl;\r\n};\r\n\r\n/**\r\n * validate form\r\n */\r\nexport const validateForm = (params: ([IFormControl, Dispatch])[], errorControlsListHolder: IFormControl[] = []) => {\r\n\r\n let isValid = true;\r\n\r\n for(let i=0; i= 2){\r\n const setControl = param[1] as Dispatch;\r\n if(typeof setControl === 'function'){\r\n setControl(control);\r\n }\r\n }\r\n\r\n if(!control.isValid){\r\n // console.log('Non valid control', control)\r\n isValid = false;\r\n errorControlsListHolder.push(control);\r\n }\r\n }\r\n\r\n return isValid;\r\n};\r\n\r\n/**\r\n * update form control\r\n */\r\nexport const updateControl = (control: IFormControl, updatedValue: any, validate = false, reset = false) : IFormControl => {\r\n\r\n let updatedControl: IFormControl = {\r\n ...control,\r\n touched: true,\r\n value: updatedValue\r\n };\r\n\r\n if(reset) {\r\n updatedControl.touched = false;\r\n updatedControl.isValid = true;\r\n updatedControl.error = '';\r\n }\r\n\r\n if(validate) {\r\n // perform control validation, update the relevant properties\r\n updatedControl = validateControl(updatedControl);\r\n }\r\n\r\n return updatedControl;\r\n};\r\n\r\n/**\r\n * scroll to the first error\r\n */\r\nexport const scrollToFirstErrorControl = (errorControls: IFormControl[]) => {\r\n\r\n if(!errorControls || errorControls.length <= 0) return;\r\n\r\n const firstErrorControl = errorControls[0];\r\n const $control = document.getElementById(firstErrorControl.id);\r\n\r\n if(!$control) return;\r\n\r\n $control.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'center',\r\n inline: 'nearest'\r\n });\r\n\r\n $control.focus();\r\n};\r\n\r\n// eslint-disable-next-line\r\nconst invisibleCharactersRegex = /[\\0-\\x09\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x9F\\xAD\\u0378\\u0379\\u037F-\\u0383\\u038B\\u038D\\u03A2\\u0528-\\u0530\\u0557\\u0558\\u0560\\u0588\\u058B-\\u058E\\u0590\\u05C8-\\u05CF\\u05EB-\\u05EF\\u05F5-\\u0605\\u061C\\u061D\\u06DD\\u070E\\u070F\\u074B\\u074C\\u07B2-\\u07BF\\u07FB-\\u07FF\\u082E\\u082F\\u083F\\u085C\\u085D\\u085F-\\u089F\\u08A1\\u08AD-\\u08E3\\u08FF\\u0978\\u0980\\u0984\\u098D\\u098E\\u0991\\u0992\\u09A9\\u09B1\\u09B3-\\u09B5\\u09BA\\u09BB\\u09C5\\u09C6\\u09C9\\u09CA\\u09CF-\\u09D6\\u09D8-\\u09DB\\u09DE\\u09E4\\u09E5\\u09FC-\\u0A00\\u0A04\\u0A0B-\\u0A0E\\u0A11\\u0A12\\u0A29\\u0A31\\u0A34\\u0A37\\u0A3A\\u0A3B\\u0A3D\\u0A43-\\u0A46\\u0A49\\u0A4A\\u0A4E-\\u0A50\\u0A52-\\u0A58\\u0A5D\\u0A5F-\\u0A65\\u0A76-\\u0A80\\u0A84\\u0A8E\\u0A92\\u0AA9\\u0AB1\\u0AB4\\u0ABA\\u0ABB\\u0AC6\\u0ACA\\u0ACE\\u0ACF\\u0AD1-\\u0ADF\\u0AE4\\u0AE5\\u0AF2-\\u0B00\\u0B04\\u0B0D\\u0B0E\\u0B11\\u0B12\\u0B29\\u0B31\\u0B34\\u0B3A\\u0B3B\\u0B45\\u0B46\\u0B49\\u0B4A\\u0B4E-\\u0B55\\u0B58-\\u0B5B\\u0B5E\\u0B64\\u0B65\\u0B78-\\u0B81\\u0B84\\u0B8B-\\u0B8D\\u0B91\\u0B96-\\u0B98\\u0B9B\\u0B9D\\u0BA0-\\u0BA2\\u0BA5-\\u0BA7\\u0BAB-\\u0BAD\\u0BBA-\\u0BBD\\u0BC3-\\u0BC5\\u0BC9\\u0BCE\\u0BCF\\u0BD1-\\u0BD6\\u0BD8-\\u0BE5\\u0BFB-\\u0C00\\u0C04\\u0C0D\\u0C11\\u0C29\\u0C34\\u0C3A-\\u0C3C\\u0C45\\u0C49\\u0C4E-\\u0C54\\u0C57\\u0C5A-\\u0C5F\\u0C64\\u0C65\\u0C70-\\u0C77\\u0C80\\u0C81\\u0C84\\u0C8D\\u0C91\\u0CA9\\u0CB4\\u0CBA\\u0CBB\\u0CC5\\u0CC9\\u0CCE-\\u0CD4\\u0CD7-\\u0CDD\\u0CDF\\u0CE4\\u0CE5\\u0CF0\\u0CF3-\\u0D01\\u0D04\\u0D0D\\u0D11\\u0D3B\\u0D3C\\u0D45\\u0D49\\u0D4F-\\u0D56\\u0D58-\\u0D5F\\u0D64\\u0D65\\u0D76-\\u0D78\\u0D80\\u0D81\\u0D84\\u0D97-\\u0D99\\u0DB2\\u0DBC\\u0DBE\\u0DBF\\u0DC7-\\u0DC9\\u0DCB-\\u0DCE\\u0DD5\\u0DD7\\u0DE0-\\u0DF1\\u0DF5-\\u0E00\\u0E3B-\\u0E3E\\u0E5C-\\u0E80\\u0E83\\u0E85\\u0E86\\u0E89\\u0E8B\\u0E8C\\u0E8E-\\u0E93\\u0E98\\u0EA0\\u0EA4\\u0EA6\\u0EA8\\u0EA9\\u0EAC\\u0EBA\\u0EBE\\u0EBF\\u0EC5\\u0EC7\\u0ECE\\u0ECF\\u0EDA\\u0EDB\\u0EE0-\\u0EFF\\u0F48\\u0F6D-\\u0F70\\u0F98\\u0FBD\\u0FCD\\u0FDB-\\u0FFF\\u10C6\\u10C8-\\u10CC\\u10CE\\u10CF\\u1249\\u124E\\u124F\\u1257\\u1259\\u125E\\u125F\\u1289\\u128E\\u128F\\u12B1\\u12B6\\u12B7\\u12BF\\u12C1\\u12C6\\u12C7\\u12D7\\u1311\\u1316\\u1317\\u135B\\u135C\\u137D-\\u137F\\u139A-\\u139F\\u13F5-\\u13FF\\u169D-\\u169F\\u16F1-\\u16FF\\u170D\\u1715-\\u171F\\u1737-\\u173F\\u1754-\\u175F\\u176D\\u1771\\u1774-\\u177F\\u17DE\\u17DF\\u17EA-\\u17EF\\u17FA-\\u17FF\\u180F\\u181A-\\u181F\\u1878-\\u187F\\u18AB-\\u18AF\\u18F6-\\u18FF\\u191D-\\u191F\\u192C-\\u192F\\u193C-\\u193F\\u1941-\\u1943\\u196E\\u196F\\u1975-\\u197F\\u19AC-\\u19AF\\u19CA-\\u19CF\\u19DB-\\u19DD\\u1A1C\\u1A1D\\u1A5F\\u1A7D\\u1A7E\\u1A8A-\\u1A8F\\u1A9A-\\u1A9F\\u1AAE-\\u1AFF\\u1B4C-\\u1B4F\\u1B7D-\\u1B7F\\u1BF4-\\u1BFB\\u1C38-\\u1C3A\\u1C4A-\\u1C4C\\u1C80-\\u1CBF\\u1CC8-\\u1CCF\\u1CF7-\\u1CFF\\u1DE7-\\u1DFB\\u1F16\\u1F17\\u1F1E\\u1F1F\\u1F46\\u1F47\\u1F4E\\u1F4F\\u1F58\\u1F5A\\u1F5C\\u1F5E\\u1F7E\\u1F7F\\u1FB5\\u1FC5\\u1FD4\\u1FD5\\u1FDC\\u1FF0\\u1FF1\\u1FF5\\u1FFF\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u206F\\u2072\\u2073\\u208F\\u209D-\\u209F\\u20BB-\\u20CF\\u20F1-\\u20FF\\u218A-\\u218F\\u23F4-\\u23FF\\u2427-\\u243F\\u244B-\\u245F\\u2700\\u2B4D-\\u2B4F\\u2B5A-\\u2BFF\\u2C2F\\u2C5F\\u2CF4-\\u2CF8\\u2D26\\u2D28-\\u2D2C\\u2D2E\\u2D2F\\u2D68-\\u2D6E\\u2D71-\\u2D7E\\u2D97-\\u2D9F\\u2DA7\\u2DAF\\u2DB7\\u2DBF\\u2DC7\\u2DCF\\u2DD7\\u2DDF\\u2E3C-\\u2E7F\\u2E9A\\u2EF4-\\u2EFF\\u2FD6-\\u2FEF\\u2FFC-\\u2FFF\\u3040\\u3097\\u3098\\u3100-\\u3104\\u312E-\\u3130\\u318F\\u31BB-\\u31BF\\u31E4-\\u31EF\\u321F\\u32FF\\u4DB6-\\u4DBF\\u9FCD-\\u9FFF\\uA48D-\\uA48F\\uA4C7-\\uA4CF\\uA62C-\\uA63F\\uA698-\\uA69E\\uA6F8-\\uA6FF\\uA78F\\uA794-\\uA79F\\uA7AB-\\uA7F7\\uA82C-\\uA82F\\uA83A-\\uA83F\\uA878-\\uA87F\\uA8C5-\\uA8CD\\uA8DA-\\uA8DF\\uA8FC-\\uA8FF\\uA954-\\uA95E\\uA97D-\\uA97F\\uA9CE\\uA9DA-\\uA9DD\\uA9E0-\\uA9FF\\uAA37-\\uAA3F\\uAA4E\\uAA4F\\uAA5A\\uAA5B\\uAA7C-\\uAA7F\\uAAC3-\\uAADA\\uAAF7-\\uAB00\\uAB07\\uAB08\\uAB0F\\uAB10\\uAB17-\\uAB1F\\uAB27\\uAB2F-\\uABBF\\uABEE\\uABEF\\uABFA-\\uABFF\\uD7A4-\\uD7AF\\uD7C7-\\uD7CA\\uD7FC-\\uF8FF\\uFA6E\\uFA6F\\uFADA-\\uFAFF\\uFB07-\\uFB12\\uFB18-\\uFB1C\\uFB37\\uFB3D\\uFB3F\\uFB42\\uFB45\\uFBC2-\\uFBD2\\uFD40-\\uFD4F\\uFD90\\uFD91\\uFDC8-\\uFDEF\\uFDFE\\uFDFF\\uFE1A-\\uFE1F\\uFE27-\\uFE2F\\uFE53\\uFE67\\uFE6C-\\uFE6F\\uFE75\\uFEFD-\\uFF00\\uFFBF-\\uFFC1\\uFFC8\\uFFC9\\uFFD0\\uFFD1\\uFFD8\\uFFD9\\uFFDD-\\uFFDF\\uFFE7\\uFFEF-\\uFFFB\\uFFFE\\uFFFF]/g;\r\n\r\n/**\r\n * remove invisible characters;\r\n * used on paste events in forms\r\n */\r\nexport const removeInvisibleChars = (text: string) => {\r\n return text.replace(invisibleCharactersRegex, '');\r\n};\r\n\r\n/**\r\n * remove invisible characters;\r\n * used on paste events in forms\r\n */\r\nexport const removeInvisibleCharsOnPaste = (evt: ClipboardEvent) => {\r\n evt.preventDefault();\r\n\r\n const $target = evt.target as HTMLInputElement;\r\n const currentFieldValue = $target ? ($target.value ?? '') : '';\r\n\r\n // get clipboard data if exists --------\r\n // @ts-ignore\r\n const clipboardData = evt.clipboardData || window.clipboardData;\r\n if(!clipboardData) return currentFieldValue;\r\n\r\n const data = evt.clipboardData.getData('text');\r\n if(!data) return '';\r\n\r\n const pasteText = removeInvisibleChars(data.trim());\r\n\r\n // handle partial and whole selections ----------\r\n const start = currentFieldValue.substring(0, $target.selectionStart ?? 0);\r\n const end = currentFieldValue.substring($target.selectionEnd ?? currentFieldValue.length, currentFieldValue.length);\r\n return start + pasteText + end;\r\n};\r\n\r\n/* let paste = (event.clipboardData || window.clipboardData).getData('text');\r\n paste = paste.toUpperCase();\r\n const selection = window.getSelection();\r\n if (!selection.rangeCount) return;\r\n selection.deleteFromDocument();\r\n selection.getRangeAt(0).insertNode(document.createTextNode(paste));\r\n selection.collapseToEnd();*/","export const round2DecimalPlaces = (num: number) => {\r\n return Math.round((num + Number.EPSILON) * 100) / 100;\r\n};\r\n\r\n/**\r\n * get number of digits after decimal\r\n */\r\nexport const getDecimalPlaces = function(num: number){\r\n\r\n const match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\r\n if (!match) { return 0; }\r\n return Math.max(\r\n 0,\r\n // Number of digits right of decimal point.\r\n (match[1] ? match[1].length : 0)\r\n // Adjust for scientific notation.\r\n - (match[2] ? +match[2] : 0));\r\n};\r\n\r\n// eslint-disable-next-line\r\nexport const isNumber = (value: any) => {\r\n return !isNaN(parseFloat(value)) && isFinite(value);\r\n};\r\n\r\nexport const mod = (n: number, m: number) => {\r\n return ((n % m) + m) % m;\r\n};","function e(e){this.message=e}e.prototype=new Error,e.prototype.name=\"InvalidCharacterError\";var r=\"undefined\"!=typeof window&&window.atob&&window.atob.bind(window)||function(r){var t=String(r).replace(/=+$/,\"\");if(t.length%4==1)throw new e(\"'atob' failed: The string to be decoded is not correctly encoded.\");for(var n,o,a=0,i=0,c=\"\";o=t.charAt(i++);~o&&(n=a%4?64*n+o:o,a++%4)?c+=String.fromCharCode(255&n>>(-2*a&6)):0)o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\".indexOf(o);return c};function t(e){var t=e.replace(/-/g,\"+\").replace(/_/g,\"/\");switch(t.length%4){case 0:break;case 2:t+=\"==\";break;case 3:t+=\"=\";break;default:throw\"Illegal base64url string!\"}try{return function(e){return decodeURIComponent(r(e).replace(/(.)/g,(function(e,r){var t=r.charCodeAt(0).toString(16).toUpperCase();return t.length<2&&(t=\"0\"+t),\"%\"+t})))}(t)}catch(e){return r(t)}}function n(e){this.message=e}function o(e,r){if(\"string\"!=typeof e)throw new n(\"Invalid token specified\");var o=!0===(r=r||{}).header?0:1;try{return JSON.parse(t(e.split(\".\")[o]))}catch(e){throw new n(\"Invalid token specified: \"+e.message)}}n.prototype=new Error,n.prototype.name=\"InvalidTokenError\";export default o;export{n as InvalidTokenError};\n//# sourceMappingURL=jwt-decode.esm.js.map\n","export const COOKIES = 'cookies';\r\nexport const SESSION_STORAGE = 'session-storage';\r\nexport const LOCAL_STORAGE = 'local-storage';\r\n\r\n/**\r\n * check if storage type is enabled\r\n * storageType - 'local-storage', 'session-storage', or 'cookies'\r\n */\r\nexport const isStorageEnabled = (storageType: string) => {\r\n\r\n if(storageType === COOKIES) return true;\r\n\r\n if(storageType === LOCAL_STORAGE){\r\n\r\n const temp = 'test';\r\n\r\n try {\r\n window.localStorage.setItem(temp, temp);\r\n window.localStorage.removeItem(temp);\r\n return true;\r\n }\r\n catch(e) {\r\n return false;\r\n }\r\n }\r\n\r\n if(storageType === SESSION_STORAGE){\r\n\r\n const temp = 'test';\r\n\r\n try {\r\n window.sessionStorage.setItem(temp, temp);\r\n window.sessionStorage.removeItem(temp);\r\n return true;\r\n }\r\n catch(e) {\r\n return false;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n/**\r\n * set cookie\r\n * expiration - cookie expiration in minutes (-1 = cookie expires when browser is closed)\r\n * samesite - strict or lax\r\n */\r\nexport const setCookie = (\r\n name: string,\r\n value: any,\r\n expiration: number = -1,\r\n secure: boolean = false,\r\n samesite: string|undefined = undefined,\r\n preventStringify: boolean = false,\r\n domain?: string, // .waves.com\r\n) => {\r\n\r\n const escapedValue = encodeURIComponent(preventStringify ? value : JSON.stringify(value));\r\n const exp = Number(expiration) || -1;\r\n let cookieString = '';\r\n\r\n const domainValue = domain ? `domain=${ domain };` : '';\r\n\r\n if(exp === -1) {\r\n\r\n // cookie expires when browser is closed\r\n // If neither expires nor max-age specified the cookie will expire at the end of session.\r\n cookieString = `${ name }=${ escapedValue };path=/;${ domainValue }`;\r\n }\r\n else{\r\n const date = new Date();\r\n date.setMinutes(date.getMinutes() + expiration);\r\n\r\n // option to set expiration in days:\r\n //864e5 = 86400000 = 1000*60*60*24 represents the number of milliseconds in a 24 hour day.\r\n //date.setTime(date.getTime() + (days * 864e5));\r\n\r\n const expires = date.toUTCString();\r\n cookieString = `${ name }=${ escapedValue };path=/;${ domainValue }expires=${ expires }`;\r\n }\r\n\r\n if(samesite){\r\n // The strict value will prevent the cookie from being sent by the browser to the target site in all cross-site browsing context, even when following a regular link.\r\n // The lax value will only send cookies for TOP LEVEL navigation GET requests. This is sufficient for user tracking, but it will prevent many CSRF attacks.\r\n cookieString += `;samesite=${samesite}`;\r\n }\r\n\r\n if(secure){\r\n // Cookie to only be transmitted over secure protocol as https. Before Chrome 52, this flag could appear with cookies from http domains.\r\n cookieString += ';secure';\r\n }\r\n\r\n document.cookie = cookieString;\r\n};\r\n\r\n/**\r\n * Get cookie by name\r\n */\r\nexport const getCookie = (name: string) => {\r\n\r\n const cookies = document.cookie.split(';');\r\n\r\n for (let i=0; i {\r\n const escapedValue = encodeURIComponent(JSON.stringify(value));\r\n window.localStorage.setItem(storageName, escapedValue);\r\n};\r\n\r\n/**\r\n * get a value to the local storage\r\n */\r\nexport const getLocalStorageItem = (storageName: string) => {\r\n const value = window.localStorage.getItem(storageName) as string;\r\n return decodeURIComponent(value);\r\n};\r\n\r\n/**\r\n * save a value to the session storage\r\n */\r\nexport const setSessionStorageItem = (storageName: string, value: any) => {\r\n const escapedValue = encodeURIComponent(JSON.stringify(value));\r\n window.sessionStorage.setItem(storageName, escapedValue);\r\n};\r\n\r\n/**\r\n * get a value to the session storage\r\n */\r\nexport const getSessionStorageItem = (storageName: string) => {\r\n const value = window.sessionStorage.getItem(storageName) as string;\r\n return decodeURIComponent(value);\r\n};\r\n\r\n/**\r\n * save to web storage or cookies\r\n * storageType - 'local-storage', 'session-storage', or 'cookies'\r\n * cookiesExpiration - cookies expiration in minutes (-1 = cookies expire when browser is closed)\r\n */\r\nexport const saveToStorage = (storageType: string, storageName: any, value: any, cookiesExpiration: number = -1) => {\r\n\r\n // if this storage type is not supported -> do nothing\r\n if(!isStorageEnabled(storageType)) return;\r\n\r\n if(storageType === COOKIES) {\r\n setCookie(storageName, value, cookiesExpiration);\r\n }\r\n\r\n if(storageType === LOCAL_STORAGE) {\r\n setLocalStorageItem(storageName, value);\r\n }\r\n\r\n if(storageType === SESSION_STORAGE) {\r\n setSessionStorageItem(storageName, value);\r\n }\r\n};\r\n\r\n/**\r\n * get value from storage\r\n * storageType - 'local-storage', 'session-storage', or 'cookies'\r\n */\r\nexport const getFromStorage = (storageType: string, storageName: string) : string|null => {\r\n\r\n // if this storage type is not supported -> do nothing\r\n if(!isStorageEnabled(storageType)) return null;\r\n\r\n if(storageType === COOKIES) {\r\n return getCookie(storageName);\r\n }\r\n\r\n if(storageType === LOCAL_STORAGE) {\r\n return getLocalStorageItem(storageName);\r\n }\r\n\r\n if(storageType === SESSION_STORAGE) {\r\n return getSessionStorageItem(storageName);\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * if storage already exists, append to it, otherwise create a new one\r\n * storageType - 'local-storage', 'session-storage', or 'cookies'\r\n * storageName - it is used like key name in web storage, or like cookie name\r\n * this is a property name that is used to store the value inside the general widgets object\r\n * value - the value that should be stored\r\n * cookiesExpiration - cookies expiration in minutes (-1 = cookies expire when browser is closed)\r\n */\r\nexport const appendToStorage = (storageType: string, storageName: string, key: string, value: any, cookiesExpiration: number = -1) => {\r\n\r\n let data = getFromStorage(storageType, storageName) as any;\r\n\r\n try{\r\n data = JSON.parse(data);\r\n }\r\n catch(err){}\r\n\r\n if(!data) {\r\n\r\n // create new entry\r\n data = {\r\n [key]: value\r\n };\r\n }\r\n else{\r\n // append the entry\r\n data[key] = value;\r\n }\r\n\r\n // overwrite the storage\r\n saveToStorage(storageType, storageName, data, cookiesExpiration = -1);\r\n};","export default function requiredArgs(required, args) {\n if (args.length < required) {\n throw new TypeError(required + ' argument' + (required > 1 ? 's' : '') + ' required, but only ' + args.length + ' present');\n }\n}","import requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name toDate\n * @category Common Helpers\n * @summary Convert the given argument to an instance of Date.\n *\n * @description\n * Convert the given argument to an instance of Date.\n *\n * If the argument is an instance of Date, the function returns its clone.\n *\n * If the argument is a number, it is treated as a timestamp.\n *\n * If the argument is none of the above, the function returns Invalid Date.\n *\n * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.\n *\n * @param {Date|Number} argument - the value to convert\n * @returns {Date} the parsed date in the local time zone\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // Clone the date:\n * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))\n * //=> Tue Feb 11 2014 11:30:30\n *\n * @example\n * // Convert the timestamp to date:\n * const result = toDate(1392098430000)\n * //=> Tue Feb 11 2014 11:30:30\n */\n\nexport default function toDate(argument) {\n requiredArgs(1, arguments);\n var argStr = Object.prototype.toString.call(argument); // Clone the date\n\n if (argument instanceof Date || typeof argument === 'object' && argStr === '[object Date]') {\n // Prevent the date to lose the milliseconds when passed to new Date() in IE10\n return new Date(argument.getTime());\n } else if (typeof argument === 'number' || argStr === '[object Number]') {\n return new Date(argument);\n } else {\n if ((typeof argument === 'string' || argStr === '[object String]') && typeof console !== 'undefined') {\n // eslint-disable-next-line no-console\n console.warn(\"Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule\"); // eslint-disable-next-line no-console\n\n console.warn(new Error().stack);\n }\n\n return new Date(NaN);\n }\n}","/**\n * Google Chrome as of 67.0.3396.87 introduced timezones with offset that includes seconds.\n * They usually appear for dates that denote time before the timezones were introduced\n * (e.g. for 'Europe/Prague' timezone the offset is GMT+00:57:44 before 1 October 1891\n * and GMT+01:00:00 after that date)\n *\n * Date#getTimezoneOffset returns the offset in minutes and would return 57 for the example above,\n * which would lead to incorrect calculations.\n *\n * This function returns the timezone offset in milliseconds that takes seconds in account.\n */\nexport default function getTimezoneOffsetInMilliseconds(date) {\n var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));\n utcDate.setUTCFullYear(date.getFullYear());\n return date.getTime() - utcDate.getTime();\n}","import toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name startOfDay\n * @category Day Helpers\n * @summary Return the start of a day for the given date.\n *\n * @description\n * Return the start of a day for the given date.\n * The result will be in the local timezone.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the original date\n * @returns {Date} the start of a day\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // The start of a day for 2 September 2014 11:55:00:\n * const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))\n * //=> Tue Sep 02 2014 00:00:00\n */\n\nexport default function startOfDay(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n date.setHours(0, 0, 0, 0);\n return date;\n}","import toDate from \"../toDate/index.js\";\nimport differenceInCalendarDays from \"../differenceInCalendarDays/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\"; // Like `compareAsc` but uses local time not UTC, which is needed\n// for accurate equality comparisons of UTC timestamps that end up\n// having the same representation in local time, e.g. one hour before\n// DST ends vs. the instant that DST ends.\n\nfunction compareLocalAsc(dateLeft, dateRight) {\n var diff = dateLeft.getFullYear() - dateRight.getFullYear() || dateLeft.getMonth() - dateRight.getMonth() || dateLeft.getDate() - dateRight.getDate() || dateLeft.getHours() - dateRight.getHours() || dateLeft.getMinutes() - dateRight.getMinutes() || dateLeft.getSeconds() - dateRight.getSeconds() || dateLeft.getMilliseconds() - dateRight.getMilliseconds();\n\n if (diff < 0) {\n return -1;\n } else if (diff > 0) {\n return 1; // Return 0 if diff is 0; return NaN if diff is NaN\n } else {\n return diff;\n }\n}\n/**\n * @name differenceInDays\n * @category Day Helpers\n * @summary Get the number of full days between the given dates.\n *\n * @description\n * Get the number of full day periods between two dates. Fractional days are\n * truncated towards zero.\n *\n * One \"full day\" is the distance between a local time in one day to the same\n * local time on the next or previous day. A full day can sometimes be less than\n * or more than 24 hours if a daylight savings change happens between two dates.\n *\n * To ignore DST and only measure exact 24-hour periods, use this instead:\n * `Math.floor(differenceInHours(dateLeft, dateRight)/24)|0`.\n *\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @returns {Number} the number of full days according to the local timezone\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many full days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 365\n * // How many full days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 0\n * // How many full days are between\n * // 1 March 2020 0:00 and 1 June 2020 0:00 ?\n * // Note: because local time is used, the\n * // result will always be 92 days, even in\n * // time zones where DST starts and the\n * // period has only 92*24-1 hours.\n * const result = differenceInDays(\n * new Date(2020, 5, 1),\n * new Date(2020, 2, 1)\n * )\n//=> 92\n */\n\n\nexport default function differenceInDays(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var dateLeft = toDate(dirtyDateLeft);\n var dateRight = toDate(dirtyDateRight);\n var sign = compareLocalAsc(dateLeft, dateRight);\n var difference = Math.abs(differenceInCalendarDays(dateLeft, dateRight));\n dateLeft.setDate(dateLeft.getDate() - sign * difference); // Math.abs(diff in full days - diff in calendar days) === 1 if last calendar day is not full\n // If so, result must be decreased by 1 in absolute value\n\n var isLastDayNotFull = Number(compareLocalAsc(dateLeft, dateRight) === -sign);\n var result = sign * (difference - isLastDayNotFull); // Prevent negative zero\n\n return result === 0 ? 0 : result;\n}","import { getQueryString } from '../../url-provider';\r\nimport {getFromStorage, saveToStorage, LOCAL_STORAGE} from '../../../DAL/storage-provider';\r\nimport { IUtm, IUtmUrl } from './utm-interfaces';\r\nimport { differenceInDays } from 'date-fns'\r\n\r\nconst LS_STORAGE_KEY = 'utm_ls_object';\r\nconst SANITIZE_PATTERN = '[^a-zA-Z0-9-_]+';\r\n\r\n/**\r\n * every UTM property in query string should be sanitized with the regex a-zA-Z0-9-_\r\n * before saving to the local storage\r\n */\r\nconst sanitize = (text: string) => {\r\n text = text ?? '';\r\n return text.replace(new RegExp(SANITIZE_PATTERN, 'ig'), '').trim();\r\n};\r\n\r\n/**\r\n * check if current query string has any of the UTM properties\r\n * url example: https://dev13.waves.com/plugins/element?utm_source=redirect&utm_medium=referral&utm_campaign=element2#image\r\n */\r\nconst isUtmQueryString = (urmUrl: IUtmUrl) => {\r\n return (!!urmUrl.utm_source && !!urmUrl.utm_campaign && !!urmUrl.utm_medium) || (!!urmUrl.GCLID && !!urmUrl.w_campaign);\r\n};\r\n\r\n/**\r\n * expiration settings in days, defined in HTML\r\n * it's used for updating the 'first' UTM fields\r\n */\r\nconst getExpirationSettings = () => {\r\n const $box = document.getElementById('utm-expires-days');\r\n if(!$box || !$box.textContent) return 0;\r\n return Number($box.textContent.trim());\r\n};\r\n\r\n/**\r\n * function applies same timezone for specific date\r\n */\r\nconst treatAsUTC = (date: Date) => {\r\n const result = new Date(date);\r\n result.setMinutes(result.getMinutes() - result.getTimezoneOffset());\r\n return result;\r\n}\r\n\r\n/**\r\n * first is overridden if timestamp of it in LS is greater than (today - setting). ( id=\"utm-expires-days\")\r\n */\r\nexport const isUTMExpired = (utm: IUtm, now: Date) => {\r\n const expirationDays = getExpirationSettings();\r\n const daysBetween = differenceInDays(treatAsUTC(now), treatAsUTC(utm.firstTimestamp));\r\n return daysBetween > expirationDays;\r\n};\r\n\r\n/**\r\n * get UTM from local storage;\r\n * used in message gears forms, create account, and other similar places\r\n */\r\nexport const getUTMFromStorage = (now: Date = new Date()) : IUtm|null => {\r\n\r\n // try to bring the UTM object from local storage\r\n const storageData = getFromStorage(LOCAL_STORAGE, LS_STORAGE_KEY);\r\n if(!storageData) return null;\r\n\r\n let utm: IUtm|null = null;\r\n\r\n try {\r\n utm = JSON.parse(storageData) as IUtm | null;\r\n\r\n if(utm){\r\n utm.firstTimestamp = utm.firstTimestamp ? new Date(utm.firstTimestamp) : new Date();\r\n utm.lastTimestamp = utm.lastTimestamp ? new Date(utm.lastTimestamp) : new Date();\r\n }\r\n\r\n } catch (ex) {}\r\n\r\n if(!utm) return null;\r\n\r\n // first is overridden if timestamp of it in LS is greater than (today - setting). ( id=\"utm-expires-days\")\r\n const isExpired = isUTMExpired(utm, now);\r\n if(isExpired) return null;\r\n\r\n return utm;\r\n};\r\n\r\n/**\r\n * init UTMs on every page load\r\n * Bring them from query string and apply the logic described in the below JIRA\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-1838\r\n */\r\nexport const initUTMs = () => {\r\n const queryString = getQueryString(window.location.search, false);\r\n\r\n const urmUrl: IUtmUrl = {\r\n utm_source: sanitize(queryString['utm_source']),\r\n utm_medium: sanitize(queryString['utm_medium']),\r\n utm_campaign: sanitize(queryString['utm_campaign']),\r\n GCLID: queryString['gclid'],\r\n w_campaign: queryString['w_campaign'],\r\n };\r\n\r\n // check if query string is valid\r\n if(!isUtmQueryString(urmUrl)) return;\r\n\r\n // if querystring GCLID and w_campaign exist in URL,\r\n // w_campaign goes to utm_campaign in LS and utm_medium=cpc and utm_source=google\r\n if(urmUrl.GCLID && urmUrl.w_campaign){\r\n urmUrl.utm_source = 'google';\r\n urmUrl.utm_medium = 'cpc';\r\n urmUrl.utm_campaign = urmUrl.w_campaign;\r\n }\r\n\r\n const now = new Date();\r\n\r\n // try to bring the UTM object from local storage\r\n let utm: IUtm|null = getUTMFromStorage(now);\r\n\r\n if(!utm){\r\n // init urm object first time from the query string\r\n // write the same UTMs from URL to both first and last\r\n utm = {\r\n firstSource: urmUrl.utm_source,\r\n firstMedium: urmUrl.utm_medium,\r\n firstCampaign: urmUrl.utm_campaign,\r\n firstTimestamp: now,\r\n\r\n lastSource: urmUrl.utm_source,\r\n lastMedium: urmUrl.utm_medium,\r\n lastCampaign: urmUrl.utm_campaign,\r\n lastTimestamp: now,\r\n }\r\n }\r\n else{\r\n // the 'last' properties should always be overwritten\r\n utm.lastSource = urmUrl.utm_source;\r\n utm.lastMedium = urmUrl.utm_medium;\r\n utm.lastCampaign = urmUrl.utm_campaign;\r\n utm.lastTimestamp = now;\r\n }\r\n\r\n // save UTMs back to local storage\r\n utm.firstTimestamp.toJSON();\r\n utm.lastTimestamp.toJSON();\r\n saveToStorage(LOCAL_STORAGE, LS_STORAGE_KEY, utm);\r\n};\r\n","import getTimezoneOffsetInMilliseconds from \"../_lib/getTimezoneOffsetInMilliseconds/index.js\";\nimport startOfDay from \"../startOfDay/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\nvar MILLISECONDS_IN_DAY = 86400000;\n/**\n * @name differenceInCalendarDays\n * @category Day Helpers\n * @summary Get the number of calendar days between the given dates.\n *\n * @description\n * Get the number of calendar days between the given dates. This means that the times are removed\n * from the dates and then the difference in days is calculated.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} dateLeft - the later date\n * @param {Date|Number} dateRight - the earlier date\n * @returns {Number} the number of calendar days\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // How many calendar days are between\n * // 2 July 2011 23:00:00 and 2 July 2012 00:00:00?\n * const result = differenceInCalendarDays(\n * new Date(2012, 6, 2, 0, 0),\n * new Date(2011, 6, 2, 23, 0)\n * )\n * //=> 366\n * // How many calendar days are between\n * // 2 July 2011 23:59:00 and 3 July 2011 00:01:00?\n * const result = differenceInCalendarDays(\n * new Date(2011, 6, 3, 0, 1),\n * new Date(2011, 6, 2, 23, 59)\n * )\n * //=> 1\n */\n\nexport default function differenceInCalendarDays(dirtyDateLeft, dirtyDateRight) {\n requiredArgs(2, arguments);\n var startOfDayLeft = startOfDay(dirtyDateLeft);\n var startOfDayRight = startOfDay(dirtyDateRight);\n var timestampLeft = startOfDayLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfDayLeft);\n var timestampRight = startOfDayRight.getTime() - getTimezoneOffsetInMilliseconds(startOfDayRight); // Round the number of days to the nearest integer\n // because the number of milliseconds in a day is not constant\n // (e.g. it's different in the day of the daylight saving time clock shift)\n\n return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY);\n}","export enum ExternalLoginServiceEnum\r\n{\r\n Google = 1,\r\n Facebook = 2,\r\n}","/**\r\n * get JSON from HTML element on the page\r\n */\r\nimport React, {useEffect, useState} from \"react\";\r\n\r\n\r\nexport const getJSONFromHtml = ($el: HTMLElement|null) => {\r\n if(!$el || !$el.textContent) return null;\r\n\r\n let json = null;\r\n\r\n try{\r\n json = JSON.parse($el.textContent);\r\n }\r\n catch(ex){}\r\n\r\n return json;\r\n};\r\n\r\n/**\r\n * get setting fromHTML\r\n *
...
\r\n */\r\nexport const getSettingFromHtml = (id: string) => {\r\n const $div = document.querySelector(`#${ id }`);\r\n if(!$div || !$div.textContent) return '';\r\n return $div.textContent.trim();\r\n};\r\n\r\n/**\r\n * helper: get GUID\r\n */\r\nconst guidHelper = () => {\r\n return Math.floor((1 + Math.random()) * 0x10000)\r\n .toString(16)\r\n .substring(1);\r\n};\r\n\r\n/**\r\n * get GUID\r\n */\r\nexport const guid = () => {\r\n return guidHelper() + guidHelper() + '-' + guidHelper() + '-' + guidHelper() + '-' + guidHelper() + '-' + guidHelper() + guidHelper() + guidHelper();\r\n};\r\n\r\n/**\r\n * timeout in milliseconds\r\n */\r\nexport const timeout = (ms: number) => {\r\n return new Promise(resolve => setTimeout(resolve, ms));\r\n};\r\n\r\n/**\r\n * get page node GUID from meta tag printed in HTML\r\n *
67633544-c1c1-4096-a3cc-880a96fe4713
\r\n */\r\nexport const getPageNodeGUID = () => {\r\n const $div = document.querySelector('#nodeguid');\r\n if(!$div || !$div.textContent) return '';\r\n return $div.textContent.trim();\r\n};\r\n\r\n/**\r\n * get img CDN domain\r\n */\r\nexport const getImgCDNDomain = () => {\r\n const $box = document.getElementById('img-cdn-domain');\r\n const domain = $box?.textContent || '';\r\n return domain.trim().toLowerCase();\r\n};\r\n\r\ndeclare const window: any;\r\nexport const isMobile = () => {\r\n let check = false;\r\n\r\n // eslint-disable-next-line\r\n (function(a){if(/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0,4))) check = true;})( navigator.userAgent||navigator.vendor||window.opera);\r\n return check;\r\n};\r\nexport const isTablet_NOTWORK = () => {\r\n const userAgent = navigator.userAgent.toLowerCase();\r\n const isTablet = /(ipad|tablet|(android(?!.*mobile))|(windows(?!.*phone)(.*touch))|kindle|playbook|silk|(puffin(?!.*(IP|AP|WP))))/.test(userAgent);\r\n return isTablet;\r\n};\r\nexport const isTablet = () => {\r\n const isTouchDevice = 'ontouchstart' in window || navigator.maxTouchPoints > 0;\r\n if (isTouchDevice && !isMobile()) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n};\r\n\r\nexport const stopAllYouTubeVideos = () => {\r\n // eslint-disable-next-line\r\n document.querySelectorAll('iframe').forEach(v => { v.src = v.src;});\r\n const cnt = document.querySelectorAll('iframe')?.length;\r\n if(cnt > 0){\r\n window.setTimeout(() => {\r\n window.history.go(cnt-1);\r\n }, 200);\r\n }\r\n //window.history.go(-1);\r\n}\r\n\r\n\r\nexport const getHashByPrefix = (toFind:string, indexToFind:number = 0) => {\r\n let result = \"\";\r\n const _hash = window.location.hash.substring(1);\r\n if(!_hash || _hash === '')\r\n return result;\r\n var a = decodeURIComponent(_hash).split(\"|\"),\r\n i;\r\n\r\n for (i = 0; i < a.length; i++) {\r\n\r\n if(i < indexToFind)\r\n continue;\r\n\r\n if(a[i].startsWith(toFind) || toFind === ''){\r\n result = a[i];\r\n return result;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\nexport const getParents = (elem: any) => {\r\n\r\n // Set up a parent array\r\n var parents = [];\r\n\r\n // Push each parent element to the array\r\n for ( ; elem && elem !== document; elem = elem.parentNode ) {\r\n parents.push(elem);\r\n }\r\n\r\n // Return our parent array\r\n return parents;\r\n\r\n};\r\nexport const isChildOfElementById = (elem: any, parentId: string) => {\r\n\r\n let res = false;\r\n // Push each parent element to the array\r\n for ( ; elem && elem !== document; elem = elem.parentNode ) {\r\n if(elem.id && elem.id === parentId)\r\n res = true;\r\n }\r\n\r\n // Return our parent array\r\n return res;\r\n\r\n};\r\n//Hook for dynamic window size\r\nexport const useWindowSize = () => {\r\n\r\n // Initialize state with undefined width/height so server and client renders match\r\n // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/\r\n const [windowSize, setWindowSize] = useState({\r\n width: undefined,\r\n height: undefined,\r\n });\r\n useEffect(() => {\r\n // Handler to call on window resize\r\n function handleResize() {\r\n // Set window width/height to state\r\n setWindowSize({\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n });\r\n }\r\n // Add event listener\r\n window.addEventListener(\"resize\", handleResize);\r\n // Call handler right away so state gets updated with initial window size\r\n handleResize();\r\n // Remove event listener on cleanup\r\n return () => window.removeEventListener(\"resize\", handleResize);\r\n }, []); // Empty array ensures that effect is only run on mount\r\n\r\n return windowSize;\r\n\r\n};\r\n//Hook for detect if HTML element is overflow\r\nexport const useIsOverflow = (ref : any) => {\r\n const [isOverflow, setIsOverflow] = React.useState(false);\r\n\r\n React.useLayoutEffect(() => {\r\n const { current } = ref;\r\n\r\n const trigger = () => {\r\n const hasOverflow = current.scrollWidth > current.clientWidth;\r\n\r\n setIsOverflow(hasOverflow);\r\n\r\n //if (callback) callback(hasOverflow);\r\n };\r\n\r\n if (current) {\r\n trigger();\r\n }\r\n }, [ ref]);\r\n\r\n return isOverflow;\r\n};\r\n\r\nexport const openWindowPopup = (url: string, title: string, width: number, height: number) => {\r\n const left = (window.screen.width / 2) - (width / 2);\r\n const top = (window.screen.height / 2) - (height / 2);\r\n return window.open(\r\n url,\r\n title,\r\n `toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width=${ width }, height=${ height }, top=${ top }, left=${ left }`\r\n );\r\n};","/**\r\n * get boolean value from the hidden div\r\n */\r\nexport const getHiddenDataBoolean = (id: string) => {\r\n const $el = document.getElementById(id);\r\n if(!$el) return false;\r\n\r\n return $el.innerText.trim().toLowerCase() === 'true';\r\n};\r\n\r\n/**\r\n * get string value from the hidden div\r\n */\r\nexport const getHiddenDataString = (id: string) => {\r\n const $el = document.getElementById(id);\r\n if(!$el || !$el.innerText) return '';\r\n\r\n return $el.innerText.trim();\r\n};\r\n\r\n/**\r\n * get numeric value from the hidden div\r\n */\r\nexport const getHiddenDataNumber = (id: string) => {\r\n const $el = document.getElementById(id);\r\n if(!$el || !$el.innerText) return 0;\r\n\r\n return Number($el.innerText.trim()) || 0;\r\n};\r\n\r\n\r\n/**\r\n * is user authenticated\r\n */\r\nexport const getIsAuthenticated = () => {\r\n return getHiddenDataBoolean('is-user-authenticated');\r\n};\r\n\r\n/**\r\n * get waves user email printed in the hidden DIV\r\n */\r\nexport const getWavesUserEmail = () => {\r\n const $el = document.getElementById('waves-user-email');\r\n if(!$el || !$el.textContent) return '';\r\n return $el.textContent.trim();\r\n};\r\n\r\n/**\r\n * is china\r\n */\r\nexport const getIsChina = () => {\r\n return getHiddenDataBoolean('is-china');\r\n};\r\n\r\n/**\r\n * is Kentico environment\r\n */\r\nexport const getEnvironment = () => {\r\n return getHiddenDataString('kentico-environment');\r\n};","var formatDistanceLocale = {\n lessThanXSeconds: {\n one: 'less than a second',\n other: 'less than {{count}} seconds'\n },\n xSeconds: {\n one: '1 second',\n other: '{{count}} seconds'\n },\n halfAMinute: 'half a minute',\n lessThanXMinutes: {\n one: 'less than a minute',\n other: 'less than {{count}} minutes'\n },\n xMinutes: {\n one: '1 minute',\n other: '{{count}} minutes'\n },\n aboutXHours: {\n one: 'about 1 hour',\n other: 'about {{count}} hours'\n },\n xHours: {\n one: '1 hour',\n other: '{{count}} hours'\n },\n xDays: {\n one: '1 day',\n other: '{{count}} days'\n },\n aboutXWeeks: {\n one: 'about 1 week',\n other: 'about {{count}} weeks'\n },\n xWeeks: {\n one: '1 week',\n other: '{{count}} weeks'\n },\n aboutXMonths: {\n one: 'about 1 month',\n other: 'about {{count}} months'\n },\n xMonths: {\n one: '1 month',\n other: '{{count}} months'\n },\n aboutXYears: {\n one: 'about 1 year',\n other: 'about {{count}} years'\n },\n xYears: {\n one: '1 year',\n other: '{{count}} years'\n },\n overXYears: {\n one: 'over 1 year',\n other: 'over {{count}} years'\n },\n almostXYears: {\n one: 'almost 1 year',\n other: 'almost {{count}} years'\n }\n};\n\nvar formatDistance = function (token, count, options) {\n var result;\n var tokenValue = formatDistanceLocale[token];\n\n if (typeof tokenValue === 'string') {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace('{{count}}', count.toString());\n }\n\n if (options !== null && options !== void 0 && options.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return 'in ' + result;\n } else {\n return result + ' ago';\n }\n }\n\n return result;\n};\n\nexport default formatDistance;","export default function buildFormatLongFn(args) {\n return function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // TODO: Remove String()\n var width = options.width ? String(options.width) : args.defaultWidth;\n var format = args.formats[width] || args.formats[args.defaultWidth];\n return format;\n };\n}","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: 'EEEE, MMMM do, y',\n long: 'MMMM do, y',\n medium: 'MMM d, y',\n short: 'MM/dd/yyyy'\n};\nvar timeFormats = {\n full: 'h:mm:ss a zzzz',\n long: 'h:mm:ss a z',\n medium: 'h:mm:ss a',\n short: 'h:mm a'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'at' {{time}}\",\n long: \"{{date}} 'at' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","export default function buildMatchPatternFn(args) {\n return function (string) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var matchResult = string.match(args.matchPattern);\n if (!matchResult) return null;\n var matchedString = matchResult[0];\n var parseResult = string.match(args.parsePattern);\n if (!parseResult) return null;\n var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];\n value = options.valueCallback ? options.valueCallback(value) : value;\n var rest = string.slice(matchedString.length);\n return {\n value: value,\n rest: rest\n };\n };\n}","var formatRelativeLocale = {\n lastWeek: \"'last' eeee 'at' p\",\n yesterday: \"'yesterday at' p\",\n today: \"'today at' p\",\n tomorrow: \"'tomorrow at' p\",\n nextWeek: \"eeee 'at' p\",\n other: 'P'\n};\n\nvar formatRelative = function (token, _date, _baseDate, _options) {\n return formatRelativeLocale[token];\n};\n\nexport default formatRelative;","export default function buildLocalizeFn(args) {\n return function (dirtyIndex, dirtyOptions) {\n var options = dirtyOptions || {};\n var context = options.context ? String(options.context) : 'standalone';\n var valuesArray;\n\n if (context === 'formatting' && args.formattingValues) {\n var defaultWidth = args.defaultFormattingWidth || args.defaultWidth;\n var width = options.width ? String(options.width) : defaultWidth;\n valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];\n } else {\n var _defaultWidth = args.defaultWidth;\n\n var _width = options.width ? String(options.width) : args.defaultWidth;\n\n valuesArray = args.values[_width] || args.values[_defaultWidth];\n }\n\n var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex; // @ts-ignore: For some reason TypeScript just don't want to match it, no matter how hard we try. I challenge you to try to remove it!\n\n return valuesArray[index];\n };\n}","export default function buildMatchFn(args) {\n return function (string) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var width = options.width;\n var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];\n var matchResult = string.match(matchPattern);\n\n if (!matchResult) {\n return null;\n }\n\n var matchedString = matchResult[0];\n var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];\n var key = Array.isArray(parsePatterns) ? findIndex(parsePatterns, function (pattern) {\n return pattern.test(matchedString);\n }) : findKey(parsePatterns, function (pattern) {\n return pattern.test(matchedString);\n });\n var value;\n value = args.valueCallback ? args.valueCallback(key) : key;\n value = options.valueCallback ? options.valueCallback(value) : value;\n var rest = string.slice(matchedString.length);\n return {\n value: value,\n rest: rest\n };\n };\n}\n\nfunction findKey(object, predicate) {\n for (var key in object) {\n if (object.hasOwnProperty(key) && predicate(object[key])) {\n return key;\n }\n }\n\n return undefined;\n}\n\nfunction findIndex(array, predicate) {\n for (var key = 0; key < array.length; key++) {\n if (predicate(array[key])) {\n return key;\n }\n }\n\n return undefined;\n}","import formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\nimport formatRelative from \"./_lib/formatRelative/index.js\";\nimport localize from \"./_lib/localize/index.js\";\nimport match from \"./_lib/match/index.js\";\n\n/**\n * @type {Locale}\n * @category Locales\n * @summary English locale (United States).\n * @language English\n * @iso-639-2 eng\n * @author Sasha Koss [@kossnocorp]{@link https://github.com/kossnocorp}\n * @author Lesha Koss [@leshakoss]{@link https://github.com/leshakoss}\n */\nvar locale = {\n code: 'en-US',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 0\n /* Sunday */\n ,\n firstWeekContainsDate: 1\n }\n};\nexport default locale;","import buildLocalizeFn from \"../../../_lib/buildLocalizeFn/index.js\";\nvar eraValues = {\n narrow: ['B', 'A'],\n abbreviated: ['BC', 'AD'],\n wide: ['Before Christ', 'Anno Domini']\n};\nvar quarterValues = {\n narrow: ['1', '2', '3', '4'],\n abbreviated: ['Q1', 'Q2', 'Q3', 'Q4'],\n wide: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter']\n}; // Note: in English, the names of days of the week and months are capitalized.\n// If you are making a new locale based on this one, check if the same is true for the language you're working on.\n// Generally, formatted dates should look like they are in the middle of a sentence,\n// e.g. in Spanish language the weekdays and months should be in the lowercase.\n\nvar monthValues = {\n narrow: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n abbreviated: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n wide: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']\n};\nvar dayValues = {\n narrow: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n short: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],\n abbreviated: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n wide: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']\n};\nvar dayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mi',\n noon: 'n',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n }\n};\nvar formattingDayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mi',\n noon: 'n',\n morning: 'in the morning',\n afternoon: 'in the afternoon',\n evening: 'in the evening',\n night: 'at night'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'in the morning',\n afternoon: 'in the afternoon',\n evening: 'in the evening',\n night: 'at night'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'in the morning',\n afternoon: 'in the afternoon',\n evening: 'in the evening',\n night: 'at night'\n }\n};\n\nvar ordinalNumber = function (dirtyNumber, _options) {\n var number = Number(dirtyNumber); // If ordinal numbers depend on context, for example,\n // if they are different for different grammatical genders,\n // use `options.unit`.\n //\n // `unit` can be 'year', 'quarter', 'month', 'week', 'date', 'dayOfYear',\n // 'day', 'hour', 'minute', 'second'.\n\n var rem100 = number % 100;\n\n if (rem100 > 20 || rem100 < 10) {\n switch (rem100 % 10) {\n case 1:\n return number + 'st';\n\n case 2:\n return number + 'nd';\n\n case 3:\n return number + 'rd';\n }\n }\n\n return number + 'th';\n};\n\nvar localize = {\n ordinalNumber: ordinalNumber,\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: 'wide'\n }),\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: 'wide',\n argumentCallback: function (quarter) {\n return quarter - 1;\n }\n }),\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: 'wide'\n }),\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: 'wide'\n }),\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: 'wide',\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: 'wide'\n })\n};\nexport default localize;","import buildMatchFn from \"../../../_lib/buildMatchFn/index.js\";\nimport buildMatchPatternFn from \"../../../_lib/buildMatchPatternFn/index.js\";\nvar matchOrdinalNumberPattern = /^(\\d+)(th|st|nd|rd)?/i;\nvar parseOrdinalNumberPattern = /\\d+/i;\nvar matchEraPatterns = {\n narrow: /^(b|a)/i,\n abbreviated: /^(b\\.?\\s?c\\.?|b\\.?\\s?c\\.?\\s?e\\.?|a\\.?\\s?d\\.?|c\\.?\\s?e\\.?)/i,\n wide: /^(before christ|before common era|anno domini|common era)/i\n};\nvar parseEraPatterns = {\n any: [/^b/i, /^(a|c)/i]\n};\nvar matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^q[1234]/i,\n wide: /^[1234](th|st|nd|rd)? quarter/i\n};\nvar parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i]\n};\nvar matchMonthPatterns = {\n narrow: /^[jfmasond]/i,\n abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,\n wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i\n};\nvar parseMonthPatterns = {\n narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]\n};\nvar matchDayPatterns = {\n narrow: /^[smtwf]/i,\n short: /^(su|mo|tu|we|th|fr|sa)/i,\n abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,\n wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i\n};\nvar parseDayPatterns = {\n narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],\n any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]\n};\nvar matchDayPeriodPatterns = {\n narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,\n any: /^([ap]\\.?\\s?m\\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i\n};\nvar parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mi/i,\n noon: /^no/i,\n morning: /morning/i,\n afternoon: /afternoon/i,\n evening: /evening/i,\n night: /night/i\n }\n};\nvar match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: function (value) {\n return parseInt(value, 10);\n }\n }),\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseEraPatterns,\n defaultParseWidth: 'any'\n }),\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: 'any',\n valueCallback: function (index) {\n return index + 1;\n }\n }),\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: 'any'\n }),\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPatterns,\n defaultParseWidth: 'any'\n }),\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: 'any',\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: 'any'\n })\n};\nexport default match;","export default function toInteger(dirtyNumber) {\n if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) {\n return NaN;\n }\n\n var number = Number(dirtyNumber);\n\n if (isNaN(number)) {\n return number;\n }\n\n return number < 0 ? Math.ceil(number) : Math.floor(number);\n}","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function startOfUTCISOWeek(dirtyDate) {\n requiredArgs(1, arguments);\n var weekStartsOn = 1;\n var date = toDate(dirtyDate);\n var day = date.getUTCDay();\n var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n date.setUTCDate(date.getUTCDate() - diff);\n date.setUTCHours(0, 0, 0, 0);\n return date;\n}","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nimport startOfUTCISOWeek from \"../startOfUTCISOWeek/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCISOWeekYear(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var year = date.getUTCFullYear();\n var fourthOfJanuaryOfNextYear = new Date(0);\n fourthOfJanuaryOfNextYear.setUTCFullYear(year + 1, 0, 4);\n fourthOfJanuaryOfNextYear.setUTCHours(0, 0, 0, 0);\n var startOfNextYear = startOfUTCISOWeek(fourthOfJanuaryOfNextYear);\n var fourthOfJanuaryOfThisYear = new Date(0);\n fourthOfJanuaryOfThisYear.setUTCFullYear(year, 0, 4);\n fourthOfJanuaryOfThisYear.setUTCHours(0, 0, 0, 0);\n var startOfThisYear = startOfUTCISOWeek(fourthOfJanuaryOfThisYear);\n\n if (date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nimport toInteger from \"../toInteger/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function startOfUTCWeek(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n var options = dirtyOptions || {};\n var locale = options.locale;\n var localeWeekStartsOn = locale && locale.options && locale.options.weekStartsOn;\n var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);\n var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN\n\n if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {\n throw new RangeError('weekStartsOn must be between 0 and 6 inclusively');\n }\n\n var date = toDate(dirtyDate);\n var day = date.getUTCDay();\n var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;\n date.setUTCDate(date.getUTCDate() - diff);\n date.setUTCHours(0, 0, 0, 0);\n return date;\n}","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nimport startOfUTCWeek from \"../startOfUTCWeek/index.js\";\nimport toInteger from \"../toInteger/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCWeekYear(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var year = date.getUTCFullYear();\n var options = dirtyOptions || {};\n var locale = options.locale;\n var localeFirstWeekContainsDate = locale && locale.options && locale.options.firstWeekContainsDate;\n var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);\n var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN\n\n if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {\n throw new RangeError('firstWeekContainsDate must be between 1 and 7 inclusively');\n }\n\n var firstWeekOfNextYear = new Date(0);\n firstWeekOfNextYear.setUTCFullYear(year + 1, 0, firstWeekContainsDate);\n firstWeekOfNextYear.setUTCHours(0, 0, 0, 0);\n var startOfNextYear = startOfUTCWeek(firstWeekOfNextYear, dirtyOptions);\n var firstWeekOfThisYear = new Date(0);\n firstWeekOfThisYear.setUTCFullYear(year, 0, firstWeekContainsDate);\n firstWeekOfThisYear.setUTCHours(0, 0, 0, 0);\n var startOfThisYear = startOfUTCWeek(firstWeekOfThisYear, dirtyOptions);\n\n if (date.getTime() >= startOfNextYear.getTime()) {\n return year + 1;\n } else if (date.getTime() >= startOfThisYear.getTime()) {\n return year;\n } else {\n return year - 1;\n }\n}","export default function addLeadingZeros(number, targetLength) {\n var sign = number < 0 ? '-' : '';\n var output = Math.abs(number).toString();\n\n while (output.length < targetLength) {\n output = '0' + output;\n }\n\n return sign + output;\n}","import addLeadingZeros from \"../../addLeadingZeros/index.js\";\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | |\n * | d | Day of month | D | |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | m | Minute | M | Month |\n * | s | Second | S | Fraction of second |\n * | y | Year (abs) | Y | |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n */\n\nvar formatters = {\n // Year\n y: function (date, token) {\n // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens\n // | Year | y | yy | yyy | yyyy | yyyyy |\n // |----------|-------|----|-------|-------|-------|\n // | AD 1 | 1 | 01 | 001 | 0001 | 00001 |\n // | AD 12 | 12 | 12 | 012 | 0012 | 00012 |\n // | AD 123 | 123 | 23 | 123 | 0123 | 00123 |\n // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 |\n // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 |\n var signedYear = date.getUTCFullYear(); // Returns 1 for 1 BC (which is year 0 in JavaScript)\n\n var year = signedYear > 0 ? signedYear : 1 - signedYear;\n return addLeadingZeros(token === 'yy' ? year % 100 : year, token.length);\n },\n // Month\n M: function (date, token) {\n var month = date.getUTCMonth();\n return token === 'M' ? String(month + 1) : addLeadingZeros(month + 1, 2);\n },\n // Day of the month\n d: function (date, token) {\n return addLeadingZeros(date.getUTCDate(), token.length);\n },\n // AM or PM\n a: function (date, token) {\n var dayPeriodEnumValue = date.getUTCHours() / 12 >= 1 ? 'pm' : 'am';\n\n switch (token) {\n case 'a':\n case 'aa':\n return dayPeriodEnumValue.toUpperCase();\n\n case 'aaa':\n return dayPeriodEnumValue;\n\n case 'aaaaa':\n return dayPeriodEnumValue[0];\n\n case 'aaaa':\n default:\n return dayPeriodEnumValue === 'am' ? 'a.m.' : 'p.m.';\n }\n },\n // Hour [1-12]\n h: function (date, token) {\n return addLeadingZeros(date.getUTCHours() % 12 || 12, token.length);\n },\n // Hour [0-23]\n H: function (date, token) {\n return addLeadingZeros(date.getUTCHours(), token.length);\n },\n // Minute\n m: function (date, token) {\n return addLeadingZeros(date.getUTCMinutes(), token.length);\n },\n // Second\n s: function (date, token) {\n return addLeadingZeros(date.getUTCSeconds(), token.length);\n },\n // Fraction of second\n S: function (date, token) {\n var numberOfDigits = token.length;\n var milliseconds = date.getUTCMilliseconds();\n var fractionalSeconds = Math.floor(milliseconds * Math.pow(10, numberOfDigits - 3));\n return addLeadingZeros(fractionalSeconds, token.length);\n }\n};\nexport default formatters;","import getUTCDayOfYear from \"../../../_lib/getUTCDayOfYear/index.js\";\nimport getUTCISOWeek from \"../../../_lib/getUTCISOWeek/index.js\";\nimport getUTCISOWeekYear from \"../../../_lib/getUTCISOWeekYear/index.js\";\nimport getUTCWeek from \"../../../_lib/getUTCWeek/index.js\";\nimport getUTCWeekYear from \"../../../_lib/getUTCWeekYear/index.js\";\nimport addLeadingZeros from \"../../addLeadingZeros/index.js\";\nimport lightFormatters from \"../lightFormatters/index.js\";\nvar dayPeriodEnum = {\n am: 'am',\n pm: 'pm',\n midnight: 'midnight',\n noon: 'noon',\n morning: 'morning',\n afternoon: 'afternoon',\n evening: 'evening',\n night: 'night'\n};\n/*\n * | | Unit | | Unit |\n * |-----|--------------------------------|-----|--------------------------------|\n * | a | AM, PM | A* | Milliseconds in day |\n * | b | AM, PM, noon, midnight | B | Flexible day period |\n * | c | Stand-alone local day of week | C* | Localized hour w/ day period |\n * | d | Day of month | D | Day of year |\n * | e | Local day of week | E | Day of week |\n * | f | | F* | Day of week in month |\n * | g* | Modified Julian day | G | Era |\n * | h | Hour [1-12] | H | Hour [0-23] |\n * | i! | ISO day of week | I! | ISO week of year |\n * | j* | Localized hour w/ day period | J* | Localized hour w/o day period |\n * | k | Hour [1-24] | K | Hour [0-11] |\n * | l* | (deprecated) | L | Stand-alone month |\n * | m | Minute | M | Month |\n * | n | | N | |\n * | o! | Ordinal number modifier | O | Timezone (GMT) |\n * | p! | Long localized time | P! | Long localized date |\n * | q | Stand-alone quarter | Q | Quarter |\n * | r* | Related Gregorian year | R! | ISO week-numbering year |\n * | s | Second | S | Fraction of second |\n * | t! | Seconds timestamp | T! | Milliseconds timestamp |\n * | u | Extended year | U* | Cyclic year |\n * | v* | Timezone (generic non-locat.) | V* | Timezone (location) |\n * | w | Local week of year | W* | Week of month |\n * | x | Timezone (ISO-8601 w/o Z) | X | Timezone (ISO-8601) |\n * | y | Year (abs) | Y | Local week-numbering year |\n * | z | Timezone (specific non-locat.) | Z* | Timezone (aliases) |\n *\n * Letters marked by * are not implemented but reserved by Unicode standard.\n *\n * Letters marked by ! are non-standard, but implemented by date-fns:\n * - `o` modifies the previous token to turn it into an ordinal (see `format` docs)\n * - `i` is ISO day of week. For `i` and `ii` is returns numeric ISO week days,\n * i.e. 7 for Sunday, 1 for Monday, etc.\n * - `I` is ISO week of year, as opposed to `w` which is local week of year.\n * - `R` is ISO week-numbering year, as opposed to `Y` which is local week-numbering year.\n * `R` is supposed to be used in conjunction with `I` and `i`\n * for universal ISO week-numbering date, whereas\n * `Y` is supposed to be used in conjunction with `w` and `e`\n * for week-numbering date specific to the locale.\n * - `P` is long localized date format\n * - `p` is long localized time format\n */\n\nvar formatters = {\n // Era\n G: function (date, token, localize) {\n var era = date.getUTCFullYear() > 0 ? 1 : 0;\n\n switch (token) {\n // AD, BC\n case 'G':\n case 'GG':\n case 'GGG':\n return localize.era(era, {\n width: 'abbreviated'\n });\n // A, B\n\n case 'GGGGG':\n return localize.era(era, {\n width: 'narrow'\n });\n // Anno Domini, Before Christ\n\n case 'GGGG':\n default:\n return localize.era(era, {\n width: 'wide'\n });\n }\n },\n // Year\n y: function (date, token, localize) {\n // Ordinal number\n if (token === 'yo') {\n var signedYear = date.getUTCFullYear(); // Returns 1 for 1 BC (which is year 0 in JavaScript)\n\n var year = signedYear > 0 ? signedYear : 1 - signedYear;\n return localize.ordinalNumber(year, {\n unit: 'year'\n });\n }\n\n return lightFormatters.y(date, token);\n },\n // Local week-numbering year\n Y: function (date, token, localize, options) {\n var signedWeekYear = getUTCWeekYear(date, options); // Returns 1 for 1 BC (which is year 0 in JavaScript)\n\n var weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear; // Two digit year\n\n if (token === 'YY') {\n var twoDigitYear = weekYear % 100;\n return addLeadingZeros(twoDigitYear, 2);\n } // Ordinal number\n\n\n if (token === 'Yo') {\n return localize.ordinalNumber(weekYear, {\n unit: 'year'\n });\n } // Padding\n\n\n return addLeadingZeros(weekYear, token.length);\n },\n // ISO week-numbering year\n R: function (date, token) {\n var isoWeekYear = getUTCISOWeekYear(date); // Padding\n\n return addLeadingZeros(isoWeekYear, token.length);\n },\n // Extended year. This is a single number designating the year of this calendar system.\n // The main difference between `y` and `u` localizers are B.C. years:\n // | Year | `y` | `u` |\n // |------|-----|-----|\n // | AC 1 | 1 | 1 |\n // | BC 1 | 1 | 0 |\n // | BC 2 | 2 | -1 |\n // Also `yy` always returns the last two digits of a year,\n // while `uu` pads single digit years to 2 characters and returns other years unchanged.\n u: function (date, token) {\n var year = date.getUTCFullYear();\n return addLeadingZeros(year, token.length);\n },\n // Quarter\n Q: function (date, token, localize) {\n var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);\n\n switch (token) {\n // 1, 2, 3, 4\n case 'Q':\n return String(quarter);\n // 01, 02, 03, 04\n\n case 'QQ':\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n\n case 'Qo':\n return localize.ordinalNumber(quarter, {\n unit: 'quarter'\n });\n // Q1, Q2, Q3, Q4\n\n case 'QQQ':\n return localize.quarter(quarter, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n\n case 'QQQQQ':\n return localize.quarter(quarter, {\n width: 'narrow',\n context: 'formatting'\n });\n // 1st quarter, 2nd quarter, ...\n\n case 'QQQQ':\n default:\n return localize.quarter(quarter, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Stand-alone quarter\n q: function (date, token, localize) {\n var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);\n\n switch (token) {\n // 1, 2, 3, 4\n case 'q':\n return String(quarter);\n // 01, 02, 03, 04\n\n case 'qq':\n return addLeadingZeros(quarter, 2);\n // 1st, 2nd, 3rd, 4th\n\n case 'qo':\n return localize.ordinalNumber(quarter, {\n unit: 'quarter'\n });\n // Q1, Q2, Q3, Q4\n\n case 'qqq':\n return localize.quarter(quarter, {\n width: 'abbreviated',\n context: 'standalone'\n });\n // 1, 2, 3, 4 (narrow quarter; could be not numerical)\n\n case 'qqqqq':\n return localize.quarter(quarter, {\n width: 'narrow',\n context: 'standalone'\n });\n // 1st quarter, 2nd quarter, ...\n\n case 'qqqq':\n default:\n return localize.quarter(quarter, {\n width: 'wide',\n context: 'standalone'\n });\n }\n },\n // Month\n M: function (date, token, localize) {\n var month = date.getUTCMonth();\n\n switch (token) {\n case 'M':\n case 'MM':\n return lightFormatters.M(date, token);\n // 1st, 2nd, ..., 12th\n\n case 'Mo':\n return localize.ordinalNumber(month + 1, {\n unit: 'month'\n });\n // Jan, Feb, ..., Dec\n\n case 'MMM':\n return localize.month(month, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // J, F, ..., D\n\n case 'MMMMM':\n return localize.month(month, {\n width: 'narrow',\n context: 'formatting'\n });\n // January, February, ..., December\n\n case 'MMMM':\n default:\n return localize.month(month, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Stand-alone month\n L: function (date, token, localize) {\n var month = date.getUTCMonth();\n\n switch (token) {\n // 1, 2, ..., 12\n case 'L':\n return String(month + 1);\n // 01, 02, ..., 12\n\n case 'LL':\n return addLeadingZeros(month + 1, 2);\n // 1st, 2nd, ..., 12th\n\n case 'Lo':\n return localize.ordinalNumber(month + 1, {\n unit: 'month'\n });\n // Jan, Feb, ..., Dec\n\n case 'LLL':\n return localize.month(month, {\n width: 'abbreviated',\n context: 'standalone'\n });\n // J, F, ..., D\n\n case 'LLLLL':\n return localize.month(month, {\n width: 'narrow',\n context: 'standalone'\n });\n // January, February, ..., December\n\n case 'LLLL':\n default:\n return localize.month(month, {\n width: 'wide',\n context: 'standalone'\n });\n }\n },\n // Local week of year\n w: function (date, token, localize, options) {\n var week = getUTCWeek(date, options);\n\n if (token === 'wo') {\n return localize.ordinalNumber(week, {\n unit: 'week'\n });\n }\n\n return addLeadingZeros(week, token.length);\n },\n // ISO week of year\n I: function (date, token, localize) {\n var isoWeek = getUTCISOWeek(date);\n\n if (token === 'Io') {\n return localize.ordinalNumber(isoWeek, {\n unit: 'week'\n });\n }\n\n return addLeadingZeros(isoWeek, token.length);\n },\n // Day of the month\n d: function (date, token, localize) {\n if (token === 'do') {\n return localize.ordinalNumber(date.getUTCDate(), {\n unit: 'date'\n });\n }\n\n return lightFormatters.d(date, token);\n },\n // Day of year\n D: function (date, token, localize) {\n var dayOfYear = getUTCDayOfYear(date);\n\n if (token === 'Do') {\n return localize.ordinalNumber(dayOfYear, {\n unit: 'dayOfYear'\n });\n }\n\n return addLeadingZeros(dayOfYear, token.length);\n },\n // Day of week\n E: function (date, token, localize) {\n var dayOfWeek = date.getUTCDay();\n\n switch (token) {\n // Tue\n case 'E':\n case 'EE':\n case 'EEE':\n return localize.day(dayOfWeek, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // T\n\n case 'EEEEE':\n return localize.day(dayOfWeek, {\n width: 'narrow',\n context: 'formatting'\n });\n // Tu\n\n case 'EEEEEE':\n return localize.day(dayOfWeek, {\n width: 'short',\n context: 'formatting'\n });\n // Tuesday\n\n case 'EEEE':\n default:\n return localize.day(dayOfWeek, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Local day of week\n e: function (date, token, localize, options) {\n var dayOfWeek = date.getUTCDay();\n var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n\n switch (token) {\n // Numerical value (Nth day of week with current locale or weekStartsOn)\n case 'e':\n return String(localDayOfWeek);\n // Padded numerical value\n\n case 'ee':\n return addLeadingZeros(localDayOfWeek, 2);\n // 1st, 2nd, ..., 7th\n\n case 'eo':\n return localize.ordinalNumber(localDayOfWeek, {\n unit: 'day'\n });\n\n case 'eee':\n return localize.day(dayOfWeek, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // T\n\n case 'eeeee':\n return localize.day(dayOfWeek, {\n width: 'narrow',\n context: 'formatting'\n });\n // Tu\n\n case 'eeeeee':\n return localize.day(dayOfWeek, {\n width: 'short',\n context: 'formatting'\n });\n // Tuesday\n\n case 'eeee':\n default:\n return localize.day(dayOfWeek, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Stand-alone local day of week\n c: function (date, token, localize, options) {\n var dayOfWeek = date.getUTCDay();\n var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;\n\n switch (token) {\n // Numerical value (same as in `e`)\n case 'c':\n return String(localDayOfWeek);\n // Padded numerical value\n\n case 'cc':\n return addLeadingZeros(localDayOfWeek, token.length);\n // 1st, 2nd, ..., 7th\n\n case 'co':\n return localize.ordinalNumber(localDayOfWeek, {\n unit: 'day'\n });\n\n case 'ccc':\n return localize.day(dayOfWeek, {\n width: 'abbreviated',\n context: 'standalone'\n });\n // T\n\n case 'ccccc':\n return localize.day(dayOfWeek, {\n width: 'narrow',\n context: 'standalone'\n });\n // Tu\n\n case 'cccccc':\n return localize.day(dayOfWeek, {\n width: 'short',\n context: 'standalone'\n });\n // Tuesday\n\n case 'cccc':\n default:\n return localize.day(dayOfWeek, {\n width: 'wide',\n context: 'standalone'\n });\n }\n },\n // ISO day of week\n i: function (date, token, localize) {\n var dayOfWeek = date.getUTCDay();\n var isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;\n\n switch (token) {\n // 2\n case 'i':\n return String(isoDayOfWeek);\n // 02\n\n case 'ii':\n return addLeadingZeros(isoDayOfWeek, token.length);\n // 2nd\n\n case 'io':\n return localize.ordinalNumber(isoDayOfWeek, {\n unit: 'day'\n });\n // Tue\n\n case 'iii':\n return localize.day(dayOfWeek, {\n width: 'abbreviated',\n context: 'formatting'\n });\n // T\n\n case 'iiiii':\n return localize.day(dayOfWeek, {\n width: 'narrow',\n context: 'formatting'\n });\n // Tu\n\n case 'iiiiii':\n return localize.day(dayOfWeek, {\n width: 'short',\n context: 'formatting'\n });\n // Tuesday\n\n case 'iiii':\n default:\n return localize.day(dayOfWeek, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // AM or PM\n a: function (date, token, localize) {\n var hours = date.getUTCHours();\n var dayPeriodEnumValue = hours / 12 >= 1 ? 'pm' : 'am';\n\n switch (token) {\n case 'a':\n case 'aa':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n });\n\n case 'aaa':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n }).toLowerCase();\n\n case 'aaaaa':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'narrow',\n context: 'formatting'\n });\n\n case 'aaaa':\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // AM, PM, midnight, noon\n b: function (date, token, localize) {\n var hours = date.getUTCHours();\n var dayPeriodEnumValue;\n\n if (hours === 12) {\n dayPeriodEnumValue = dayPeriodEnum.noon;\n } else if (hours === 0) {\n dayPeriodEnumValue = dayPeriodEnum.midnight;\n } else {\n dayPeriodEnumValue = hours / 12 >= 1 ? 'pm' : 'am';\n }\n\n switch (token) {\n case 'b':\n case 'bb':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n });\n\n case 'bbb':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n }).toLowerCase();\n\n case 'bbbbb':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'narrow',\n context: 'formatting'\n });\n\n case 'bbbb':\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // in the morning, in the afternoon, in the evening, at night\n B: function (date, token, localize) {\n var hours = date.getUTCHours();\n var dayPeriodEnumValue;\n\n if (hours >= 17) {\n dayPeriodEnumValue = dayPeriodEnum.evening;\n } else if (hours >= 12) {\n dayPeriodEnumValue = dayPeriodEnum.afternoon;\n } else if (hours >= 4) {\n dayPeriodEnumValue = dayPeriodEnum.morning;\n } else {\n dayPeriodEnumValue = dayPeriodEnum.night;\n }\n\n switch (token) {\n case 'B':\n case 'BB':\n case 'BBB':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'abbreviated',\n context: 'formatting'\n });\n\n case 'BBBBB':\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'narrow',\n context: 'formatting'\n });\n\n case 'BBBB':\n default:\n return localize.dayPeriod(dayPeriodEnumValue, {\n width: 'wide',\n context: 'formatting'\n });\n }\n },\n // Hour [1-12]\n h: function (date, token, localize) {\n if (token === 'ho') {\n var hours = date.getUTCHours() % 12;\n if (hours === 0) hours = 12;\n return localize.ordinalNumber(hours, {\n unit: 'hour'\n });\n }\n\n return lightFormatters.h(date, token);\n },\n // Hour [0-23]\n H: function (date, token, localize) {\n if (token === 'Ho') {\n return localize.ordinalNumber(date.getUTCHours(), {\n unit: 'hour'\n });\n }\n\n return lightFormatters.H(date, token);\n },\n // Hour [0-11]\n K: function (date, token, localize) {\n var hours = date.getUTCHours() % 12;\n\n if (token === 'Ko') {\n return localize.ordinalNumber(hours, {\n unit: 'hour'\n });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n // Hour [1-24]\n k: function (date, token, localize) {\n var hours = date.getUTCHours();\n if (hours === 0) hours = 24;\n\n if (token === 'ko') {\n return localize.ordinalNumber(hours, {\n unit: 'hour'\n });\n }\n\n return addLeadingZeros(hours, token.length);\n },\n // Minute\n m: function (date, token, localize) {\n if (token === 'mo') {\n return localize.ordinalNumber(date.getUTCMinutes(), {\n unit: 'minute'\n });\n }\n\n return lightFormatters.m(date, token);\n },\n // Second\n s: function (date, token, localize) {\n if (token === 'so') {\n return localize.ordinalNumber(date.getUTCSeconds(), {\n unit: 'second'\n });\n }\n\n return lightFormatters.s(date, token);\n },\n // Fraction of second\n S: function (date, token) {\n return lightFormatters.S(date, token);\n },\n // Timezone (ISO-8601. If offset is 0, output is always `'Z'`)\n X: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timezoneOffset = originalDate.getTimezoneOffset();\n\n if (timezoneOffset === 0) {\n return 'Z';\n }\n\n switch (token) {\n // Hours and optional minutes\n case 'X':\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XX`\n\n case 'XXXX':\n case 'XX':\n // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `XXX`\n\n case 'XXXXX':\n case 'XXX': // Hours and minutes with `:` delimiter\n\n default:\n return formatTimezone(timezoneOffset, ':');\n }\n },\n // Timezone (ISO-8601. If offset is 0, output is `'+00:00'` or equivalent)\n x: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timezoneOffset = originalDate.getTimezoneOffset();\n\n switch (token) {\n // Hours and optional minutes\n case 'x':\n return formatTimezoneWithOptionalMinutes(timezoneOffset);\n // Hours, minutes and optional seconds without `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xx`\n\n case 'xxxx':\n case 'xx':\n // Hours and minutes without `:` delimiter\n return formatTimezone(timezoneOffset);\n // Hours, minutes and optional seconds with `:` delimiter\n // Note: neither ISO-8601 nor JavaScript supports seconds in timezone offsets\n // so this token always has the same output as `xxx`\n\n case 'xxxxx':\n case 'xxx': // Hours and minutes with `:` delimiter\n\n default:\n return formatTimezone(timezoneOffset, ':');\n }\n },\n // Timezone (GMT)\n O: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timezoneOffset = originalDate.getTimezoneOffset();\n\n switch (token) {\n // Short\n case 'O':\n case 'OO':\n case 'OOO':\n return 'GMT' + formatTimezoneShort(timezoneOffset, ':');\n // Long\n\n case 'OOOO':\n default:\n return 'GMT' + formatTimezone(timezoneOffset, ':');\n }\n },\n // Timezone (specific non-location)\n z: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timezoneOffset = originalDate.getTimezoneOffset();\n\n switch (token) {\n // Short\n case 'z':\n case 'zz':\n case 'zzz':\n return 'GMT' + formatTimezoneShort(timezoneOffset, ':');\n // Long\n\n case 'zzzz':\n default:\n return 'GMT' + formatTimezone(timezoneOffset, ':');\n }\n },\n // Seconds timestamp\n t: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timestamp = Math.floor(originalDate.getTime() / 1000);\n return addLeadingZeros(timestamp, token.length);\n },\n // Milliseconds timestamp\n T: function (date, token, _localize, options) {\n var originalDate = options._originalDate || date;\n var timestamp = originalDate.getTime();\n return addLeadingZeros(timestamp, token.length);\n }\n};\n\nfunction formatTimezoneShort(offset, dirtyDelimiter) {\n var sign = offset > 0 ? '-' : '+';\n var absOffset = Math.abs(offset);\n var hours = Math.floor(absOffset / 60);\n var minutes = absOffset % 60;\n\n if (minutes === 0) {\n return sign + String(hours);\n }\n\n var delimiter = dirtyDelimiter || '';\n return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);\n}\n\nfunction formatTimezoneWithOptionalMinutes(offset, dirtyDelimiter) {\n if (offset % 60 === 0) {\n var sign = offset > 0 ? '-' : '+';\n return sign + addLeadingZeros(Math.abs(offset) / 60, 2);\n }\n\n return formatTimezone(offset, dirtyDelimiter);\n}\n\nfunction formatTimezone(offset, dirtyDelimiter) {\n var delimiter = dirtyDelimiter || '';\n var sign = offset > 0 ? '-' : '+';\n var absOffset = Math.abs(offset);\n var hours = addLeadingZeros(Math.floor(absOffset / 60), 2);\n var minutes = addLeadingZeros(absOffset % 60, 2);\n return sign + hours + delimiter + minutes;\n}\n\nexport default formatters;","import toDate from \"../../toDate/index.js\";\nimport startOfUTCWeek from \"../startOfUTCWeek/index.js\";\nimport startOfUTCWeekYear from \"../startOfUTCWeekYear/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nvar MILLISECONDS_IN_WEEK = 604800000; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCWeek(dirtyDate, options) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var diff = startOfUTCWeek(date, options).getTime() - startOfUTCWeekYear(date, options).getTime(); // Round the number of days to the nearest integer\n // because the number of milliseconds in a week is not constant\n // (e.g. it's different in the week of the daylight saving time clock shift)\n\n return Math.round(diff / MILLISECONDS_IN_WEEK) + 1;\n}","import getUTCWeekYear from \"../getUTCWeekYear/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nimport startOfUTCWeek from \"../startOfUTCWeek/index.js\";\nimport toInteger from \"../toInteger/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function startOfUTCWeekYear(dirtyDate, dirtyOptions) {\n requiredArgs(1, arguments);\n var options = dirtyOptions || {};\n var locale = options.locale;\n var localeFirstWeekContainsDate = locale && locale.options && locale.options.firstWeekContainsDate;\n var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);\n var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate);\n var year = getUTCWeekYear(dirtyDate, dirtyOptions);\n var firstWeek = new Date(0);\n firstWeek.setUTCFullYear(year, 0, firstWeekContainsDate);\n firstWeek.setUTCHours(0, 0, 0, 0);\n var date = startOfUTCWeek(firstWeek, dirtyOptions);\n return date;\n}","import toDate from \"../../toDate/index.js\";\nimport startOfUTCISOWeek from \"../startOfUTCISOWeek/index.js\";\nimport startOfUTCISOWeekYear from \"../startOfUTCISOWeekYear/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nvar MILLISECONDS_IN_WEEK = 604800000; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCISOWeek(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var diff = startOfUTCISOWeek(date).getTime() - startOfUTCISOWeekYear(date).getTime(); // Round the number of days to the nearest integer\n // because the number of milliseconds in a week is not constant\n // (e.g. it's different in the week of the daylight saving time clock shift)\n\n return Math.round(diff / MILLISECONDS_IN_WEEK) + 1;\n}","import getUTCISOWeekYear from \"../getUTCISOWeekYear/index.js\";\nimport startOfUTCISOWeek from \"../startOfUTCISOWeek/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\"; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function startOfUTCISOWeekYear(dirtyDate) {\n requiredArgs(1, arguments);\n var year = getUTCISOWeekYear(dirtyDate);\n var fourthOfJanuary = new Date(0);\n fourthOfJanuary.setUTCFullYear(year, 0, 4);\n fourthOfJanuary.setUTCHours(0, 0, 0, 0);\n var date = startOfUTCISOWeek(fourthOfJanuary);\n return date;\n}","import toDate from \"../../toDate/index.js\";\nimport requiredArgs from \"../requiredArgs/index.js\";\nvar MILLISECONDS_IN_DAY = 86400000; // This function will be a part of public API when UTC function will be implemented.\n// See issue: https://github.com/date-fns/date-fns/issues/376\n\nexport default function getUTCDayOfYear(dirtyDate) {\n requiredArgs(1, arguments);\n var date = toDate(dirtyDate);\n var timestamp = date.getTime();\n date.setUTCMonth(0, 1);\n date.setUTCHours(0, 0, 0, 0);\n var startOfYearTimestamp = date.getTime();\n var difference = timestamp - startOfYearTimestamp;\n return Math.floor(difference / MILLISECONDS_IN_DAY) + 1;\n}","function dateLongFormatter(pattern, formatLong) {\n switch (pattern) {\n case 'P':\n return formatLong.date({\n width: 'short'\n });\n\n case 'PP':\n return formatLong.date({\n width: 'medium'\n });\n\n case 'PPP':\n return formatLong.date({\n width: 'long'\n });\n\n case 'PPPP':\n default:\n return formatLong.date({\n width: 'full'\n });\n }\n}\n\nfunction timeLongFormatter(pattern, formatLong) {\n switch (pattern) {\n case 'p':\n return formatLong.time({\n width: 'short'\n });\n\n case 'pp':\n return formatLong.time({\n width: 'medium'\n });\n\n case 'ppp':\n return formatLong.time({\n width: 'long'\n });\n\n case 'pppp':\n default:\n return formatLong.time({\n width: 'full'\n });\n }\n}\n\nfunction dateTimeLongFormatter(pattern, formatLong) {\n var matchResult = pattern.match(/(P+)(p+)?/) || [];\n var datePattern = matchResult[1];\n var timePattern = matchResult[2];\n\n if (!timePattern) {\n return dateLongFormatter(pattern, formatLong);\n }\n\n var dateTimeFormat;\n\n switch (datePattern) {\n case 'P':\n dateTimeFormat = formatLong.dateTime({\n width: 'short'\n });\n break;\n\n case 'PP':\n dateTimeFormat = formatLong.dateTime({\n width: 'medium'\n });\n break;\n\n case 'PPP':\n dateTimeFormat = formatLong.dateTime({\n width: 'long'\n });\n break;\n\n case 'PPPP':\n default:\n dateTimeFormat = formatLong.dateTime({\n width: 'full'\n });\n break;\n }\n\n return dateTimeFormat.replace('{{date}}', dateLongFormatter(datePattern, formatLong)).replace('{{time}}', timeLongFormatter(timePattern, formatLong));\n}\n\nvar longFormatters = {\n p: timeLongFormatter,\n P: dateTimeLongFormatter\n};\nexport default longFormatters;","var protectedDayOfYearTokens = ['D', 'DD'];\nvar protectedWeekYearTokens = ['YY', 'YYYY'];\nexport function isProtectedDayOfYearToken(token) {\n return protectedDayOfYearTokens.indexOf(token) !== -1;\n}\nexport function isProtectedWeekYearToken(token) {\n return protectedWeekYearTokens.indexOf(token) !== -1;\n}\nexport function throwProtectedError(token, format, input) {\n if (token === 'YYYY') {\n throw new RangeError(\"Use `yyyy` instead of `YYYY` (in `\".concat(format, \"`) for formatting years to the input `\").concat(input, \"`; see: https://git.io/fxCyr\"));\n } else if (token === 'YY') {\n throw new RangeError(\"Use `yy` instead of `YY` (in `\".concat(format, \"`) for formatting years to the input `\").concat(input, \"`; see: https://git.io/fxCyr\"));\n } else if (token === 'D') {\n throw new RangeError(\"Use `d` instead of `D` (in `\".concat(format, \"`) for formatting days of the month to the input `\").concat(input, \"`; see: https://git.io/fxCyr\"));\n } else if (token === 'DD') {\n throw new RangeError(\"Use `dd` instead of `DD` (in `\".concat(format, \"`) for formatting days of the month to the input `\").concat(input, \"`; see: https://git.io/fxCyr\"));\n }\n}","import isValid from \"../isValid/index.js\";\nimport defaultLocale from \"../locale/en-US/index.js\";\nimport subMilliseconds from \"../subMilliseconds/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport formatters from \"../_lib/format/formatters/index.js\";\nimport longFormatters from \"../_lib/format/longFormatters/index.js\";\nimport getTimezoneOffsetInMilliseconds from \"../_lib/getTimezoneOffsetInMilliseconds/index.js\";\nimport { isProtectedDayOfYearToken, isProtectedWeekYearToken, throwProtectedError } from \"../_lib/protectedTokens/index.js\";\nimport toInteger from \"../_lib/toInteger/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\"; // This RegExp consists of three parts separated by `|`:\n// - [yYQqMLwIdDecihHKkms]o matches any available ordinal number token\n// (one of the certain letters followed by `o`)\n// - (\\w)\\1* matches any sequences of the same letter\n// - '' matches two quote characters in a row\n// - '(''|[^'])+('|$) matches anything surrounded by two quote characters ('),\n// except a single quote symbol, which ends the sequence.\n// Two quote characters do not end the sequence.\n// If there is no matching single quote\n// then the sequence will continue until the end of the string.\n// - . matches any single character unmatched by previous parts of the RegExps\n\nvar formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\\w)\\1*|''|'(''|[^'])+('|$)|./g; // This RegExp catches symbols escaped by quotes, and also\n// sequences of symbols P, p, and the combinations like `PPPPPPPppppp`\n\nvar longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;\nvar escapedStringRegExp = /^'([^]*?)'?$/;\nvar doubleQuoteRegExp = /''/g;\nvar unescapedLatinCharacterRegExp = /[a-zA-Z]/;\n/**\n * @name format\n * @category Common Helpers\n * @summary Format the date.\n *\n * @description\n * Return the formatted date string in the given format. The result may vary by locale.\n *\n * > ⚠️ Please note that the `format` tokens differ from Moment.js and other libraries.\n * > See: https://git.io/fxCyr\n *\n * The characters wrapped between two single quotes characters (') are escaped.\n * Two single quotes in a row, whether inside or outside a quoted sequence, represent a 'real' single quote.\n * (see the last example)\n *\n * Format of the string is based on Unicode Technical Standard #35:\n * https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table\n * with a few additions (see note 7 below the table).\n *\n * Accepted patterns:\n * | Unit | Pattern | Result examples | Notes |\n * |---------------------------------|---------|-----------------------------------|-------|\n * | Era | G..GGG | AD, BC | |\n * | | GGGG | Anno Domini, Before Christ | 2 |\n * | | GGGGG | A, B | |\n * | Calendar year | y | 44, 1, 1900, 2017 | 5 |\n * | | yo | 44th, 1st, 0th, 17th | 5,7 |\n * | | yy | 44, 01, 00, 17 | 5 |\n * | | yyy | 044, 001, 1900, 2017 | 5 |\n * | | yyyy | 0044, 0001, 1900, 2017 | 5 |\n * | | yyyyy | ... | 3,5 |\n * | Local week-numbering year | Y | 44, 1, 1900, 2017 | 5 |\n * | | Yo | 44th, 1st, 1900th, 2017th | 5,7 |\n * | | YY | 44, 01, 00, 17 | 5,8 |\n * | | YYY | 044, 001, 1900, 2017 | 5 |\n * | | YYYY | 0044, 0001, 1900, 2017 | 5,8 |\n * | | YYYYY | ... | 3,5 |\n * | ISO week-numbering year | R | -43, 0, 1, 1900, 2017 | 5,7 |\n * | | RR | -43, 00, 01, 1900, 2017 | 5,7 |\n * | | RRR | -043, 000, 001, 1900, 2017 | 5,7 |\n * | | RRRR | -0043, 0000, 0001, 1900, 2017 | 5,7 |\n * | | RRRRR | ... | 3,5,7 |\n * | Extended year | u | -43, 0, 1, 1900, 2017 | 5 |\n * | | uu | -43, 01, 1900, 2017 | 5 |\n * | | uuu | -043, 001, 1900, 2017 | 5 |\n * | | uuuu | -0043, 0001, 1900, 2017 | 5 |\n * | | uuuuu | ... | 3,5 |\n * | Quarter (formatting) | Q | 1, 2, 3, 4 | |\n * | | Qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | QQ | 01, 02, 03, 04 | |\n * | | QQQ | Q1, Q2, Q3, Q4 | |\n * | | QQQQ | 1st quarter, 2nd quarter, ... | 2 |\n * | | QQQQQ | 1, 2, 3, 4 | 4 |\n * | Quarter (stand-alone) | q | 1, 2, 3, 4 | |\n * | | qo | 1st, 2nd, 3rd, 4th | 7 |\n * | | qq | 01, 02, 03, 04 | |\n * | | qqq | Q1, Q2, Q3, Q4 | |\n * | | qqqq | 1st quarter, 2nd quarter, ... | 2 |\n * | | qqqqq | 1, 2, 3, 4 | 4 |\n * | Month (formatting) | M | 1, 2, ..., 12 | |\n * | | Mo | 1st, 2nd, ..., 12th | 7 |\n * | | MM | 01, 02, ..., 12 | |\n * | | MMM | Jan, Feb, ..., Dec | |\n * | | MMMM | January, February, ..., December | 2 |\n * | | MMMMM | J, F, ..., D | |\n * | Month (stand-alone) | L | 1, 2, ..., 12 | |\n * | | Lo | 1st, 2nd, ..., 12th | 7 |\n * | | LL | 01, 02, ..., 12 | |\n * | | LLL | Jan, Feb, ..., Dec | |\n * | | LLLL | January, February, ..., December | 2 |\n * | | LLLLL | J, F, ..., D | |\n * | Local week of year | w | 1, 2, ..., 53 | |\n * | | wo | 1st, 2nd, ..., 53th | 7 |\n * | | ww | 01, 02, ..., 53 | |\n * | ISO week of year | I | 1, 2, ..., 53 | 7 |\n * | | Io | 1st, 2nd, ..., 53th | 7 |\n * | | II | 01, 02, ..., 53 | 7 |\n * | Day of month | d | 1, 2, ..., 31 | |\n * | | do | 1st, 2nd, ..., 31st | 7 |\n * | | dd | 01, 02, ..., 31 | |\n * | Day of year | D | 1, 2, ..., 365, 366 | 9 |\n * | | Do | 1st, 2nd, ..., 365th, 366th | 7 |\n * | | DD | 01, 02, ..., 365, 366 | 9 |\n * | | DDD | 001, 002, ..., 365, 366 | |\n * | | DDDD | ... | 3 |\n * | Day of week (formatting) | E..EEE | Mon, Tue, Wed, ..., Sun | |\n * | | EEEE | Monday, Tuesday, ..., Sunday | 2 |\n * | | EEEEE | M, T, W, T, F, S, S | |\n * | | EEEEEE | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | ISO day of week (formatting) | i | 1, 2, 3, ..., 7 | 7 |\n * | | io | 1st, 2nd, ..., 7th | 7 |\n * | | ii | 01, 02, ..., 07 | 7 |\n * | | iii | Mon, Tue, Wed, ..., Sun | 7 |\n * | | iiii | Monday, Tuesday, ..., Sunday | 2,7 |\n * | | iiiii | M, T, W, T, F, S, S | 7 |\n * | | iiiiii | Mo, Tu, We, Th, Fr, Sa, Su | 7 |\n * | Local day of week (formatting) | e | 2, 3, 4, ..., 1 | |\n * | | eo | 2nd, 3rd, ..., 1st | 7 |\n * | | ee | 02, 03, ..., 01 | |\n * | | eee | Mon, Tue, Wed, ..., Sun | |\n * | | eeee | Monday, Tuesday, ..., Sunday | 2 |\n * | | eeeee | M, T, W, T, F, S, S | |\n * | | eeeeee | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | Local day of week (stand-alone) | c | 2, 3, 4, ..., 1 | |\n * | | co | 2nd, 3rd, ..., 1st | 7 |\n * | | cc | 02, 03, ..., 01 | |\n * | | ccc | Mon, Tue, Wed, ..., Sun | |\n * | | cccc | Monday, Tuesday, ..., Sunday | 2 |\n * | | ccccc | M, T, W, T, F, S, S | |\n * | | cccccc | Mo, Tu, We, Th, Fr, Sa, Su | |\n * | AM, PM | a..aa | AM, PM | |\n * | | aaa | am, pm | |\n * | | aaaa | a.m., p.m. | 2 |\n * | | aaaaa | a, p | |\n * | AM, PM, noon, midnight | b..bb | AM, PM, noon, midnight | |\n * | | bbb | am, pm, noon, midnight | |\n * | | bbbb | a.m., p.m., noon, midnight | 2 |\n * | | bbbbb | a, p, n, mi | |\n * | Flexible day period | B..BBB | at night, in the morning, ... | |\n * | | BBBB | at night, in the morning, ... | 2 |\n * | | BBBBB | at night, in the morning, ... | |\n * | Hour [1-12] | h | 1, 2, ..., 11, 12 | |\n * | | ho | 1st, 2nd, ..., 11th, 12th | 7 |\n * | | hh | 01, 02, ..., 11, 12 | |\n * | Hour [0-23] | H | 0, 1, 2, ..., 23 | |\n * | | Ho | 0th, 1st, 2nd, ..., 23rd | 7 |\n * | | HH | 00, 01, 02, ..., 23 | |\n * | Hour [0-11] | K | 1, 2, ..., 11, 0 | |\n * | | Ko | 1st, 2nd, ..., 11th, 0th | 7 |\n * | | KK | 01, 02, ..., 11, 00 | |\n * | Hour [1-24] | k | 24, 1, 2, ..., 23 | |\n * | | ko | 24th, 1st, 2nd, ..., 23rd | 7 |\n * | | kk | 24, 01, 02, ..., 23 | |\n * | Minute | m | 0, 1, ..., 59 | |\n * | | mo | 0th, 1st, ..., 59th | 7 |\n * | | mm | 00, 01, ..., 59 | |\n * | Second | s | 0, 1, ..., 59 | |\n * | | so | 0th, 1st, ..., 59th | 7 |\n * | | ss | 00, 01, ..., 59 | |\n * | Fraction of second | S | 0, 1, ..., 9 | |\n * | | SS | 00, 01, ..., 99 | |\n * | | SSS | 000, 001, ..., 999 | |\n * | | SSSS | ... | 3 |\n * | Timezone (ISO-8601 w/ Z) | X | -08, +0530, Z | |\n * | | XX | -0800, +0530, Z | |\n * | | XXX | -08:00, +05:30, Z | |\n * | | XXXX | -0800, +0530, Z, +123456 | 2 |\n * | | XXXXX | -08:00, +05:30, Z, +12:34:56 | |\n * | Timezone (ISO-8601 w/o Z) | x | -08, +0530, +00 | |\n * | | xx | -0800, +0530, +0000 | |\n * | | xxx | -08:00, +05:30, +00:00 | 2 |\n * | | xxxx | -0800, +0530, +0000, +123456 | |\n * | | xxxxx | -08:00, +05:30, +00:00, +12:34:56 | |\n * | Timezone (GMT) | O...OOO | GMT-8, GMT+5:30, GMT+0 | |\n * | | OOOO | GMT-08:00, GMT+05:30, GMT+00:00 | 2 |\n * | Timezone (specific non-locat.) | z...zzz | GMT-8, GMT+5:30, GMT+0 | 6 |\n * | | zzzz | GMT-08:00, GMT+05:30, GMT+00:00 | 2,6 |\n * | Seconds timestamp | t | 512969520 | 7 |\n * | | tt | ... | 3,7 |\n * | Milliseconds timestamp | T | 512969520900 | 7 |\n * | | TT | ... | 3,7 |\n * | Long localized date | P | 04/29/1453 | 7 |\n * | | PP | Apr 29, 1453 | 7 |\n * | | PPP | April 29th, 1453 | 7 |\n * | | PPPP | Friday, April 29th, 1453 | 2,7 |\n * | Long localized time | p | 12:00 AM | 7 |\n * | | pp | 12:00:00 AM | 7 |\n * | | ppp | 12:00:00 AM GMT+2 | 7 |\n * | | pppp | 12:00:00 AM GMT+02:00 | 2,7 |\n * | Combination of date and time | Pp | 04/29/1453, 12:00 AM | 7 |\n * | | PPpp | Apr 29, 1453, 12:00:00 AM | 7 |\n * | | PPPppp | April 29th, 1453 at ... | 7 |\n * | | PPPPpppp| Friday, April 29th, 1453 at ... | 2,7 |\n * Notes:\n * 1. \"Formatting\" units (e.g. formatting quarter) in the default en-US locale\n * are the same as \"stand-alone\" units, but are different in some languages.\n * \"Formatting\" units are declined according to the rules of the language\n * in the context of a date. \"Stand-alone\" units are always nominative singular:\n *\n * `format(new Date(2017, 10, 6), 'do LLLL', {locale: cs}) //=> '6. listopad'`\n *\n * `format(new Date(2017, 10, 6), 'do MMMM', {locale: cs}) //=> '6. listopadu'`\n *\n * 2. Any sequence of the identical letters is a pattern, unless it is escaped by\n * the single quote characters (see below).\n * If the sequence is longer than listed in table (e.g. `EEEEEEEEEEE`)\n * the output will be the same as default pattern for this unit, usually\n * the longest one (in case of ISO weekdays, `EEEE`). Default patterns for units\n * are marked with \"2\" in the last column of the table.\n *\n * `format(new Date(2017, 10, 6), 'MMM') //=> 'Nov'`\n *\n * `format(new Date(2017, 10, 6), 'MMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMM') //=> 'N'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMM') //=> 'November'`\n *\n * `format(new Date(2017, 10, 6), 'MMMMMMM') //=> 'November'`\n *\n * 3. Some patterns could be unlimited length (such as `yyyyyyyy`).\n * The output will be padded with zeros to match the length of the pattern.\n *\n * `format(new Date(2017, 10, 6), 'yyyyyyyy') //=> '00002017'`\n *\n * 4. `QQQQQ` and `qqqqq` could be not strictly numerical in some locales.\n * These tokens represent the shortest form of the quarter.\n *\n * 5. The main difference between `y` and `u` patterns are B.C. years:\n *\n * | Year | `y` | `u` |\n * |------|-----|-----|\n * | AC 1 | 1 | 1 |\n * | BC 1 | 1 | 0 |\n * | BC 2 | 2 | -1 |\n *\n * Also `yy` always returns the last two digits of a year,\n * while `uu` pads single digit years to 2 characters and returns other years unchanged:\n *\n * | Year | `yy` | `uu` |\n * |------|------|------|\n * | 1 | 01 | 01 |\n * | 14 | 14 | 14 |\n * | 376 | 76 | 376 |\n * | 1453 | 53 | 1453 |\n *\n * The same difference is true for local and ISO week-numbering years (`Y` and `R`),\n * except local week-numbering years are dependent on `options.weekStartsOn`\n * and `options.firstWeekContainsDate` (compare [getISOWeekYear]{@link https://date-fns.org/docs/getISOWeekYear}\n * and [getWeekYear]{@link https://date-fns.org/docs/getWeekYear}).\n *\n * 6. Specific non-location timezones are currently unavailable in `date-fns`,\n * so right now these tokens fall back to GMT timezones.\n *\n * 7. These patterns are not in the Unicode Technical Standard #35:\n * - `i`: ISO day of week\n * - `I`: ISO week of year\n * - `R`: ISO week-numbering year\n * - `t`: seconds timestamp\n * - `T`: milliseconds timestamp\n * - `o`: ordinal number modifier\n * - `P`: long localized date\n * - `p`: long localized time\n *\n * 8. `YY` and `YYYY` tokens represent week-numbering years but they are often confused with years.\n * You should enable `options.useAdditionalWeekYearTokens` to use them. See: https://git.io/fxCyr\n *\n * 9. `D` and `DD` tokens represent days of the year but they are often confused with days of the month.\n * You should enable `options.useAdditionalDayOfYearTokens` to use them. See: https://git.io/fxCyr\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - The second argument is now required for the sake of explicitness.\n *\n * ```javascript\n * // Before v2.0.0\n * format(new Date(2016, 0, 1))\n *\n * // v2.0.0 onward\n * format(new Date(2016, 0, 1), \"yyyy-MM-dd'T'HH:mm:ss.SSSxxx\")\n * ```\n *\n * - New format string API for `format` function\n * which is based on [Unicode Technical Standard #35](https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table).\n * See [this post](https://blog.date-fns.org/post/unicode-tokens-in-date-fns-v2-sreatyki91jg) for more details.\n *\n * - Characters are now escaped using single quote symbols (`'`) instead of square brackets.\n *\n * @param {Date|Number} date - the original date\n * @param {String} format - the string of tokens\n * @param {Object} [options] - an object with options.\n * @param {Locale} [options.locale=defaultLocale] - the locale object. See [Locale]{@link https://date-fns.org/docs/Locale}\n * @param {0|1|2|3|4|5|6} [options.weekStartsOn=0] - the index of the first day of the week (0 - Sunday)\n * @param {Number} [options.firstWeekContainsDate=1] - the day of January, which is\n * @param {Boolean} [options.useAdditionalWeekYearTokens=false] - if true, allows usage of the week-numbering year tokens `YY` and `YYYY`;\n * see: https://git.io/fxCyr\n * @param {Boolean} [options.useAdditionalDayOfYearTokens=false] - if true, allows usage of the day of year tokens `D` and `DD`;\n * see: https://git.io/fxCyr\n * @returns {String} the formatted date string\n * @throws {TypeError} 2 arguments required\n * @throws {RangeError} `date` must not be Invalid Date\n * @throws {RangeError} `options.locale` must contain `localize` property\n * @throws {RangeError} `options.locale` must contain `formatLong` property\n * @throws {RangeError} `options.weekStartsOn` must be between 0 and 6\n * @throws {RangeError} `options.firstWeekContainsDate` must be between 1 and 7\n * @throws {RangeError} use `yyyy` instead of `YYYY` for formatting years using [format provided] to the input [input provided]; see: https://git.io/fxCyr\n * @throws {RangeError} use `yy` instead of `YY` for formatting years using [format provided] to the input [input provided]; see: https://git.io/fxCyr\n * @throws {RangeError} use `d` instead of `D` for formatting days of the month using [format provided] to the input [input provided]; see: https://git.io/fxCyr\n * @throws {RangeError} use `dd` instead of `DD` for formatting days of the month using [format provided] to the input [input provided]; see: https://git.io/fxCyr\n * @throws {RangeError} format string contains an unescaped latin alphabet character\n *\n * @example\n * // Represent 11 February 2014 in middle-endian format:\n * var result = format(new Date(2014, 1, 11), 'MM/dd/yyyy')\n * //=> '02/11/2014'\n *\n * @example\n * // Represent 2 July 2014 in Esperanto:\n * import { eoLocale } from 'date-fns/locale/eo'\n * var result = format(new Date(2014, 6, 2), \"do 'de' MMMM yyyy\", {\n * locale: eoLocale\n * })\n * //=> '2-a de julio 2014'\n *\n * @example\n * // Escape string by single quote characters:\n * var result = format(new Date(2014, 6, 2, 15), \"h 'o''clock'\")\n * //=> \"3 o'clock\"\n */\n\nexport default function format(dirtyDate, dirtyFormatStr, dirtyOptions) {\n requiredArgs(2, arguments);\n var formatStr = String(dirtyFormatStr);\n var options = dirtyOptions || {};\n var locale = options.locale || defaultLocale;\n var localeFirstWeekContainsDate = locale.options && locale.options.firstWeekContainsDate;\n var defaultFirstWeekContainsDate = localeFirstWeekContainsDate == null ? 1 : toInteger(localeFirstWeekContainsDate);\n var firstWeekContainsDate = options.firstWeekContainsDate == null ? defaultFirstWeekContainsDate : toInteger(options.firstWeekContainsDate); // Test if weekStartsOn is between 1 and 7 _and_ is not NaN\n\n if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {\n throw new RangeError('firstWeekContainsDate must be between 1 and 7 inclusively');\n }\n\n var localeWeekStartsOn = locale.options && locale.options.weekStartsOn;\n var defaultWeekStartsOn = localeWeekStartsOn == null ? 0 : toInteger(localeWeekStartsOn);\n var weekStartsOn = options.weekStartsOn == null ? defaultWeekStartsOn : toInteger(options.weekStartsOn); // Test if weekStartsOn is between 0 and 6 _and_ is not NaN\n\n if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {\n throw new RangeError('weekStartsOn must be between 0 and 6 inclusively');\n }\n\n if (!locale.localize) {\n throw new RangeError('locale must contain localize property');\n }\n\n if (!locale.formatLong) {\n throw new RangeError('locale must contain formatLong property');\n }\n\n var originalDate = toDate(dirtyDate);\n\n if (!isValid(originalDate)) {\n throw new RangeError('Invalid time value');\n } // Convert the date in system timezone to the same date in UTC+00:00 timezone.\n // This ensures that when UTC functions will be implemented, locales will be compatible with them.\n // See an issue about UTC functions: https://github.com/date-fns/date-fns/issues/376\n\n\n var timezoneOffset = getTimezoneOffsetInMilliseconds(originalDate);\n var utcDate = subMilliseconds(originalDate, timezoneOffset);\n var formatterOptions = {\n firstWeekContainsDate: firstWeekContainsDate,\n weekStartsOn: weekStartsOn,\n locale: locale,\n _originalDate: originalDate\n };\n var result = formatStr.match(longFormattingTokensRegExp).map(function (substring) {\n var firstCharacter = substring[0];\n\n if (firstCharacter === 'p' || firstCharacter === 'P') {\n var longFormatter = longFormatters[firstCharacter];\n return longFormatter(substring, locale.formatLong, formatterOptions);\n }\n\n return substring;\n }).join('').match(formattingTokensRegExp).map(function (substring) {\n // Replace two single quote characters with one single quote character\n if (substring === \"''\") {\n return \"'\";\n }\n\n var firstCharacter = substring[0];\n\n if (firstCharacter === \"'\") {\n return cleanEscapedString(substring);\n }\n\n var formatter = formatters[firstCharacter];\n\n if (formatter) {\n if (!options.useAdditionalWeekYearTokens && isProtectedWeekYearToken(substring)) {\n throwProtectedError(substring, dirtyFormatStr, dirtyDate);\n }\n\n if (!options.useAdditionalDayOfYearTokens && isProtectedDayOfYearToken(substring)) {\n throwProtectedError(substring, dirtyFormatStr, dirtyDate);\n }\n\n return formatter(utcDate, substring, locale.localize, formatterOptions);\n }\n\n if (firstCharacter.match(unescapedLatinCharacterRegExp)) {\n throw new RangeError('Format string contains an unescaped latin alphabet character `' + firstCharacter + '`');\n }\n\n return substring;\n }).join('');\n return result;\n}\n\nfunction cleanEscapedString(input) {\n return input.match(escapedStringRegExp)[1].replace(doubleQuoteRegExp, \"'\");\n}","import isDate from \"../isDate/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name isValid\n * @category Common Helpers\n * @summary Is the given date valid?\n *\n * @description\n * Returns false if argument is Invalid Date and true otherwise.\n * Argument is converted to Date using `toDate`. See [toDate]{@link https://date-fns.org/docs/toDate}\n * Invalid Date is a Date, whose time value is NaN.\n *\n * Time value of Date: http://es5.github.io/#x15.9.1.1\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * - Now `isValid` doesn't throw an exception\n * if the first argument is not an instance of Date.\n * Instead, argument is converted beforehand using `toDate`.\n *\n * Examples:\n *\n * | `isValid` argument | Before v2.0.0 | v2.0.0 onward |\n * |---------------------------|---------------|---------------|\n * | `new Date()` | `true` | `true` |\n * | `new Date('2016-01-01')` | `true` | `true` |\n * | `new Date('')` | `false` | `false` |\n * | `new Date(1488370835081)` | `true` | `true` |\n * | `new Date(NaN)` | `false` | `false` |\n * | `'2016-01-01'` | `TypeError` | `false` |\n * | `''` | `TypeError` | `false` |\n * | `1488370835081` | `TypeError` | `true` |\n * | `NaN` | `TypeError` | `false` |\n *\n * We introduce this change to make *date-fns* consistent with ECMAScript behavior\n * that try to coerce arguments to the expected type\n * (which is also the case with other *date-fns* functions).\n *\n * @param {*} date - the date to check\n * @returns {Boolean} the date is valid\n * @throws {TypeError} 1 argument required\n *\n * @example\n * // For the valid date:\n * const result = isValid(new Date(2014, 1, 31))\n * //=> true\n *\n * @example\n * // For the value, convertable into a date:\n * const result = isValid(1393804800000)\n * //=> true\n *\n * @example\n * // For the invalid date:\n * const result = isValid(new Date(''))\n * //=> false\n */\n\nexport default function isValid(dirtyDate) {\n requiredArgs(1, arguments);\n\n if (!isDate(dirtyDate) && typeof dirtyDate !== 'number') {\n return false;\n }\n\n var date = toDate(dirtyDate);\n return !isNaN(Number(date));\n}","import requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name isDate\n * @category Common Helpers\n * @summary Is the given value a date?\n *\n * @description\n * Returns true if the given value is an instance of Date. The function works for dates transferred across iframes.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {*} value - the value to check\n * @returns {boolean} true if the given value is a date\n * @throws {TypeError} 1 arguments required\n *\n * @example\n * // For a valid date:\n * const result = isDate(new Date())\n * //=> true\n *\n * @example\n * // For an invalid date:\n * const result = isDate(new Date(NaN))\n * //=> true\n *\n * @example\n * // For some value:\n * const result = isDate('2014-02-31')\n * //=> false\n *\n * @example\n * // For an object:\n * const result = isDate({})\n * //=> false\n */\n\nexport default function isDate(value) {\n requiredArgs(1, arguments);\n return value instanceof Date || typeof value === 'object' && Object.prototype.toString.call(value) === '[object Date]';\n}","import toInteger from \"../_lib/toInteger/index.js\";\nimport addMilliseconds from \"../addMilliseconds/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name subMilliseconds\n * @category Millisecond Helpers\n * @summary Subtract the specified number of milliseconds from the given date.\n *\n * @description\n * Subtract the specified number of milliseconds from the given date.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Number} amount - the amount of milliseconds to be subtracted. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`.\n * @returns {Date} the new date with the milliseconds subtracted\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Subtract 750 milliseconds from 10 July 2014 12:45:30.000:\n * const result = subMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n * //=> Thu Jul 10 2014 12:45:29.250\n */\n\nexport default function subMilliseconds(dirtyDate, dirtyAmount) {\n requiredArgs(2, arguments);\n var amount = toInteger(dirtyAmount);\n return addMilliseconds(dirtyDate, -amount);\n}","import toInteger from \"../_lib/toInteger/index.js\";\nimport toDate from \"../toDate/index.js\";\nimport requiredArgs from \"../_lib/requiredArgs/index.js\";\n/**\n * @name addMilliseconds\n * @category Millisecond Helpers\n * @summary Add the specified number of milliseconds to the given date.\n *\n * @description\n * Add the specified number of milliseconds to the given date.\n *\n * ### v2.0.0 breaking changes:\n *\n * - [Changes that are common for the whole library](https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#Common-Changes).\n *\n * @param {Date|Number} date - the date to be changed\n * @param {Number} amount - the amount of milliseconds to be added. Positive decimals will be rounded using `Math.floor`, decimals less than zero will be rounded using `Math.ceil`.\n * @returns {Date} the new date with the milliseconds added\n * @throws {TypeError} 2 arguments required\n *\n * @example\n * // Add 750 milliseconds to 10 July 2014 12:45:30.000:\n * const result = addMilliseconds(new Date(2014, 6, 10, 12, 45, 30, 0), 750)\n * //=> Thu Jul 10 2014 12:45:30.750\n */\n\nexport default function addMilliseconds(dirtyDate, dirtyAmount) {\n requiredArgs(2, arguments);\n var timestamp = toDate(dirtyDate).getTime();\n var amount = toInteger(dirtyAmount);\n return new Date(timestamp + amount);\n}","import { getCookie, setCookie } from '../../../DAL/storage-provider';\r\nimport { getJSONFromHtml } from '../../../domain/common';\r\nimport { getHiddenDataBoolean, getHiddenDataString } from '../../../domain/hidden-data-provider';\r\nimport { format } from 'date-fns';\r\n\r\nexport const GDRP_COOKIE_NAME = 'gdpr';\r\n\r\nexport interface IGdpr {\r\n IsCountryGDPR: string, // \"y\", \"n\", \"u\"\r\n IsMarketing: boolean,\r\n IsPerformance: boolean,\r\n ItemModifiedWhen: string, // \"2022-07-31T12:57:15.7440792\"\r\n}\r\n\r\n/**\r\n * In case GDPR cookie doesn't exist, we rely on \"IsGDPRDefaultOptOut\" returned from SP.\r\n * If user is opt out ---> both IsMarketing and IsPerformance are false.\r\n * If user is not opt out ---> both IsMarketing and IsPerformance are true.\r\n * https://g6a420.axshare.com/#g=1&p=scripts_per_cookie_flow\r\n */\r\nexport const getGdprDefaultValues = () : IGdpr => {\r\n const isOptOut = isGdprOptOut();\r\n\r\n return {\r\n IsMarketing: !isOptOut,\r\n IsPerformance: !isOptOut,\r\n ItemModifiedWhen: format(new Date(), 'MM/dd/yyyy HH:mm:ss'),\r\n IsCountryGDPR: getHiddenDataString('gdpr-country') || 'u',\r\n } as IGdpr;\r\n};\r\n\r\n/**\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-4442\r\n * https://g6a420.axshare.com/#g=1&p=scripts_per_cookie_flow\r\n */\r\nexport const getGdprCookie = () : IGdpr => {\r\n const cookie = getCookie(GDRP_COOKIE_NAME);\r\n if(!cookie) return getGdprDefaultValues();\r\n\r\n let parsed: IGdpr | null = null;\r\n\r\n try{\r\n parsed = JSON.parse(cookie) as IGdpr;\r\n }\r\n catch(ex){}\r\n\r\n return parsed || getGdprDefaultValues();\r\n};\r\n\r\n\r\nexport const setGDPRCookie = (data: IGdpr) => {\r\n\r\n const expiration = -1;\r\n const secure = false;\r\n const sameSite = undefined;\r\n const preventStringify = false;\r\n const domain = '.waves.com';\r\n\r\n setCookie('gdpr', data, expiration, secure, sameSite, preventStringify, domain);\r\n};\r\n\r\nexport const getGdprCookieFromServer = () : IGdpr => {\r\n return getJSONFromHtml(document.getElementById('cookies-policy-data-json')) as IGdpr;\r\n};\r\n\r\nexport const isGdprOptOut = () : boolean => {\r\n return getHiddenDataBoolean('gdpr-opt-out');\r\n};\r\n\r\n/**\r\n *
You may find this content helpful: To be able to view it, allow Performance Cookies here.
\r\n */\r\nexport const getGdprError = () => {\r\n const $error = document.getElementById('gdpr-error');\r\n return ($error?.textContent || '').trim();\r\n};","export enum CartSteps {\r\n First = 1,\r\n Second = 2,\r\n Third = 3,\r\n}","/**\r\n * Allows to TypeScript recognize google tag manager namespace\r\n */\r\nimport {IListItem} from \"../../projects/list-page/interfaces/interfaces\";\r\nimport { CartSteps } from '../../projects/shopping-cart/cart-bridger-pay/enums/cart-steps';\r\nimport { ICartData } from '../../projects/shopping-cart/cart-bridger-pay/interfaces';\r\nimport { getHiddenDataNumber, getHiddenDataString } from '../hidden-data-provider';\r\nimport { IOrder } from '../../projects/shopping-cart/cart-thank-you/interfaces';\r\nimport { getExpectedLTV } from '../../projects/shopping-cart/cart-bridger-pay/domain/shopping-cart-provider';\r\n\r\ndeclare global {\r\n interface Window {\r\n dataLayer: any;\r\n }\r\n}\r\n\r\ninterface IGAProduct{\r\n name: string,\r\n id: string,\r\n price: number,\r\n category: string,\r\n variant: string,\r\n list: string,\r\n}\r\n\r\ninterface IGAImpression {\r\n name: string,\r\n id: string,\r\n price: number,\r\n category: string,\r\n variant: string,\r\n list: string,\r\n position: number,\r\n}\r\n\r\ninterface IActionField{\r\n list: string,\r\n}\r\n\r\ninterface ICheckoutActionField {\r\n step: number,\r\n option?: number,\r\n}\r\n\r\n/**\r\n * send data to GTM after registration\r\n */\r\nexport const gtmCreateAccount = (referrer = 'from Signup form') => {\r\n if(!window.dataLayer) return;\r\n\r\n window.dataLayer.push({\r\n 'GA_event_category': 'Registration',\r\n 'GA_event_action': 'New account',\r\n 'GA_event_label': referrer,\r\n 'event': 'GTM event To GA'\r\n });\r\n};\r\n\r\n/**\r\n * send google analytics track event\r\n * @param {string} eventTitle - event title (data-gaevent=\"Click\")\r\n * @param {string} eventValue - event value (data-gavalue=\"...\")\r\n */\r\nexport const sendGAEvent = (eventTitle: string, eventValue: string) => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n window.dataLayer.push({\r\n 'GA_event_action': eventTitle\r\n , 'GA_event_category': window.location.pathname\r\n , 'GA_event_label': eventValue\r\n , 'event': 'GTM event To GA'\r\n });\r\n};\r\n\r\n/**\r\n * get category from url\r\n */\r\nexport const getCategoryFromURL = (url: string) => {\r\n\r\n if(!url) return '';\r\n\r\n const idx = url.lastIndexOf('/');\r\n\r\n if(idx !== -1){\r\n return url.substring(0, url.lastIndexOf('/')).replace('/', '');\r\n }\r\n\r\n return '';\r\n};\r\n\r\n/**\r\n * send product clicks to the gtm\r\n */\r\nexport const sendGaEventImpressions = (impressions: IGAImpression[]) => {\r\n\r\n if(!window.dataLayer || !impressions || impressions.length <= 0) return;\r\n\r\n window.dataLayer.push({\r\n event: 'ProductImpression'\r\n ,ecommerce: {\r\n currencyCode: 'USD' //local currency is optional\r\n ,impressions: impressions\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * send product details to the gtm\r\n */\r\nexport const sendGaEventProductDetails = (analyticsData: { price: number; name: string; id: string; category: string }[]) => {\r\n\r\n if(!window.dataLayer || !analyticsData || analyticsData.length <= 0) return;\r\n\r\n window.dataLayer.push({\r\n event: 'productDetail'\r\n ,ecommerce: {\r\n detail: {\r\n products: analyticsData\r\n }\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * send product clicks to the gtm\r\n * actionField - {list: 'List Page'} (Product Page Tab / List Page / Shopping Cart Gallery / Homepage)\r\n */\r\nexport const sendGaEventProductClick = (actionField: IActionField, products: IGAProduct[]) => {\r\n\r\n if(!window.dataLayer || !products || products.length <= 0) return;\r\n\r\n window.dataLayer.push({\r\n event: 'productClick'\r\n ,ecommerce: {\r\n click: {\r\n actionField: actionField\r\n ,products: products\r\n }\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * send Google Analytics list page event\r\n */\r\nexport const sendGAListPageEvent = (product: IListItem, listName: string = 'List Page') => {\r\n\r\n const title = product.title ? product.title : listName;\r\n\r\n const item = {\r\n name: product.documentName\r\n ,id: product.skuNumber\r\n ,price: product.skuPrice\r\n ,category: getCategoryFromURL(product.documentUrlPath)\r\n ,variant: 'NONE'\r\n ,list: title\r\n };\r\n\r\n sendGaEventProductClick({list: title}, [item]);\r\n};\r\n\r\n/**\r\n * send page type event to google analytics according to the following meta on the page:\r\n * \r\n */\r\nexport const sendGAPageTypeEvent = () => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n const $meta = document.querySelector('meta[property=\"google-ecomm-pagetype\"]');\r\n if(!$meta) return;\r\n\r\n window.dataLayer.push({\r\n pageType: $meta.getAttribute('content') || '',\r\n });\r\n};\r\n\r\n/**\r\n * send GA user guid event from the following hidden field:\r\n *
@ViewBag.LayoutModel.GA_GUID
\r\n */\r\nexport const sendGAWavesUserGuidEvent = (gaGuid = '') => {\r\n if(!window.dataLayer) return;\r\n\r\n window['dataLayer'].push({\r\n 'waves-user-guid': gaGuid || getHiddenDataString('ga-user-guid'),\r\n });\r\n};\r\n\r\n/**\r\n * This event is sent when user clicks on 'proceed to checkout' button on each cart step.\r\n */\r\nexport const sendGaCheckoutEvent = (cartStep: CartSteps, cartData: ICartData) => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n if(cartStep === CartSteps.Third){\r\n\r\n window.dataLayer.push({\r\n 'GA_event_action': 'Payment Method'\r\n ,'GA_event_category': document.location.pathname\r\n ,'GA_event_label': 'Credit Card'\r\n ,'event': 'GTM event To GA'\r\n });\r\n }\r\n\r\n const actionField: ICheckoutActionField = {\r\n step: cartStep,\r\n };\r\n\r\n if(cartStep === CartSteps.First) {\r\n actionField.option = cartData.cartItems.reduce((total, cur) => total + cur.skuUnits, 0);\r\n }\r\n\r\n const products: any[] = cartData.cartItems.filter(cartItem => cartItem.isActive).map(cartItem => {\r\n return {\r\n skuid:\tcartItem.skuid,\r\n skuDepartment:\tcartItem.skuDepartmentID,\r\n skuDepartmentName:\tcartItem.departmentName, //'plugins',\r\n skuguid: cartItem.skuguid,\r\n name: cartItem.skuName,\r\n skunumber:\tcartItem.skuNumber,\r\n skuNeedsShipping:\tcartItem.skuNeedsShipping,\r\n //isSBL:\tfalse,\r\n //isPDL:\tfalse,\r\n //img:\t'/1lib/images/products/plugins/tiny/clarity-vx.png',\r\n thumb:\tcartItem.skuThumb,\r\n quantity:\tcartItem.skuUnits,\r\n price:\tcartItem.priceData.price,\r\n upsell:\tcartItem.priceData.discount,\r\n msrp:\tcartItem.skU_MSRP,\r\n yousave: cartItem.priceData.discount,\t//119.01,\r\n producttotal: cartItem.priceData.price * cartItem.skuUnits,\r\n link:\tcartItem.documentUrlPath,\r\n cartComment: cartItem.cartComment,\r\n skuEnabled:\tcartItem.skuEnabled,\r\n //mvrDiscountPrice:\t0,\r\n //mvrItemDiscount:\t0,\r\n pricega: cartItem.priceData.price,\r\n }\r\n })\r\n\r\n window['dataLayer'].push({\r\n event: 'checkout',\r\n CartValue: cartData.priceData.totalPrice,\r\n ecommerce: {\r\n checkout: {\r\n actionField: actionField,\r\n products,\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport const sendGATransactionTriggerEventHelper = (orderData: IOrder) => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n const products: any[] = [];\r\n\r\n for(let orderItem of orderData.orderItems){\r\n products.push({\r\n 'name': orderItem.orderItemSKUName,\r\n 'id': orderItem.skuNumber,\r\n 'price': orderItem.discountPrice,\r\n 'brand': 'Waves',\r\n 'category': (orderItem.departmentDisplayName ?? '').toLowerCase(),\r\n 'quantity': orderItem.orderItemUnitCount,\r\n });\r\n }\r\n\r\n if(orderData.upsellDiscount > 0){\r\n\r\n products.push({\r\n 'name': 'Discount',\r\n 'price': -orderData.upsellDiscount,\r\n 'brand': 'Waves',\r\n 'quantity': 1,\r\n });\r\n }\r\n\r\n window.dataLayer.push({\r\n event: 'TransactionTrigger'\r\n ,PaymentMethod: orderData.fundSourceType // 'Credit Card / PayPal / AliPay / Splitit'\r\n\r\n ,ecommerce: {\r\n purchase: {\r\n 'actionField': {\r\n 'id': orderData.wavesReceiptID,\r\n 'affiliation': 'Online Store',\r\n 'revenue': orderData.totalPrice - orderData.taxPrice - orderData.shippingTaxPrice,\r\n 'tax': orderData.taxPrice + orderData.shippingTaxPrice,\r\n 'shipping': orderData.shippingPrice,\r\n },\r\n products,\r\n }\r\n }\r\n });\r\n\r\n};\r\n\r\n/**\r\n * This event is sent on 'thank you' page only after the real purchase.\r\n */\r\nexport const sendGATransactionTriggerEvent = (orderData: IOrder) => {\r\n sendGATransactionTriggerEventHelper(orderData);\r\n\r\n window.dataLayer.push({\r\n event: getExpectedLTV(orderData) > 0 ? 'TransactionTriggerSBS' : 'TransactionTriggerPerpetual',\r\n });\r\n};\r\n\r\nexport const sendThankYouDataToGTM = (orderData: IOrder) => {\r\n if(!window.dataLayer) return;\r\n\r\n const quantity = orderData.orderItems.reduce(\r\n (previousQty, orderItem) => previousQty + orderItem.orderItemUnitCount,\r\n 0\r\n );\r\n\r\n window.dataLayer.push({\r\n 'quantity': quantity,\r\n 'receiptid': orderData.wavesReceiptID,\r\n 'priceWithoutTaxAndShipping': getHiddenDataNumber('price-without-tax-and-shipping'),\r\n 'OrderID': orderData.orderID,\r\n 'email': orderData.email,\r\n 'yotpo-api-key': getHiddenDataString('yotpo-api-key'),\r\n 'expectedLTV': getExpectedLTV(orderData),\r\n });\r\n};\r\n\r\n/**\r\n * send data to gtm every time when product is added to cart\r\n */\r\nexport const sendGAEventAddToCart = (\r\n documentName: string,\r\n skuNumber: string,\r\n skuPrice: number,\r\n documentUrlPath: string,\r\n list: string = '',\r\n) => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n const data = {\r\n event: 'addToCart'\r\n ,ecommerce: {\r\n currencyCode: 'USD'\r\n ,add: {\r\n products: [\r\n {\r\n name: documentName\r\n ,id: skuNumber\r\n ,price: skuPrice\r\n ,variant: 'NONE'\r\n ,quantity: 1\r\n ,category: getCategoryFromURL(documentUrlPath)\r\n }\r\n ],\r\n }\r\n }\r\n };\r\n\r\n if(list){\r\n // @ts-ignore\r\n data.ecommerce.add.actionField = { list, };\r\n }\r\n\r\n window.dataLayer.push(data);\r\n};\r\n\r\n/**\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-1143\r\n * Edited by Raz Liveyatan, 04.11.2021\r\n * Migrated by Raz Liveyatan, 27.06.2022\r\n * send page view to the gtm\r\n * @param {any} PageViewObject\r\n */\r\nexport const sendGaPageView = (PageViewObject:any) => {\r\n\r\n if(!window.dataLayer || !PageViewObject) return;\r\n\r\n window.dataLayer.push({\r\n event: 'pageview',\r\n page: {\r\n path: PageViewObject.pageLocation,\r\n title: PageViewObject.title\r\n }\r\n });\r\n};\r\n\r\n","import { getGdprCookie } from '../../projects/gdpr/domain/gdpr-provider';\r\nimport { gtmCreateAccount } from './gtm-provider';\r\nimport { initAdwords } from './adwords-provider';\r\nimport { tiktokCreateAccount } from './tiktok-provider';\r\nimport { outbrainRegistrationEvent } from './outbrain-provider';\r\nimport { impactRadiusCreateAccount } from './impact-radius-provider';\r\n\r\nexport const sendRegistrationEvents = async () => {\r\n\r\n const gdpr = getGdprCookie();\r\n const isPerformance = gdpr.IsPerformance;\r\n const isMarketing = gdpr.IsMarketing;\r\n\r\n // send data to GTM after registration\r\n gtmCreateAccount();\r\n\r\n if(isMarketing){\r\n\r\n // init adwords script\r\n initAdwords();\r\n\r\n // Marketing create account events.\r\n tiktokCreateAccount();\r\n outbrainRegistrationEvent();\r\n }\r\n\r\n if(isPerformance){\r\n // impact radius\r\n impactRadiusCreateAccount();\r\n }\r\n};","/**\r\n * init adwords\r\n */\r\nexport const initAdwords = () => {\r\n const img = document.createElement('img');\r\n img.style.borderStyle = 'none';\r\n img.setAttribute('src', '//www.googleadservices.com/pagead/conversion/871411056/?label=V3bRCPqigHEQ8NrCnwM&guid=ON&script=0');\r\n img.setAttribute('height', '1');\r\n img.setAttribute('width', '1');\r\n document.body.appendChild(img);\r\n};","import { getHiddenDataString } from '../hidden-data-provider';\r\nimport { ICartData } from '../../projects/shopping-cart/cart-bridger-pay/interfaces';\r\n\r\n/**\r\n * Allows to TypeScript recognize TikTok namespace\r\n */\r\ndeclare global {\r\n interface Window {\r\n ttq: any;\r\n tiktokProductPagesViewContent: any;\r\n }\r\n}\r\n\r\n/**\r\n * add to cart\r\n */\r\nexport const tiktokAddToCart = (cartData: ICartData) => {\r\n\r\n if(!window.ttq ||\r\n !cartData.addedProductSKUID ||\r\n !cartData.cartItems) return;\r\n\r\n const cartItem = cartData.cartItems.find((item => item.skuid === cartData.addedProductSKUID));\r\n if(!cartItem) return;\r\n\r\n window.ttq.track('AddToCart', {\r\n content_id: cartItem.skuNumber,\r\n content_type: 'product',\r\n content_name: cartItem.skuName,\r\n content_category: cartItem.departmentName, // (product category: plugins, bundles, etc...)\r\n quantity: 1,\r\n price: cartItem.skuPrice,\r\n value: cartData.priceData.totalPrice,\r\n currency: 'USD',\r\n });\r\n};\r\n\r\n/**\r\n * lead\r\n */\r\nexport const tiktokLead = () => {\r\n if(!window.ttq) return;\r\n window.ttq.track('Subscribe');\r\n};\r\n\r\n/**\r\n * create account\r\n */\r\nexport const tiktokCreateAccount = () => {\r\n if(!window.ttq) return;\r\n window.ttq.track('CompleteRegistration');\r\n};\r\n\r\n/**\r\n * purchase\r\n */\r\nexport const tiktokPurchase = () => {\r\n if(!window.ttq) return;\r\n window.ttq.track('PlaceAnOrder');\r\n};\r\n\r\nexport const tiktokProductPagesViewContent = () => {\r\n if(!window.ttq) return;\r\n\r\n const jsonString = getHiddenDataString('efs-data');\r\n let json = null;\r\n\r\n try{\r\n json = JSON.parse(jsonString);\r\n }\r\n catch(ex){}\r\n\r\n if(!json || !Array.isArray(json) || json.length <= 0) return;\r\n\r\n const product = json[0];\r\n if(product.skuNumber && product.skuPrice > 0){\r\n\r\n window.ttq.track('ViewContent', {\r\n content_id: product.skuNumber,\r\n content_type: 'product',\r\n content_name: product.documentName,\r\n content_category: product.departmentID,\r\n quantity: 1,\r\n price: product.skuPrice,\r\n currency: 'USD'\r\n });\r\n }\r\n};\r\n","// Outbrain Pixel\r\n// https://wavesaudio.atlassian.net/browse/DSWEB-4134\r\n\r\nimport { getGdprCookie } from '../../projects/gdpr/domain/gdpr-provider';\r\n\r\ndeclare global {\r\n interface Window {\r\n obApi: any;\r\n }\r\n}\r\n\r\nexport const outbrainPurchaseEvent = () => {\r\n if(!window.obApi) return;\r\n\r\n const gdpr = getGdprCookie();\r\n if(!gdpr.IsMarketing) return;\r\n\r\n window.obApi('track', 'Purchase');\r\n console.log('outbrain purchase event');\r\n};\r\n\r\nexport const outbrainAddToCartEvent = () => {\r\n if(!window.obApi) return;\r\n\r\n const gdpr = getGdprCookie();\r\n if(!gdpr.IsMarketing) return;\r\n\r\n window.obApi('track', 'Add to cart');\r\n console.log('outbrain add to cart event');\r\n};\r\n\r\nexport const outbrainRegistrationEvent = () => {\r\n if(!window.obApi) return;\r\n\r\n const gdpr = getGdprCookie();\r\n if(!gdpr.IsMarketing) return;\r\n\r\n window.obApi('track', 'Registration');\r\n console.log('outbrain registration event');\r\n};\r\n\r\nexport const outbrainLead = () => {\r\n if(!window.obApi) return;\r\n window.obApi('track', 'Email sign up');\r\n};","import { guid } from '../common';\r\nimport { IOrder } from '../../projects/shopping-cart/cart-thank-you/interfaces';\r\nimport { round2DecimalPlaces } from '../math-provider';\r\n\r\n/**\r\n * Allows to TypeScript recognize Impact Radius namespace\r\n */\r\ndeclare global {\r\n interface Window {\r\n ire: any;\r\n }\r\n}\r\n\r\n/**\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-344\r\n */\r\nexport const impactRadiusCreateAccount = () => {\r\n if(!window.ire) return;\r\n\r\n window.ire('trackConversion', 17226, {\r\n orderId: guid().replace(/-/g, ''), // GUID without dashes\r\n customerId: '',\r\n customerEmail: '',\r\n }, {verifySiteDefinitionMatch:true});\r\n};\r\n\r\nexport const impactRadiusThankYouPage = (orderData: IOrder) => {\r\n if(!window.ire) return;\r\n\r\n const impactRadiusData = {\r\n orderId: orderData.wavesReceiptID,\r\n customerId: orderData.wavesReceiptID,\r\n customerEmail: '',\r\n customerStatus: orderData.isOldUser ? 'Returning' : 'New', // : (Required) Use values of “New” or “Returning”. This value can be used to alter payouts. (AlphaNumeric 40)\r\n currencyCode: 'USD',\r\n orderDiscount: orderData.upsellDiscount,\r\n items: [] as any[],\r\n };\r\n\r\n if(orderData.orderItems){\r\n\r\n for(let i=0; i {\r\n\r\n /**\r\n * With Popup mode, you add a custom HTTP header to your requests,\r\n * and then on your server confirm it matches the expected value and origin.\r\n */\r\n const handleCredentialResponse = async (response: google.accounts.id.CredentialResponse) => {\r\n\r\n if(!response) return;\r\n\r\n try{\r\n const decoded = jwt_decode(response.credential) as IGoogleJwt;\r\n\r\n const isPersistent = true;\r\n\r\n const utm = getUTMFromStorage();\r\n\r\n const serverResponse = await externalLogin(\r\n ExternalLoginServiceEnum.Google,\r\n response.credential,\r\n decoded.sub,\r\n decoded.email,\r\n decoded.name,\r\n isShoppingCart ? ILoginReferrer.CartExternalLogin : ILoginReferrer.MainExternalLogin,\r\n isPersistent,\r\n !!isShoppingCart,\r\n localData,\r\n\r\n wavesAppDetectionData?.appCode,\r\n wavesAppDetectionData?.ts || 0,\r\n wavesAppDetectionData?.uuid,\r\n wavesAppDetectionData?.qs,\r\n\r\n // message gears -------\r\n getPageNodeGUID(),\r\n utm ? utm.firstSource : '',\r\n utm ? utm.firstMedium : '',\r\n utm ? utm.firstCampaign : '',\r\n utm ? utm.lastSource : '',\r\n utm ? utm.lastMedium : '',\r\n utm ? utm.lastCampaign : '',\r\n );\r\n\r\n if(\r\n !serverResponse ||\r\n serverResponse.statusCode !== 200 ||\r\n !serverResponse.data.isValid){\r\n document.body.dispatchEvent(new CustomEvent(GOOGLE_ERROR, {\r\n detail: serverResponse\r\n }));\r\n return;\r\n }\r\n\r\n // All is well -----------------\r\n\r\n const isExistingUser = serverResponse?.data?.relatedData?.isExistingUser ?? false;\r\n\r\n if(!isExistingUser) {\r\n await sendRegistrationEvents();\r\n }\r\n\r\n if(isWavesApp || isShoppingCart) {\r\n document.body.dispatchEvent(new CustomEvent(GOOGLE_SIGNED_IN, {\r\n detail: serverResponse,\r\n }))\r\n }\r\n else{\r\n redirectAfterLogin();\r\n }\r\n }\r\n catch (ex) {\r\n console.log(ex);\r\n }\r\n };\r\n\r\n window.onload = () => {\r\n\r\n // The google.accounts.id.initialize method should be called only once,\r\n // even if you use both One Tap and button in the same web page.\r\n google.accounts.id.initialize({\r\n client_id: '429317021265-opt92t3o43q0rh84g6mans6bs4747lrk.apps.googleusercontent.com',\r\n callback: handleCredentialResponse,\r\n\r\n // Enables FedCM (Important for third-party cookie deprecation)\r\n // \"itp_support: true\" ensures compatibility with FedCM even when third-party cookies are blocked.\r\n // This tells Google to use the new browser-native sign-in flow when supported.\r\n // itp_support: true,\r\n });\r\n\r\n if(!isShoppingCart) {\r\n document.body.dispatchEvent(new CustomEvent(GOOGLE_SIGN_IN_INITIALIZED));\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * https://developers.google.com/identity/gsi/web/reference/js-reference#google.accounts.id.disableAutoSelect\r\n * When the user signs out of your website, you need to call the method google.accounts.id.disableAutoSelect\r\n * to record the status in cookies. This prevents a UX dead loop.\r\n */\r\nexport const googleSignOut = () => {\r\n if(!window.google || !window.google.accounts || !window.google.accounts.id) return;\r\n window.google.accounts.id.disableAutoSelect();\r\n};\r\n","/**\r\n * Allows to TypeScript recognize Facebook namespace\r\n */\r\ndeclare global {\r\n interface Window {\r\n fbq: any;\r\n facebookProductPagesViewContent: any;\r\n fbAsyncInit: Function;\r\n }\r\n}\r\n\r\nexport {}\r\n\r\nexport enum EFacebookStatus {\r\n Error = -1,\r\n LoggedIn = 0,\r\n}\r\n\r\nexport interface IFacebookResponse {\r\n status: EFacebookStatus,\r\n accessToken: string,\r\n userID: string,\r\n}\r\n\r\nexport interface IFacebookUser {\r\n name: string;\r\n email: string;\r\n}\r\n","/**\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-3399\r\n * https://developers.facebook.com/docs/facebook-login/web\r\n */\r\n\r\n/** ------------------------------- APIs ---------------------------------------------- **/\r\n\r\nimport { EFacebookStatus, IFacebookResponse, IFacebookUser } from './facebook-types';\r\n\r\n/**\r\n * Check Login Status of a Person\r\n * -------------------------------\r\n * The first step when your webpage loads is determining\r\n * if a person is already logged into your webpage with Facebook Login.\r\n * A call to FB.getLoginStatus starts a call to Facebook to get the login status.\r\n * Facebook then calls your callback function with the results.\r\n */\r\nexport const checkFacebookLoginStatus = () : Promise => {\r\n return new Promise((resolve, _reject) => {\r\n window.FB.getLoginStatus((response) => {\r\n resolve(response);\r\n }, true);\r\n });\r\n\r\n /*\r\n Response example:\r\n -----------------\r\n {\r\n status: 'connected',\r\n authResponse: {\r\n accessToken: '{access-token}',\r\n expiresIn:'{unix-timestamp}',\r\n reauthorize_required_in:'{seconds-until-token-expires}',\r\n signedRequest:'{signed-parameter}',\r\n userID:'{user-id}'\r\n }\r\n }\r\n */\r\n};\r\n\r\n/**\r\n * Log In with the Javascript SDK Login Dialog\r\n */\r\nexport const facebookLogin = () : Promise => {\r\n return new Promise((resolve, _reject) => {\r\n FB.login((response) => {\r\n resolve(response);\r\n }, {\r\n // https://developers.facebook.com/docs/permissions\r\n scope: 'public_profile,email'\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * Log a Person Out.\r\n * This function call may also log the person out of Facebook.\r\n * Additionally, logging out of your webpage does not revoking permissions\r\n * the person granted your webpage during login.\r\n */\r\nexport const facebookLogOut = () : Promise => {\r\n try{\r\n if(window.localStorage) {\r\n for(let i = window.localStorage.length - 1; i>=0; i--) {\r\n const key = window.localStorage.key(i) || '';\r\n if(key.startsWith('fblst_')) {\r\n window.localStorage.removeItem(key);\r\n }\r\n }\r\n }\r\n }\r\n catch (ex){}\r\n\r\n try{\r\n if(window.sessionStorage) {\r\n for(let i = window.sessionStorage.length - 1; i>=0; i--) {\r\n const key = window.sessionStorage.key(i) || '';\r\n if(key.startsWith('fbssls_')) {\r\n window.sessionStorage.removeItem(key);\r\n }\r\n }\r\n }\r\n }\r\n catch (ex){}\r\n\r\n return new Promise((resolve, _reject) => {\r\n window?.FB?.logout((response) => {\r\n resolve(response);\r\n });\r\n });\r\n};\r\n\r\nexport const getUserData = () : Promise => {\r\n return new Promise((resolve, _reject) => {\r\n FB.api('/me', {\r\n fields: 'email,name'\r\n }, (response) => {\r\n resolve(response as IFacebookUser);\r\n });\r\n });\r\n};\r\n\r\nexport const initFacebookForLogin = () => {\r\n window.fbAsyncInit = ()=> {\r\n\r\n // https://developers.facebook.com/docs/javascript/reference/FB.init/v18.0\r\n FB.init({\r\n appId : '546402627632636',\r\n cookie : true, // Enable cookies to allow the server to access the session.\r\n xfbml : true, // Parse social plugins on this webpage.\r\n version : 'v18.0', // Use this Graph API version for this call.\r\n status : false,\r\n });\r\n };\r\n\r\n (function(d, s, id){\r\n var js, fjs = d.getElementsByTagName(s)[0];\r\n if (d.getElementById(id)) {return;}\r\n js = d.createElement(s); js.id = id;\r\n // @ts-ignore\r\n js.src = 'https://connect.facebook.net/en_US/sdk.js';\r\n // @ts-ignore\r\n fjs.parentNode.insertBefore(js, fjs);\r\n }(document, 'script', 'facebook-jssdk'));\r\n};\r\n\r\n/** ------------------------------- Flows ---------------------------------------------- **/\r\n\r\n\r\nexport const facebookSingInOrSignUpFlow = async () : Promise => {\r\n try{\r\n const statusResponse = await checkFacebookLoginStatus();\r\n\r\n //console.log('statusResponse', statusResponse)\r\n\r\n if(statusResponse.status === 'connected' && !!statusResponse.authResponse) {\r\n\r\n return {\r\n status: EFacebookStatus.LoggedIn,\r\n accessToken: statusResponse.authResponse.accessToken,\r\n userID: statusResponse.authResponse.userID,\r\n };\r\n }\r\n\r\n const loginResponse = await facebookLogin();\r\n\r\n //console.log('loginResponse', loginResponse)\r\n if(loginResponse.status !== 'connected' || !loginResponse.authResponse){\r\n return {\r\n status: EFacebookStatus.Error,\r\n accessToken: '',\r\n userID: '',\r\n };\r\n }\r\n\r\n return {\r\n status: EFacebookStatus.LoggedIn,\r\n accessToken: loginResponse.authResponse.accessToken,\r\n userID: loginResponse.authResponse.userID,\r\n };\r\n }\r\n catch (ex){\r\n console.error(ex);\r\n return null;\r\n }\r\n};\r\n","import { get, post } from '../../../DAL/data-provider';\r\nimport { IServerValidation } from '../../../domain/validation/interfaces';\r\nimport { CreateAccountReferrer } from '../enums/create-account-referrer';\r\nimport { ILocalDataRequest } from '../../shopping-cart/cart-bridger-pay/interfaces';\r\nimport { IsAuthReferrer } from '../enums/is-auth-referrer';\r\nimport { SELECTED_PAYMENT_TAB_STORAGE_KEY } from '../../shopping-cart/cart-bridger-pay/domain/shopping-cart-provider';\r\nimport { ExternalLoginServiceEnum } from '../enums/external-service-enum';\r\nimport { googleSignOut } from '../../../domain/google/google-login-provider';\r\nimport { facebookLogOut } from '../../../domain/facebook/facebook-login-provider';\r\nimport { getSettingFromHtml } from '../../../domain/common';\r\n\r\nexport enum ILoginReferrer {\r\n LoginPage = 0,\r\n CartPage = 1,\r\n MainExternalLogin = 5,\r\n CartExternalLogin = 6,\r\n}\r\n\r\n/**\r\n * perform login\r\n */\r\nexport const login = async (\r\n referrer: ILoginReferrer,\r\n userName: string,\r\n password: string,\r\n isPersistent: boolean,\r\n captchaCode: string,\r\n recaptchaVersion: number,\r\n localData?: ILocalDataRequest,\r\n wavesAppCode = '',\r\n wavesAppTimeToken = 0,\r\n wavesUserGuid = '',\r\n wavesAppLoginToken = ''\r\n) : Promise<{data: IServerValidation, statusCode: number }> => {\r\n\r\n return post('/api/membership/login', {\r\n userName,\r\n password,\r\n isPersistent,\r\n captchaCode,\r\n recaptchaVersion,\r\n\r\n referrer,\r\n shipAddressLine: localData?.shipAddressLine,\r\n shipCity: localData?.shipCity,\r\n shipZipCode: localData?.shipZipCode,\r\n shipCountry2LetterCode: localData?.shipCountry2LetterCode,\r\n shipState2LetterCode: localData?.shipState2LetterCode,\r\n shippingCode: localData?.shippingCode,\r\n\r\n taxCountry2LetterCode: localData?.taxCountry2LetterCode,\r\n taxState2LetterCode: localData?.taxState2LetterCode,\r\n taxZipCode: localData?.taxZipCode,\r\n\r\n wavesAppCode,\r\n wavesAppTimeToken,\r\n wavesUserGuid,\r\n wavesAppLoginToken,\r\n });\r\n};\r\n\r\nexport const externalLogin = async (\r\n externalService: ExternalLoginServiceEnum,\r\n accessToken: string,\r\n userID: string,\r\n email: string,\r\n name: string,\r\n referrer: ILoginReferrer,\r\n isPersistent: boolean,\r\n isShoppingCart: boolean,\r\n\r\n localData?: ILocalDataRequest,\r\n wavesAppCode = '',\r\n wavesAppTimeToken = 0,\r\n wavesUserGuid = '',\r\n wavesAppLoginToken = '',\r\n\r\n // message gears -------\r\n pageNodeGUID?: string,\r\n firstUTMSource?: string,\r\n firstUTMMedium?: string,\r\n firstUTMCampaign?: string,\r\n lastUTMSource?: string,\r\n lastUTMMedium?: string,\r\n lastUTMCampaign?: string\r\n) : Promise<{ data: IServerValidation, statusCode: number }> => {\r\n\r\n return post('/api/membership/external-login', {\r\n externalService,\r\n accessToken,\r\n userID,\r\n email,\r\n name,\r\n\r\n isPersistent,\r\n isShoppingCart,\r\n referrer,\r\n\r\n shipAddressLine: localData?.shipAddressLine,\r\n shipCity: localData?.shipCity,\r\n shipZipCode: localData?.shipZipCode,\r\n shipCountry2LetterCode: localData?.shipCountry2LetterCode,\r\n shipState2LetterCode: localData?.shipState2LetterCode,\r\n shippingCode: localData?.shippingCode,\r\n\r\n taxCountry2LetterCode: localData?.taxCountry2LetterCode,\r\n taxState2LetterCode: localData?.taxState2LetterCode,\r\n taxZipCode: localData?.taxZipCode,\r\n\r\n wavesAppCode,\r\n wavesAppTimeToken,\r\n wavesUserGuid,\r\n wavesAppLoginToken,\r\n\r\n pageNodeGUID,\r\n firstUTMSource,\r\n firstUTMMedium,\r\n firstUTMCampaign,\r\n lastUTMSource,\r\n lastUTMMedium,\r\n lastUTMCampaign,\r\n });\r\n};\r\n\r\n/**\r\n * perform create account\r\n */\r\nexport const createAccount = async (\r\n referrer: CreateAccountReferrer,\r\n email: string,\r\n password: string,\r\n captchaCode: string,\r\n recaptchaVersion: number,\r\n\r\n // message gears -------\r\n pageNodeGUID?: string,\r\n firstUTMSource?: string,\r\n firstUTMMedium?: string,\r\n firstUTMCampaign?: string,\r\n lastUTMSource?: string,\r\n lastUTMMedium?: string,\r\n lastUTMCampaign?: string\r\n) : Promise<{data: IServerValidation, statusCode: number }> => {\r\n\r\n return post('/api/membership/create-account', {\r\n referrer,\r\n email,\r\n password,\r\n captchaCode,\r\n recaptchaVersion,\r\n pageNodeGUID,\r\n productGUID: getSettingFromHtml('product-guid'),\r\n firstUTMSource,\r\n firstUTMMedium,\r\n firstUTMCampaign,\r\n lastUTMSource,\r\n lastUTMMedium,\r\n lastUTMCampaign,\r\n });\r\n};\r\n\r\nexport const logout = async () => {\r\n try{\r\n window.sessionStorage.removeItem(SELECTED_PAYMENT_TAB_STORAGE_KEY);\r\n }\r\n catch(ex){}\r\n\r\n try{\r\n googleSignOut();\r\n }\r\n catch (ex){}\r\n\r\n try{\r\n facebookLogOut();\r\n }\r\n catch (ex){}\r\n\r\n return post('/api/membership/logout', {});\r\n};\r\n\r\nexport const logoutFromAllDevices = async () => {\r\n try{\r\n window.sessionStorage.removeItem(SELECTED_PAYMENT_TAB_STORAGE_KEY);\r\n }\r\n catch(ex){}\r\n\r\n try{\r\n googleSignOut();\r\n }\r\n catch (ex){}\r\n\r\n try{\r\n facebookLogOut();\r\n }\r\n catch (ex){}\r\n\r\n return post('/api/membership/logout-all-devices', {});\r\n};\r\n\r\n/**\r\n * resend activation email\r\n */\r\nexport const resendActivationEmail = async (captchaCode: string, recaptchaVersion: number) : Promise<{data: IServerValidation, statusCode: number }> => {\r\n return post('/api/membership/resend-activation-email', {\r\n captchaCode,\r\n recaptchaVersion,\r\n });\r\n};\r\n\r\n/**\r\n * update email\r\n */\r\nexport const updateEmail = async (\r\n newEmail: string,\r\n captchaCode: string,\r\n recaptchaVersion: number,\r\n) : Promise<{data: IServerValidation, statusCode: number }> => {\r\n\r\n return post('/api/membership/update-email', {\r\n newEmail,\r\n captchaCode,\r\n recaptchaVersion,\r\n });\r\n};\r\n\r\n/**\r\n * get email preferences\r\n */\r\nexport const getEmailPreferences = async (recipientGUID?: string) => {\r\n\r\n let url = '/api/messagegears/email-preferences';\r\n\r\n if(recipientGUID){\r\n url = `${ url }?guid=${ recipientGUID }`;\r\n }\r\n\r\n return get(url);\r\n};\r\n\r\n/**\r\n * update email preferences\r\n */\r\nexport const setEmailPreferences = async (recipientGUID: string, newsletterID: number, isSelected: boolean) : Promise<{data: IServerValidation, statusCode: number }> => {\r\n return post('/api/messagegears/set-email-preferences', {\r\n recipientGUID,\r\n newsletterID,\r\n isSelected\r\n });\r\n};\r\n\r\n/**\r\n * unsubscribe from all newsletters\r\n * https://dev13.waves.com/email-preferences?guid=9C12F487-58F3-478A-AC28-9D01F2557A49&unsub=http%3A%2F%2Ftrack.waves-audio.com%2Fuc%2F3%2FeyJhaSI6MjczNjMyNjEsImUiOiJpZGFuQHdhdmVzLmNvbSIsInJpIjoiNCIsInJxIjoiMDItdDIyMDgxLWQyNjE2YTAzZjU4NjQ5OTViMWIzMDIxYzcyZmY2ZDM1IiwicGgiOm51bGwsIm0iOmZhbHNlfQ%2F6L_jR0-bdCQpbPebxD8fOA&utm_campaifgn=unsubscribe\r\n */\r\nexport const unsubscribe = async (unsub: string, recipientGUID: string) => {\r\n return post('/api/messagegears/unsubscribe', {\r\n recipientGUID,\r\n unsub,\r\n });\r\n};\r\n\r\n/**\r\n * check if user is authenticated\r\n */\r\nexport const isAuthenticated = async (referrer: IsAuthReferrer, localData?: ILocalDataRequest) => {\r\n return post('/api/membership/is-authenticated', {\r\n referrer,\r\n\r\n shipAddressLine: localData?.shipAddressLine,\r\n shipCity: localData?.shipCity,\r\n shipZipCode: localData?.shipZipCode,\r\n shipCountry2LetterCode: localData?.shipCountry2LetterCode,\r\n shipState2LetterCode: localData?.shipState2LetterCode,\r\n shippingCode: localData?.shippingCode,\r\n\r\n taxCountry2LetterCode: localData?.taxCountry2LetterCode,\r\n taxState2LetterCode: localData?.taxState2LetterCode,\r\n taxZipCode: localData?.taxZipCode,\r\n\r\n taxID: localData?.taxID,\r\n });\r\n};\r\n\r\n/**\r\n * change password\r\n */\r\nexport const changePassword = async (\r\n currentPassword: string,\r\n newPassword: string,\r\n confirmPassword: string\r\n) : Promise<{data: IServerValidation, statusCode: number }> => {\r\n\r\n return post('/api/membership/change-password', {\r\n currentPassword,\r\n newPassword,\r\n confirmPassword,\r\n });\r\n};\r\n\r\n/**\r\n * forgot password\r\n */\r\nexport const forgotPassword = async (\r\n userNameOrEmail: string,\r\n isEmail: boolean,\r\n captchaCode: string,\r\n recaptchaVersion: number,\r\n) : Promise<{data: IServerValidation, statusCode: number }> => {\r\n\r\n return post('/api/membership/forgot-password', {\r\n userNameOrEmail,\r\n isEmail,\r\n captchaCode,\r\n recaptchaVersion,\r\n });\r\n};\r\n\r\nexport const validateResetPassword = async (isCancel: boolean, hash: string, id: string) => {\r\n return get('/api/membership/reset-password', {\r\n isCancel,\r\n hash,\r\n id,\r\n });\r\n};\r\n\r\nexport const resetPassword = async (\r\n hash: string,\r\n id: string,\r\n password: string,\r\n confirmPassword: string,\r\n captchaCode: string,\r\n recaptchaVersion: number,\r\n) : Promise<{data: IServerValidation, statusCode: number }> => {\r\n\r\n return post('/api/membership/reset-password', {\r\n hash,\r\n id,\r\n password,\r\n confirmPassword,\r\n captchaCode,\r\n recaptchaVersion,\r\n });\r\n};\r\n\r\nexport const sendPluginsBIConsent = async () => {\r\n return post('/api/membership/pluginsbi-consent', {});\r\n};\r\n\r\n","import { ICartData, ICartItem } from '../interfaces';\r\nimport { getQueryString } from '../../../../domain/url-provider';\r\nimport { ProductDepartmentEnum } from '../../../products/enums/product-department-enum';\r\nimport { format } from 'date-fns';\r\nimport { LastPaymentOption } from '../enums/last-payment-option-enum';\r\nimport { PaymentTabsEnum } from '../enums/payment-tabs-enum';\r\nimport { CreditCardServiceEnum } from '../enums/credit-card-service-enum';\r\nimport { getFromStorage } from '../../../../DAL/storage-provider';\r\nimport { checkIfPaypalIsVisible } from '../../cart-shared-bridger-pay/domain/bridger-pay-provider';\r\nimport { IOrder } from '../../cart-thank-you/interfaces';\r\n\r\nexport const SELECTED_PAYMENT_TAB_STORAGE_KEY = 'selected-payment-tab-key';\r\nexport const FIELD_DEBOUNCE_DURATION = 500;\r\n\r\n/**\r\n * Remove 'productid' from query string (if exists),\r\n * otherwise, the same product could be added multiple times.\r\n * The main 'productid' logic occurs on server side.\r\n * For in-app, remove all the relevant query strings.\r\n * For cart reconstruction, like /cart?sku477=2&sku355=3, remove all\r\n * keys starting with 'sku'\r\n */\r\nexport const removeQueryStringsOnLoad = () => {\r\n const qs = getQueryString(window.location.search, false);\r\n const url = new URL(window.location.href.toLowerCase());\r\n let changed = false;\r\n\r\n const set = new Set(['productid', 'sessiontoken', 'userguid', 'purchasetoken', 'appcode']);\r\n\r\n for(let key of Object.keys(qs)){\r\n\r\n // URLSearchParams keys are case sensitive !!!\r\n const formattedKey = key.toLowerCase().trim();\r\n\r\n if(set.has(formattedKey) || formattedKey.startsWith('sku')){\r\n url.searchParams.delete(key);\r\n changed = true;\r\n }\r\n }\r\n\r\n if(changed){\r\n window.history.replaceState({}, '', url.toString());\r\n }\r\n};\r\n\r\n/**\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-3288\r\n */\r\nexport const isCartStep3PPCC50AbTest = (cartData: ICartData) => {\r\n\r\n const isNoLastPaymentAndUs =\r\n !cartData.lastPaymentOption &&\r\n !!cartData.maxMindAddress &&\r\n cartData.maxMindAddress.countryCode === 'US';\r\n\r\n if(!isNoLastPaymentAndUs) return false;\r\n\r\n const isZeroPurchase = cartData.priceData.totalPrice < 1 && !checkIsSubscription(cartData);\r\n if(isZeroPurchase) return false;\r\n\r\n if(\r\n cartData.creditCardService === CreditCardServiceEnum.FirstData &&\r\n cartData.priceData.totalPrice <= 21.15) return false;\r\n\r\n return true;\r\n};\r\n\r\n/**\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-3278\r\n */\r\nexport const getInitialSelectedPaymentTab = (cartData: ICartData) : PaymentTabsEnum => {\r\n\r\n try{\r\n const isSubscription = checkIsSubscription(cartData);\r\n const isPaypalTabVisible = checkIfPaypalIsVisible(isSubscription);\r\n if(!isPaypalTabVisible) {\r\n return PaymentTabsEnum.CreditCard;\r\n }\r\n }\r\n catch (ex) {\r\n console.log(ex);\r\n }\r\n\r\n let restored = getFromStorage('session-storage', SELECTED_PAYMENT_TAB_STORAGE_KEY);\r\n if(restored !== null && (\r\n Number(restored) === PaymentTabsEnum.CreditCard ||\r\n Number(restored) === PaymentTabsEnum.PayPal ||\r\n Number(restored) === PaymentTabsEnum.AliPay\r\n )){\r\n return Number(restored) as PaymentTabsEnum;\r\n }\r\n\r\n if(isCartStep3PPCC50AbTest(cartData)) {\r\n return PaymentTabsEnum.PayPal;\r\n }\r\n\r\n switch (cartData.lastPaymentOption) {\r\n case LastPaymentOption.AliPay: {\r\n return PaymentTabsEnum.AliPay;\r\n }\r\n\r\n case LastPaymentOption.PayPal: {\r\n return PaymentTabsEnum.PayPal;\r\n }\r\n }\r\n\r\n return PaymentTabsEnum.CreditCard;\r\n};\r\n\r\nexport const checkIsSubscription = (cartData: ICartData) => {\r\n const active = cartData.cartItems.filter(cartItem => cartItem.isActive);\r\n\r\n return active.length === 1 &&\r\n (active[0].skuDepartmentID === ProductDepartmentEnum.Subscription ||\r\n active[0].skuDepartmentID === ProductDepartmentEnum.SubscriptionDynamic);\r\n};\r\n\r\nexport const getExpectedLTV = (cartData: IOrder) => {\r\n const found = cartData?.orderItems?.find(cartItem => cartItem.expectedLTV > 0);\r\n return found ? found.expectedLTV : 0;\r\n};\r\n\r\nexport const getWupDate = (cartItem: ICartItem) => {\r\n if(!cartItem.targetWUPEndDate) return '';\r\n\r\n try{\r\n return format(new Date(cartItem.targetWUPEndDate),'MMM dd, yyyy')\r\n }\r\n catch(ex){\r\n console.log(ex, `\"${ cartItem.targetWUPEndDate }\" is wrong.`);\r\n }\r\n\r\n return '';\r\n};\r\n\r\nexport const getProductsCount = (cartItems: ICartItem[]) => {\r\n let count = 0;\r\n for(const item of cartItems) {\r\n if(!item.isActive) continue;\r\n count += item.skuUnits;\r\n }\r\n return count;\r\n};\r\n","import React from 'react';\r\n\r\nexport interface ValidationErrorsProps {\r\n errors: string[],\r\n defaultError?: string,\r\n qa?: string,\r\n}\r\n\r\n/**\r\n * Validation Errors\r\n */\r\nexport const ValidationErrors = (props: ValidationErrorsProps) => {\r\n\r\n const hasErrors = props.errors && props.errors.length > 0;\r\n const defaultError = props.defaultError ?? 'An error has occurred.';\r\n return (\r\n <>\r\n { !hasErrors &&
{ defaultError }
}\r\n\r\n {\r\n hasErrors && (\r\n
\r\n {\r\n props.errors.map((error, i) => {\r\n return \r\n })\r\n }\r\n
\r\n )\r\n }\r\n \r\n )\r\n};\r\n\r\nexport default ValidationErrors;","import React from 'react';\r\nimport { IIconProps } from '../interfaces';\r\n\r\nconst RefreshIcon = (props: IIconProps) => {\r\n return (\r\n \r\n { props.title && { props.title } }\r\n \r\n \r\n\r\n )\r\n};\r\n\r\nexport default RefreshIcon;\r\n","import React, { useCallback, useEffect, useState } from 'react';\r\nimport RefreshIcon from '../../ui/svg/common/refresh';\r\n\r\n/* Usage:\r\n-------------\r\nconst [simpleCaptchaCode, setSimpleCaptchaCode] = useState('');\r\nconst [simpleCaptchaAttempts, setSimpleCaptchaAttempts] = useState(0);\r\n\r\n\r\n\r\nOR version with validation\r\n------------------------------------------------------------------\r\nconst simpleCaptchaControl = createControl('simpleCaptcha', '', {\r\n required: true\r\n});\r\n\r\nconst [simpleCaptchaCode, setSimpleCaptchaCode] = useState(simpleCaptchaControl);\r\nconst [simpleCaptchaAttempts, setSimpleCaptchaAttempts] = useState(0);\r\n\r\n
\r\n {\r\n setSimpleCaptchaCode((updateControl(simpleCaptchaCode, value)));\r\n }}\r\n />\r\n
\r\n\r\n
\r\n {\r\n !simpleCaptchaCode.isValid &&
{ simpleCaptchaCode.error }
\r\n }\r\n
\r\n*/\r\n\r\nexport interface SimpleCaptchaProps{\r\n index?: number,\r\n setSimpleCaptchaCode: Function,\r\n simpleCaptchaCode: string,\r\n simpleCaptchaAttempts: number,\r\n}\r\n\r\n/**\r\n * Client side validation error\r\n */\r\nexport const getSimpleCaptchaValidationError = () => {\r\n return 'Please enter the security code.';\r\n};\r\n\r\n/**\r\n * to reset China captcha, it should be re-rendered with a new timestamp\r\n */\r\nconst getChinaCaptchaTimestamp = () => {\r\n return (new Date()).getTime();\r\n};\r\n\r\n/**\r\n * generate captcha image source\r\n */\r\nconst getSrc = (timestamp: number, index?: number) => {\r\n return `/api/simplecaptcha/render?index=${ index ?? 0 }&t=${ timestamp }`;\r\n};\r\n\r\n/**\r\n * Simple captcha - used for China\r\n */\r\nconst SimpleCaptcha: React.FC = (props) => {\r\n\r\n const [src, setSrc] = useState(getSrc(getChinaCaptchaTimestamp(), props.index));\r\n const { simpleCaptchaAttempts } = props;\r\n\r\n /**\r\n * refresh the captcha\r\n */\r\n const refresh = useCallback(() => {\r\n\r\n // rerender the image\r\n setSrc(getSrc(getChinaCaptchaTimestamp(), props.index));\r\n }, [props.index]);\r\n\r\n /**\r\n * re-render recaptcha on fail / ok\r\n */\r\n useEffect(() => {\r\n if(simpleCaptchaAttempts > 0) {\r\n refresh();\r\n }\r\n }, [simpleCaptchaAttempts, refresh]);\r\n\r\n return (\r\n
\r\n
\r\n \r\n\r\n \r\n \r\n \r\n
\r\n\r\n

Type the characters above:

\r\n\r\n {\r\n props.setSimpleCaptchaCode(evt.target.value);\r\n }}\r\n />\r\n
\r\n )\r\n};\r\n\r\nexport default SimpleCaptcha;","import { getEnvironment, getHiddenDataString } from '../hidden-data-provider';\r\n\r\n// this error is printed when google recaptcha script is not added to the master page,\r\n// site key is wrong in case of race condition between google and waves scripts\r\nconst NOT_DEFINED_ERR = 'Recaptcha is not defined.';\r\n\r\n// this error is printed when the hidden div with recaptcha key is missing\r\nconst SITE_KEY_ERR = 'Recaptcha site key is not printed in HTML.';\r\n\r\n// ------------------------- Recaptcha v3 --------------------------------------------\r\n\r\n/**\r\n * returns recaptcha site ket by its version\r\n */\r\nexport const getRecaptchaSiteKey = (version = 3) => {\r\n\r\n const env = getEnvironment();\r\n\r\n // recaptcha for automation\r\n // https://wavesaudio.atlassian.net/browse/DSWEB-540\r\n if(\r\n version !== 3 &&\r\n (env === 'dev' || env === 'test') &&\r\n navigator.userAgent &&\r\n navigator.userAgent.trim().startsWith('WavesSelenium')){\r\n return getHiddenDataString('recaptcha2-automation');\r\n }\r\n\r\n // The recaptcha code is taken from the following hidden DIVs:\r\n //
6LeG-IcUAAAAAIb42eguHdUztlZNcrLPhuk81WSM
\r\n //
6LftoDMUAAAAAC9QpaYXNehGHSu__XxRJyFAIgkJ
\r\n return getHiddenDataString(`recaptcha${version}`);\r\n}\r\n\r\n/**\r\n * recaptcha v3 should be executed on each action that should be protected\r\n * the following script should be added to each page:\r\n * \r\n * reCAPTCHA tokens expire after two minutes, make sure to call execute when the user takes the action rather than on page load\r\n * also we should ensure that grecaptcha.ready callback happened\r\n *\r\n * Usage:\r\n * await executeRecaptcha3()\r\n */\r\nexport const executeRecaptcha3 = () => {\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n if (!window.grecaptcha) {\r\n reject(NOT_DEFINED_ERR);\r\n return;\r\n }\r\n\r\n window.grecaptcha.ready(() => {\r\n window.grecaptcha.execute(getRecaptchaSiteKey(3), {action: 'submit'}).then(token => {\r\n resolve(token);\r\n });\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * get recaptcha token\r\n * @param {number=} version of recaptcha\r\n * @return {string}\r\n */\r\nexport const getRecaptchaToken = async (version = 3) => {\r\n return version === 3 ? await executeRecaptcha3() : window.grecaptcha.getResponse();\r\n};\r\n\r\n// ------------------------- Recaptcha v2 --------------------------------------------\r\n\r\n/**\r\n * render recaptcha V2\r\n * containerID - the ID of an element that will contain recaptcha 2 HTML\r\n */\r\nexport const renderRecaptcha2 = (containerID: string) : Promise => {\r\n\r\n return new Promise((resolve, reject) => {\r\n\r\n if(!window.grecaptcha){\r\n reject(NOT_DEFINED_ERR);\r\n return;\r\n }\r\n\r\n const siteKeyV2 = getRecaptchaSiteKey(2);\r\n\r\n if(!siteKeyV2){\r\n reject(SITE_KEY_ERR);\r\n return;\r\n }\r\n\r\n window.grecaptcha.ready(() => {\r\n\r\n const widgetID = window.grecaptcha.render(containerID, {\r\n 'sitekey': siteKeyV2,\r\n //'badge': 'inline', //bottomright, bottomleft, inline\r\n //'size': 'invisible' //compact, normal, invisible\r\n });\r\n\r\n resolve(widgetID);\r\n });\r\n });\r\n};\r\n\r\n/**\r\n * reset recaptcha V2\r\n */\r\nexport const resetRecaptcha2 = () => {\r\n if(!window.grecaptcha) return;\r\n window.grecaptcha.reset();\r\n};\r\n\r\n\r\n/**\r\n * recaptcha 2 client side error\r\n */\r\nexport const getRecaptcha2Error = () => {\r\n return 'Please select the \"I\\'m not a robot\" checkbox.';\r\n};","/**\r\n * reCAPTCHA badge can be hidden, but reCAPTCHA branding should be included instead\r\n * https://developers.google.com/recaptcha/docs/faq#id-like-to-hide-the-recaptcha-badge.-what-is-allowed\r\n * @return {JSX.Element}\r\n */\r\nconst Recaptcha3Text = () => {\r\n\r\n return (\r\n
\r\n This site is protected by reCAPTCHA and the Google
Privacy Policy and Terms of Service apply.\r\n
\r\n );\r\n};\r\n\r\nexport default Recaptcha3Text;","import React from 'react';\r\nimport { IIconProps } from '../interfaces';\r\n\r\nconst WavesLogo = (props: IIconProps) => {\r\n\r\n const { width, height, classes } = props;\r\n\r\n return (\r\n \r\n Waves Audio\r\n \r\n )\r\n};\r\n\r\nexport default WavesLogo;\r\n","import React from 'react';\r\nimport { IIconProps } from '../interfaces';\r\n\r\nconst Preloader = (props : IIconProps) => {\r\n return (\r\n \r\n Loading...\r\n \r\n \r\n )\r\n};\r\n\r\nexport default Preloader;\r\n","import { useState } from 'react';\r\nimport WavesLogo from '../../../ui/svg/common/waves-logo';\r\nimport Preloader from '../../../ui/svg/common/preloader';\r\nimport { logout } from '../dal/data-provider';\r\n\r\ninterface ILogoutScreen {\r\n text? : string ,\r\n}\r\n\r\n/**\r\n * logout screen\r\n * used in login, create account, and other membership pages\r\n * when the user is already logged in\r\n */\r\nconst LogoutScreen = (props: ILogoutScreen) => {\r\n\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n /**\r\n * perform logout\r\n */\r\n const performLogout = async () => {\r\n\r\n setIsLoading(true);\r\n\r\n try{\r\n await logout();\r\n }\r\n catch (ex){\r\n console.log('Logout error:', ex);\r\n }\r\n\r\n window.location.reload();\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n
\r\n { props.text ? props.text : \"You're already logged in. If you need to log in with a different account, please sign out first.\" }\r\n
\r\n\r\n {\r\n isLoading &&\r\n
\r\n \r\n
\r\n }\r\n\r\n {\r\n !isLoading &&\r\n {\r\n await performLogout();\r\n }}\r\n >Sign Out\r\n }\r\n
\r\n
\r\n \r\n )\r\n};\r\n\r\nexport default LogoutScreen;","import { IPurchased } from './interfaces';\r\nimport { get } from '../../../DAL/data-provider';\r\n\r\nconst SESSION_STORAGE_KEY = 'purchased';\r\n\r\n/**\r\n * clear session storage\r\n */\r\nexport const clearUserPurchasedData = () => {\r\n window.sessionStorage.removeItem(SESSION_STORAGE_KEY);\r\n};\r\n\r\n/**\r\n * https://jira.waves.com:8443/browse/WAV-1228\r\n */\r\nexport const getUserPurchasedData = async () : Promise => {\r\n\r\n /* [{\r\n \"skuNumber\": \"TBS10\",\r\n \"contentType\": 1\r\n }, {\r\n \"skuNumber\": \"V5-ATD40\",\r\n \"contentType\": 1\r\n }, {\r\n \"skuNumber\": \"V5-C1D40\",\r\n \"contentType\": 1\r\n }]\r\n */\r\n const res = await get('/api/userpurchaseddata/get-data');\r\n return res ? res.data : null;\r\n};\r\n\r\n/**\r\n * try to get data from the session storage\r\n * if the data is empty -> perform ajax request\r\n */\r\nexport const getPurchasedData = async () : Promise => {\r\n\r\n if(!window.sessionStorage) return null;\r\n\r\n let dataStr = window.sessionStorage.getItem(SESSION_STORAGE_KEY);\r\n let data: IPurchased|null = null;\r\n\r\n try{\r\n data = JSON.parse(dataStr || '');\r\n }\r\n catch(ex){}\r\n\r\n if(data &&\r\n data.purchasedProducts &&\r\n data.purchasedProducts.length > 0 &&\r\n data.recommendedProducts &&\r\n data.recommendedProducts.length > 0) return data;\r\n\r\n // if no data -> perform ajax request\r\n data = await getUserPurchasedData();\r\n\r\n window.sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(data));\r\n\r\n return data;\r\n};\r\n\r\n/**\r\n * if session storage is empty -> get data from server and update session storage\r\n * @return {Promise}\r\n */\r\nexport const updateSessionStorage = async () => {\r\n\r\n if(!window.sessionStorage) return;\r\n\r\n // thank you page -> empty session storage first\r\n if(window.location.href.indexOf('/cart/thank-you') !== -1 ||\r\n window.location.href.indexOf('/inapp/cart/thank-you') !== -1){\r\n clearUserPurchasedData();\r\n }\r\n else{\r\n // if not thank you page and there is an item -> keep it till the end of the session\r\n let valueStr = window.sessionStorage.getItem(SESSION_STORAGE_KEY);\r\n let value: IPurchased|null = null;\r\n try{\r\n value = JSON.parse(valueStr || '');\r\n }\r\n catch(ex){}\r\n\r\n // if(value && value.length > 0) return;\r\n\r\n if(value &&\r\n value.purchasedProducts &&\r\n value.purchasedProducts.length > 0 &&\r\n value.recommendedProducts &&\r\n value.recommendedProducts.length > 0) return;\r\n }\r\n\r\n // if session storage is empty try to get updated data from the server\r\n\r\n /*\r\n [{\r\n \"skuNumber\": \"TBS10\",\r\n \"contentType\": 1\r\n }, {\r\n \"skuNumber\": \"V5-ATD40\",\r\n \"contentType\": 1\r\n }, {\r\n \"skuNumber\": \"V5-C1D40\",\r\n \"contentType\": 1\r\n }]\r\n */\r\n\r\n // 1 = I own this product\r\n // 2 = I own a bundle containing this product\r\n const data = await getUserPurchasedData();\r\n\r\n window.sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(data));\r\n};\r\n\r\n/**\r\n * reset and reload user purchased products\r\n * for example, after successful login\r\n */\r\nexport const updateUserPurchasedData = async () => {\r\n\r\n // clear the storage\r\n clearUserPurchasedData();\r\n\r\n // bring new data from server side\r\n const data = await getUserPurchasedData();\r\n\r\n // update the storage\r\n window.sessionStorage.setItem(SESSION_STORAGE_KEY, JSON.stringify(data));\r\n\r\n return data;\r\n};\r\n","import React from 'react';\r\nimport { getSVGHeight } from '../svg-provider';\r\nimport { IIconProps } from '../interfaces';\r\n\r\nconst EyeIcon = (props: IIconProps) => {\r\n\r\n let height = props.height;\r\n\r\n // if height property is not defined, and width & height should be defined in px ->\r\n // calculate the height dynamically, keeping the aspect ratio using the viewport\r\n if(height === undefined && props.width.endsWith('px')){\r\n height = getSVGHeight(props.width, 19, 12);\r\n }\r\n\r\n return (\r\n \r\n { props.title && { props.title } }\r\n \r\n \r\n\r\n )\r\n};\r\n\r\nexport default EyeIcon;\r\n","/**\r\n * get image height based on width and viewport\r\n */\r\nexport const getSVGHeight = (width: string, viewPortWidth: number, viewPortHeight: number) => {\r\n const widthNum = Number(width.replace('px', ''));\r\n return`${ widthNum * viewPortHeight / viewPortWidth }px`;\r\n};","import {\r\n ChangeEventHandler,\r\n ClipboardEventHandler, FocusEventHandler,\r\n KeyboardEventHandler, MouseEvent,\r\n MouseEventHandler, ReactNode, useEffect, useRef, useState\r\n} from 'react';\r\nimport { IFormControl } from '../interfaces';\r\nimport EyeIcon from '../../svg/common/eye';\r\n\r\ninterface IFormTextField {\r\n id: string,\r\n label: string,\r\n control: IFormControl,\r\n maxLength?: number,\r\n focus?: boolean,\r\n disabled?:boolean,\r\n type?: string, // text or password\r\n\r\n // event handlers\r\n onBlur?: FocusEventHandler,\r\n onChange?: ChangeEventHandler,\r\n onClick?: MouseEventHandler,\r\n onKeyUp?: KeyboardEventHandler,\r\n onPaste?: ClipboardEventHandler,\r\n\r\n // html content\r\n comment?: ReactNode,\r\n\r\n // styles\r\n rootClasses?: string,\r\n textBoxClasses?: string,\r\n\r\n // QA data attribute\r\n qa?: string,\r\n qaError?: string,\r\n}\r\n\r\n/**\r\n * Text field.\r\n */\r\nconst FormTextField = (props: IFormTextField) => {\r\n\r\n // can be used for focus on page load\r\n const controlRef = useRef(null);\r\n const [isPasswordVisible, setIsPasswordVisible] = useState(false);\r\n\r\n useEffect(() => {\r\n\r\n if(!props.focus) return;\r\n\r\n // on page load -> focus on the field\r\n if(!controlRef || !controlRef.current) return;\r\n controlRef.current.focus();\r\n }, [props.focus]);\r\n\r\n /**\r\n * handle password eye click\r\n */\r\n const handlePasswordToggle = (evt: MouseEvent) => {\r\n setIsPasswordVisible(val => !val);\r\n };\r\n\r\n /**\r\n * define control type logic\r\n */\r\n const getControlType = (type: string|undefined) => {\r\n\r\n // default type is text\r\n if(!type) return 'text';\r\n\r\n // user clicked on the 'eye' inside the password field\r\n if(type === 'password' && isPasswordVisible) return 'text';\r\n\r\n return type;\r\n };\r\n\r\n return (\r\n
\r\n
\r\n\r\n 0) ? 'not-empty': '' } ${ props.type === 'password' ? 'pr-8' : '' }`}\r\n type={ getControlType(props.type) }\r\n maxLength={ props.maxLength }\r\n value={ props.control.value }\r\n onBlur={ props.onBlur }\r\n onChange={ props.onChange }\r\n onClick={ props.onClick }\r\n onKeyUp={ props.onKeyUp }\r\n onPaste={ props.onPaste }\r\n ref={ controlRef }\r\n disabled={ props.disabled }\r\n data-qa={ props.qa }\r\n />\r\n\r\n \r\n\r\n {\r\n props.type === 'password' && (\r\n \r\n \r\n \r\n )\r\n }\r\n
\r\n\r\n { props.control.isValid && props.comment }\r\n\r\n {\r\n !props.control.isValid &&\r\n { props.control.error }
\r\n }\r\n \r\n )\r\n};\r\n\r\nexport default FormTextField;","import { ChangeEventHandler, MouseEventHandler, ReactNode } from 'react';\r\n\r\ninterface IFormCheckboxField {\r\n id: string,\r\n label: string,\r\n isChecked: boolean,\r\n onChange?: ChangeEventHandler,\r\n onClick?: MouseEventHandler,\r\n additionalContent?: ReactNode\r\n}\r\n\r\n/**\r\n * Checkbox field.\r\n */\r\nconst FormCheckboxField = (props: IFormCheckboxField) => {\r\n return (\r\n
\r\n
\r\n \r\n \r\n
\r\n\r\n { props.additionalContent }\r\n
\r\n )\r\n};\r\n\r\nexport default FormCheckboxField;","import SimpleCaptcha from '../../../domain/captcha/simple-captcha';\r\nimport { updateControl } from '../../../domain/validation/validation';\r\nimport { IFormControl } from '../interfaces';\r\n\r\ninterface IChinaCaptchaField {\r\n control: IFormControl,\r\n setSimpleCaptchaCode: Function,\r\n simpleCaptchaAttempts: number,\r\n}\r\n\r\n/**\r\n * China captcha field.\r\n */\r\nconst ChinaCaptchaField = (props: IChinaCaptchaField) => {\r\n return (\r\n <>\r\n
\r\n {\r\n props.setSimpleCaptchaCode((updateControl(props.control, value)));\r\n }}\r\n simpleCaptchaAttempts={ props.simpleCaptchaAttempts }\r\n />\r\n
\r\n\r\n
\r\n {\r\n !props.control.isValid &&
{ props.control.error }
\r\n }\r\n
\r\n \r\n )\r\n};\r\n\r\nexport default ChinaCaptchaField;","interface IFormTitle {\r\n title: string,\r\n alignLeft?: boolean,\r\n}\r\n\r\n/**\r\n * Common form title.\r\n */\r\nconst FormTitle = (props: IFormTitle) => {\r\n\r\n return (\r\n
\r\n

{ props.title }

\r\n
\r\n )\r\n};\r\n\r\nexport default FormTitle;","import WavesLogo from '../svg/common/waves-logo';\r\n\r\n/**\r\n * Common forms logo.\r\n */\r\nconst FormLogo = () => {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n};\r\n\r\nexport default FormLogo;","interface IFormTerms {\r\n classes?: string,\r\n}\r\n\r\n/**\r\n * Common form terms & privacy links.\r\n */\r\nconst FormTerms = (props: IFormTerms) => {\r\n return (\r\n
\r\n Privacy\r\n Terms\r\n
\r\n )\r\n};\r\n\r\nexport default FormTerms;","import FormLogo from './form-logo';\r\nimport FormTerms from './form-terms';\r\nimport { ReactNode } from 'react';\r\n\r\ninterface IFormBorder {\r\n children: ReactNode\r\n}\r\n\r\n/**\r\n * Common form border and alignment.\r\n */\r\nconst FormBorder = (props: IFormBorder) => {\r\n return (\r\n
\r\n \r\n\r\n
\r\n \r\n\r\n { props.children }\r\n
\r\n\r\n \r\n\r\n \r\n
\r\n )\r\n};\r\n\r\nexport default FormBorder;","import Preloader from '../svg/common/preloader';\r\n\r\nconst FormPreloader = () => {\r\n return (\r\n
\r\n \r\n
\r\n )\r\n};\r\n\r\nexport default FormPreloader;","import {get, post} from \"../../../DAL/data-provider\";\r\nimport {IResponse} from \"../../../interfaces/common-interfaces\";\r\n\r\nexport const RVP_SESSION_STORAGE_KEY = 'recently-viewed-products';\r\nconst RVP_URL = '/api/Account/RecentlyViewedProducts/';\r\nconst GA_EVENTS_TITLE = 'Recently Viewed Products';\r\n\r\nexport const removeRVPStorageItem = () => {\r\n if(!window.sessionStorage) return;\r\n window.sessionStorage.removeItem(RVP_SESSION_STORAGE_KEY);\r\n};\r\n\r\nexport const rvpSetNullToStorage = () => {\r\n if(!window.sessionStorage) return;\r\n window.sessionStorage.setItem(RVP_SESSION_STORAGE_KEY, JSON.stringify(null));\r\n};\r\n\r\n/**\r\n * get products from database\r\n * @param {number} top\r\n * @param {string} command\r\n * @param {number} skuid\r\n * @return {Array.}\r\n */\r\n//Edited by Raz Liveyatan, 26.01.2021, https://wavesaudio.atlassian.net/browse/DSWEB-1003 (changed number of top items to 5)\r\nexport const getRVP = async (top = 0) => {\r\n return get(`${RVP_URL}get-recently-viewed-products?top=${top}`);\r\n}\r\n\r\n//Edited by Raz Liveyatan, 26.01.2021, https://wavesaudio.atlassian.net/browse/DSWEB-1003\r\nexport const removeRVP = async (skuid = -1) :Promise=> {\r\n\r\n const RvpRemoveDataUrl = 'remove-recently-viewed-product';\r\n const rvpVM = {\r\n SkuID:skuid\r\n }\r\n try{\r\n return await post(`${RVP_URL}${RvpRemoveDataUrl}`,rvpVM);\r\n }\r\n catch(ex){}\r\n\r\n return null;\r\n}\r\n\r\n//Edited by Raz Liveyatan, 26.01.2021, https://wavesaudio.atlassian.net/browse/DSWEB-1003\r\nexport const clearRVP = async () => {\r\n\r\n const RvpClearUrl = 'clear-recently-viewed-products';\r\n const SKUNumber = 0;\r\n try{\r\n return await post(`${RVP_URL}${RvpClearUrl}`,SKUNumber);\r\n }\r\n catch(ex){}\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * save products to session storage\r\n * @param {Array.} products\r\n */\r\nexport const saveToStorage = (products:any) => {\r\n\r\n if(!window.sessionStorage) return;\r\n\r\n window.sessionStorage.setItem(RVP_SESSION_STORAGE_KEY, JSON.stringify(products));\r\n};\r\n\r\n/**\r\n * get products from session storage\r\n * @return {Array.} products\r\n */\r\nexport const getFromStorage = () => {\r\n\r\n if(!window.sessionStorage) return [];\r\n\r\n let products = [];\r\n\r\n try{\r\n products = JSON.parse(window.sessionStorage.getItem(RVP_SESSION_STORAGE_KEY) as string);\r\n }\r\n catch(ex) {}\r\n\r\n return products;\r\n};\r\n\r\n/**\r\n * decode URL that is created in dot.net\r\n * @param {String} url\r\n * @return {string}\r\n */\r\nexport const decodeURL = (url:string) =>{\r\n return decodeURIComponent(url.replace(/\\+/g, '%20'));\r\n}\r\n\r\n/**\r\n * function gets a product and return normalize it to required pattern\r\n * */\r\nexport const normalizeProduct =(product:any) => {\r\n\r\n if(!product) return product;\r\n\r\n // boolean properties normalizations\r\n product.title = GA_EVENTS_TITLE;\r\n product.skuEnabled = product.skuEnabled ? product.skuEnabled : false;\r\n product.isPreorder = product.isPreorder ? product.isPreorder : false;\r\n product.isProductOptions = product.isProductOptions ? product.isProductOptions : false;\r\n product.isVariantsPriceSame = product.isVariantsPriceSame ? product.isVariantsPriceSame : false;\r\n\r\n // properties with inner HTML - normalizations\r\n product.note = product.note ? decodeURL(product.note) : '';\r\n product.documentPageDescription = product.documentPageDescription ? decodeURL(product.documentPageDescription) : '';\r\n\r\n // computed properties\r\n product.withCouponEnabled = product.couponCampaignID > 0;\r\n product.isProductVisible = product.skuid > 0 && product.skuEnabled;\r\n product.isSamePrice = product.sku_MSRP === product.skuPrice;\r\n product.minPrice = !!product.note ? 'fake' : (product.couponPrice > 0 ? Math.min(product.skuPrice, product.couponPrice) : product.skuPrice);\r\n product.maxPrice = product.couponPrice > 0 ? Math.max(product.skuPrice, product.couponPrice) : product.skuPrice;\r\n\r\n // https://wavesaudio.atlassian.net/browse/DSWEB-1267\r\n // Edited by Raz Liveyatan, 07.06.2021\r\n product.expectedShipping = product.expectedShipping !== '' ? product.expectedShipping : null;\r\n\r\n return product;\r\n};\r\n\r\n","import React from 'react';\r\n\r\ninterface ITextAboveLine {\r\n text: string;\r\n}\r\n\r\nconst TextAboveLine = (props: ITextAboveLine) => {\r\n\r\n const { text } = props;\r\n\r\n return (\r\n
\r\n

{ text }

\r\n
\r\n )\r\n};\r\n\r\nexport default TextAboveLine;","import React from 'react';\r\nimport { IIconProps } from '../../interfaces';\r\nconst FacebookIcon = (props: IIconProps) => {\r\n /*w13 h16*/\r\n return (\r\n \r\n {props.title}\r\n \r\n \r\n )\r\n};\r\n\r\nexport default FacebookIcon;","\r\nexport interface IExternalLoginResult {\r\n isValid: boolean;\r\n isLogin: boolean;\r\n status: ExternalLoginResultStatusCode;\r\n}\r\n\r\nexport enum ExternalLoginResultStatusCode {\r\n GeneralError = -99,\r\n InsertError = -5,\r\n WavesAppValidationFailed = -4,\r\n DisabledUser = -3,\r\n EmailIsNotValid = -2,\r\n FacebookValidationFailed = -1,\r\n OK = 0,\r\n}","/**\r\n * Source: https://github.com/vireshshah/custom-protocol-check/blob/master/index.js\r\n * https://github.com/vireshshah/custom-protocol-check\r\n */\r\nconst getUserAgent = () => {\r\n return window.navigator.userAgent;\r\n};\r\n\r\nconst userAgentContains = (browserName: string) => {\r\n browserName = browserName.toLowerCase();\r\n return (\r\n getUserAgent()\r\n .toLowerCase()\r\n .indexOf(browserName) > -1\r\n );\r\n}\r\n\r\nexport const isOSX = () => {\r\n return userAgentContains('Macintosh');\r\n};\r\n\r\ndeclare global {\r\n interface Window {\r\n MSStream: any;\r\n }\r\n}\r\n\r\n/**\r\n * https://stackoverflow.com/questions/9038625/detect-if-device-is-ios/9039885#9039885\r\n */\r\nexport const isIphone = () => {\r\n return /iPad|iPhone|iPod/.test(getUserAgent()) && !window.MSStream;\r\n};\r\n\r\nexport const isFirefox = () => {\r\n return userAgentContains('firefox');\r\n};\r\n\r\nexport const isEdge = () => {\r\n const ua = getUserAgent().toLowerCase();\r\n return ua.indexOf('edge') > 0;\r\n};\r\n\r\nexport const isChrome = () => {\r\n // IE11 returns undefined for window.chrome\r\n // and new Opera 30 outputs true for window.chrome\r\n // but needs to check if window.opr is not undefined\r\n // and new IE Edge outputs to true for window.chrome\r\n // and if not iOS Chrome check\r\n // @ts-ignore\r\n const isChromium = window.chrome;\r\n const winNav = window.navigator;\r\n const vendorName = winNav.vendor;\r\n // @ts-ignore\r\n const isOpera = typeof window.opr !== 'undefined';\r\n const isEdge = winNav.userAgent.indexOf('Edge') > -1;\r\n const isIOSChrome = winNav.userAgent.match('CriOS');\r\n return ((isChromium !== null &&\r\n typeof isChromium !== 'undefined' &&\r\n vendorName === 'Google Inc.' && !isOpera && !isEdge) || isIOSChrome);\r\n};\r\n\r\nexport const isOpera = () => {\r\n return userAgentContains(' OPR/');\r\n};\r\n\r\nexport const getBrowserVersion = () => {\r\n const ua = window.navigator.userAgent;\r\n let tem,\r\n M =\r\n ua.match(\r\n /(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i\r\n ) || [];\r\n if (/trident/i.test(M[1])) {\r\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\r\n return parseFloat(tem[1]) || \"\";\r\n }\r\n if (M[1] === \"Chrome\") {\r\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\r\n if (tem != null) {\r\n return parseFloat(tem[2]);\r\n }\r\n }\r\n M = M[2]\r\n ? [M[1], M[2]]\r\n : [window.navigator.appName, window.navigator.appVersion, \"-?\"];\r\n if ((tem = ua.match(/version\\/(\\d+)/i)) != null) M.splice(1, 1, tem[1]);\r\n return parseFloat(M[1]);\r\n};\r\n\r\n","import { getHiddenDataBoolean, getIsChina } from '../../../../domain/hidden-data-provider';\r\nimport {\r\n checkFacebookLoginStatus, facebookLogin,\r\n facebookLogOut,\r\n getUserData,\r\n} from '../../../../domain/facebook/facebook-login-provider';\r\nimport { externalLogin, ILoginReferrer } from '../../dal/data-provider';\r\nimport React, { ReactNode, useEffect, useRef, useState } from 'react';\r\nimport { DEFAULT_ERROR } from '../../../../DAL/data-provider';\r\nimport { redirectAfterLogin } from '../standard-login/login';\r\nimport { getPageNodeGUID } from '../../../../domain/common';\r\nimport { getUTMFromStorage } from '../../../../domain/marketing/utm/utm-provider';\r\nimport { IServerValidation } from '../../../../domain/validation/interfaces';\r\nimport {\r\n GOOGLE_ERROR,\r\n GOOGLE_SIGN_IN_INITIALIZED,\r\n} from '../../../../domain/google/google-login-provider';\r\nimport { ExternalLoginServiceEnum } from '../../enums/external-service-enum';\r\nimport TextAboveLine from '../../../../ui/forms/text-above-line';\r\nimport FacebookIcon from '../../../../ui/svg/common/social-icons/facebook';\r\nimport {\r\n ExternalLoginResultStatusCode,\r\n IExternalLoginResult\r\n} from '../../../../domain/external-login/external-login-types';\r\nimport { ILocalDataRequest } from '../../../shopping-cart/cart-bridger-pay/interfaces';\r\nimport { isIphone } from '../../../../domain/waves-apps/browser-detection';\r\nimport { getViewportWidth } from '../../../../domain/animations/animations-provider';\r\nimport { sendRegistrationEvents } from '../../../../domain/marketing/marketing-provider';\r\n\r\ninterface IExternalLogin {\r\n appCode?: string;\r\n ts?: number;\r\n uuid?: string;\r\n qs?: string;\r\n callback?: (response: { data: IServerValidation, statusCode: number } | null) => void;\r\n facebookText: string;\r\n googleTextParam: string;\r\n dividerText: string,\r\n isShoppingCart?: boolean;\r\n localData?: ILocalDataRequest;\r\n}\r\n\r\nconst ExternalLogin = (props: IExternalLogin) => {\r\n\r\n const { facebookText, googleTextParam, dividerText } = props;\r\n\r\n const socialLoginEnabled = getHiddenDataBoolean('social-login-enabled') && !getIsChina();\r\n\r\n const [ error, setError ] = useState('');\r\n\r\n // ----------- GOOGLE --------------------\r\n\r\n const googlePlaceholderRef = useRef(null);\r\n\r\n useEffect(() => {\r\n const googleInitialized = () => {\r\n\r\n if(!googlePlaceholderRef || !googlePlaceholderRef.current || !window.google) return;\r\n\r\n const vw = getViewportWidth();\r\n\r\n // 408\r\n\r\n // https://developers.google.com/identity/gsi/web/reference/js-reference#google.accounts.id.renderButton\r\n window.google.accounts.id.renderButton(googlePlaceholderRef.current, {\r\n type: 'standard',\r\n size: 'large',\r\n width: Math.min(vw - 20*2 - 24*2, (props.isShoppingCart ? 350 : 320)),\r\n theme: 'filled_blue',\r\n // @ts-ignore\r\n text: googleTextParam,\r\n logo_alignment: 'left',\r\n locale: 'en_US',\r\n });\r\n\r\n // Ensure FedCM login works when available\r\n // window.google.accounts.id.prompt();\r\n };\r\n\r\n document.body.addEventListener(GOOGLE_SIGN_IN_INITIALIZED, googleInitialized);\r\n\r\n return () => {\r\n document.body.removeEventListener(GOOGLE_SIGN_IN_INITIALIZED, googleInitialized);\r\n };\r\n }, [\r\n googleTextParam,\r\n props.isShoppingCart,\r\n ]);\r\n\r\n useEffect(() => {\r\n document.body.dispatchEvent(new CustomEvent(GOOGLE_SIGN_IN_INITIALIZED));\r\n }, [\r\n error,\r\n ]);\r\n\r\n useEffect(() => {\r\n const googleError = (evt: CustomEvent) => {\r\n if(!evt || !evt.detail) return;\r\n handleServerError(evt.detail);\r\n };\r\n\r\n // @ts-ignore\r\n document.body.addEventListener(GOOGLE_ERROR, googleError);\r\n\r\n return () => {\r\n // @ts-ignore\r\n document.body.removeEventListener(GOOGLE_ERROR, googleError);\r\n };\r\n }, []);\r\n\r\n const facebookAfterLogin = async (accessToken: string, userID: string) => {\r\n if(!accessToken || !userID) {\r\n // setError(DEFAULT_ERROR);\r\n await facebookLogOut();\r\n return;\r\n }\r\n\r\n const data = await getUserData();\r\n const email = data?.email || '';\r\n const name = data?.name || '';\r\n\r\n if(!email) {\r\n setError('You must share your Facebook email with waves.com to login with Facebook.');\r\n await facebookLogOut();\r\n return;\r\n }\r\n\r\n const isPersistent = true;\r\n\r\n const utm = getUTMFromStorage();\r\n\r\n const response = await externalLogin(\r\n ExternalLoginServiceEnum.Facebook,\r\n accessToken,\r\n userID,\r\n email,\r\n name,\r\n props.isShoppingCart ? ILoginReferrer.CartExternalLogin : ILoginReferrer.MainExternalLogin,\r\n isPersistent,\r\n !!props.isShoppingCart,\r\n props.localData,\r\n\r\n props.appCode,\r\n props.ts || 0,\r\n props.uuid,\r\n props.qs,\r\n\r\n // message gears -------\r\n getPageNodeGUID(),\r\n utm ? utm.firstSource : '',\r\n utm ? utm.firstMedium : '',\r\n utm ? utm.firstCampaign : '',\r\n utm ? utm.lastSource : '',\r\n utm ? utm.lastMedium : '',\r\n utm ? utm.lastCampaign : '',\r\n );\r\n\r\n if(\r\n !response ||\r\n response.statusCode !== 200 ||\r\n !response.data.isValid){\r\n await facebookLogOut();\r\n handleServerError(response);\r\n return;\r\n }\r\n\r\n const isExistingUser = response?.data?.relatedData?.isExistingUser ?? false;\r\n\r\n if(!isExistingUser) {\r\n await sendRegistrationEvents();\r\n }\r\n\r\n // All is well -----------------\r\n if(!!props.callback && typeof props.callback === 'function') {\r\n props.callback(response);\r\n }\r\n else{\r\n redirectAfterLogin();\r\n }\r\n };\r\n\r\n // ------------ FACEBOOK ----------------\r\n const onFacebookLoginClick = async () => {\r\n\r\n if(isIphone()) {\r\n FB.login((loginResponse) => {\r\n\r\n let accessToken = '';\r\n let userID = '';\r\n\r\n if(loginResponse.status === 'connected' && loginResponse.authResponse) {\r\n accessToken = loginResponse.authResponse.accessToken;\r\n userID = loginResponse.authResponse.userID;\r\n }\r\n\r\n facebookAfterLogin(accessToken, userID);\r\n }, {\r\n // https://developers.facebook.com/docs/permissions\r\n scope: 'public_profile,email'\r\n });\r\n }\r\n else{\r\n const statusResponse = await checkFacebookLoginStatus();\r\n const isConnected = statusResponse.status === 'connected' && !!statusResponse.authResponse;\r\n\r\n let accessToken = '';\r\n let userID = '';\r\n\r\n if(isConnected) {\r\n accessToken = statusResponse.authResponse.accessToken;\r\n userID = statusResponse.authResponse.userID;\r\n }\r\n else{\r\n const loginResponse = await facebookLogin();\r\n if(loginResponse.status === 'connected' && !!loginResponse.authResponse) {\r\n accessToken = loginResponse.authResponse.accessToken;\r\n userID = loginResponse.authResponse.userID;\r\n }\r\n }\r\n\r\n await facebookAfterLogin(accessToken, userID);\r\n }\r\n };\r\n\r\n // ----------- COMMON --------------------\r\n\r\n const handleServerError = (response: { data: IServerValidation, statusCode: number }) => {\r\n\r\n const result : IExternalLoginResult|undefined = response?.data?.relatedData?.result;\r\n\r\n if(result && result.status === ExternalLoginResultStatusCode.DisabledUser) {\r\n setError(Your account is inactive. Check your email for activation link, or contact Waves Customer Support.);\r\n return;\r\n }\r\n\r\n const errors = response?.data?.errors;\r\n\r\n if(errors && errors.length > 0){\r\n setError(errors.join(' '));\r\n return;\r\n }\r\n\r\n setError(DEFAULT_ERROR);\r\n };\r\n\r\n return (\r\n <>\r\n {\r\n socialLoginEnabled &&\r\n
\r\n\r\n <>\r\n \r\n\r\n \r\n\r\n
\r\n \r\n
\r\n { facebookText }\r\n \r\n \r\n\r\n {\r\n error &&\r\n
{ error }
\r\n }\r\n\r\n \r\n
\r\n }\r\n \r\n )\r\n};\r\n\r\nexport default ExternalLogin;","import { useEffect, useRef, useState } from 'react';\r\n\r\n// <= 767 - defined as mobile (iphone etc.)\r\nexport const MOBILE_BREAKPOINT = 767;\r\n\r\n// tablet range [768, 1023]\r\nexport const TABLET_BREAKPOINT_START = 768;\r\nexport const TABLET_BREAKPOINT_END = 1023;\r\n\r\n// DESKTOP >= 1024\r\nexport const DESKTOP_BREAKPOINT = 1024;\r\n\r\n/**\r\n * checks if Web Animation API is supported\r\n */\r\nexport const isWebAnimationSupported = () => {\r\n return 'animate' in document.createElement('div');\r\n};\r\n/**\r\n * if resize observer is supported\r\n * https://web.dev/resize-observer/\r\n */\r\nexport const isResizeObserverSupported = () => {\r\n return 'ResizeObserver' in window;\r\n};\r\n\r\n/**\r\n * get viewport width\r\n */\r\nexport const getViewportWidth = () => {\r\n return Math.max(document.documentElement.clientWidth || 0, window.innerWidth || 0);\r\n};\r\n\r\n/**\r\n * get window width / height\r\n */\r\nexport const getWindowDimensions = () => {\r\n return {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\r\n};\r\n\r\n/**\r\n * window resize observer hook\r\n * returns width and height on window resize\r\n * usage:\r\n * -------\r\n * const [width, height] = useWindowResizeObserver();\r\n * console.log(width, height);\r\n */\r\nexport const useWindowResizeObserver = () => {\r\n\r\n const [width, setWidth] = useState(document.body.clientWidth);\r\n const [height, setHeight] = useState(document.body.clientWidth);\r\n\r\n const observer = useRef(isResizeObserverSupported() ?\r\n new ResizeObserver(entries => {\r\n\r\n if(!entries || entries.length <= 0) return;\r\n\r\n const { width, height } = entries[0].contentRect;\r\n setWidth(width);\r\n setHeight(height);\r\n }) : null\r\n );\r\n\r\n useEffect(() => {\r\n\r\n observer?.current?.observe(document.body);\r\n\r\n return () => { // eslint-disable-next-line\r\n observer?.current?.unobserve(document.body);\r\n }\r\n }, []);\r\n\r\n return [\r\n width,\r\n height,\r\n ];\r\n};\r\n\r\nexport const getWidth = async ($el: HTMLElement) : Promise => {\r\n return new Promise((resolve, reject) => {\r\n const width = $el.style.getPropertyValue('width');\r\n $el.style.removeProperty('width');\r\n window.setTimeout(() => {\r\n const offsetWidth = $el.offsetWidth;\r\n $el.style.setProperty('width', width);\r\n window.setTimeout(() => {\r\n resolve(offsetWidth);\r\n }, 0);\r\n }, 0);\r\n });\r\n};","import {\r\n KeyboardEvent,\r\n ClipboardEvent,\r\n useState,\r\n useRef,\r\n useEffect\r\n} from 'react';\r\nimport { ILoginReferrer, login } from '../../dal/data-provider';\r\nimport { IServerValidation } from '../../../../domain/validation/interfaces';\r\nimport ValidationErrors from '../../../../domain/validation/server-errors/validation-errors';\r\nimport {\r\n createControl,\r\n updateControl,\r\n validateForm,\r\n removeInvisibleCharsOnPaste,\r\n validateControl\r\n} from '../../../../domain/validation/validation';\r\nimport { getSimpleCaptchaValidationError } from '../../../../domain/captcha/simple-captcha';\r\nimport { getIsChina, getIsAuthenticated } from '../../../../domain/hidden-data-provider';\r\nimport { getRecaptchaToken, renderRecaptcha2, resetRecaptcha2, getRecaptcha2Error } from '../../../../domain/captcha/recaptcha-provider';\r\nimport Recaptcha3Text from '../../../../domain/captcha/recaptcha3-terms';\r\nimport LogoutScreen from '../../logout/logout-screen';\r\nimport { updateUserPurchasedData } from '../../purchased-products/user-purchased-products';\r\nimport { IFormControl } from '../../../../ui/forms/interfaces';\r\nimport FormTextField from '../../../../ui/forms/fields/text-field';\r\nimport FormCheckboxField from '../../../../ui/forms/fields/checkbox-field';\r\nimport ChinaCaptchaField from '../../../../ui/forms/fields/captcha-china-field';\r\nimport FormTitle from '../../../../ui/forms/form-title';\r\nimport FormBorder from '../../../../ui/forms/form-border';\r\nimport FormPreloader from '../../../../ui/forms/form-preloader';\r\nimport { rvpSetNullToStorage } from '../../../recently-viewed-products/data/data-service';\r\nimport ExternalLogin from '../external-login/external-login';\r\n\r\n/**\r\n * once user is logged in, redirect the page to the previous page, or to the user account\r\n */\r\nexport const redirectAfterLogin = () => {\r\n\r\n const search = window.location.search;\r\n let newURL = '/account';\r\n\r\n if(search.toLowerCase().startsWith('?returnurl')){\r\n\r\n const decoded = window.decodeURIComponent(search);\r\n const url = new URL(window.location.href.toLowerCase());\r\n const returnUrlParam = url.searchParams.get('returnurl') || '';\r\n\r\n // prevent XSS - verify that return url is a valid url, and\r\n // it should start with a single slash,\r\n // and after it the rest can be anything except a 2nd slash right after the first one.\r\n let isValidUrl = true;\r\n\r\n if(!returnUrlParam.startsWith('/') || returnUrlParam.startsWith('//')){\r\n isValidUrl = false;\r\n }\r\n\r\n if(isValidUrl){\r\n try{\r\n const uri = `https://${ window.location.host }${ returnUrlParam }`;\r\n const returnUrl = new URL(uri);\r\n console.log('returnUrl', returnUrl);\r\n }\r\n catch(ex){\r\n isValidUrl = false;\r\n console.error(ex);\r\n }\r\n }\r\n\r\n if(isValidUrl){\r\n newURL = decoded.replace(/\\?returnurl=/gi, '');\r\n }\r\n }\r\n\r\n // remove current page from history,\r\n // so when user clicks 'back button' it will skip the login page\r\n window.location.replace(newURL);\r\n};\r\n\r\n/**\r\n * Login app\r\n * @constructor\r\n */\r\nconst Login = () => {\r\n\r\n const userNameRef = useRef(null); // used for focus\r\n const isChina = getIsChina();\r\n const isUserAuth = getIsAuthenticated();\r\n\r\n // validation ---------------------------------------\r\n const userNameControl = createControl('userName', '', {\r\n required: true\r\n });\r\n const passwordControl = createControl('password', '', {\r\n required: true\r\n });\r\n const simpleCaptchaControl = createControl('simpleCaptcha', '', {\r\n required: true,\r\n requiredMessage: getSimpleCaptchaValidationError(),\r\n length: 5,\r\n });\r\n\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [response, setResponse] = useState();\r\n const [userName, setUserName] = useState(userNameControl);\r\n const [password, setPassword] = useState(passwordControl);\r\n const [isPersistent, setIsPersistent] = useState(true);\r\n\r\n // simple captcha - used for chine\r\n const [simpleCaptchaCode, setSimpleCaptchaCode] = useState(simpleCaptchaControl);\r\n const [simpleCaptchaAttempts, setSimpleCaptchaAttempts] = useState(0);\r\n\r\n // google recaptcha version 2 & 3\r\n const [recaptchaVersion, setRecaptchaVersion] = useState(3);\r\n const [recaptcha2WidgetID, setRecaptcha2WidgetID] = useState(0);\r\n\r\n // captcha: common\r\n const [captchaError, setCaptchaError] = useState('');\r\n\r\n useEffect(() => {\r\n\r\n // on page load -> focus on the username field\r\n if(!userNameRef || !userNameRef.current) return;\r\n userNameRef.current.focus();\r\n }, []);\r\n\r\n /**\r\n * if recaptcha 3 returns low score (the limit is defined in kentico settings),\r\n * then recaptcha 2 fallback should be rendered inside
\r\n */\r\n const renderCaptcha2Fallback = () => {\r\n if(!window.grecaptcha) return;\r\n\r\n window.grecaptcha.ready(async () => {\r\n const widgetID = await renderRecaptcha2('recaptcha');\r\n setRecaptcha2WidgetID(widgetID);\r\n });\r\n };\r\n\r\n /**\r\n * perform user login on server\r\n */\r\n const performLogin = async () => {\r\n\r\n // client side validation\r\n const isValid =\r\n isChina ?\r\n validateForm([\r\n [userName, setUserName],\r\n [password, setPassword],\r\n [simpleCaptchaCode, setSimpleCaptchaCode],\r\n ]) :\r\n validateForm([\r\n [userName, setUserName],\r\n [password, setPassword],\r\n ]);\r\n\r\n if(!isValid) return;\r\n\r\n setIsLoading(true);\r\n\r\n let response = null;\r\n\r\n try {\r\n const captchaToken = !isChina ? await getRecaptchaToken(recaptchaVersion) : simpleCaptchaCode.value;\r\n\r\n if(!captchaToken){\r\n setCaptchaError(isChina ? getSimpleCaptchaValidationError() : getRecaptcha2Error());\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n response = await login(\r\n ILoginReferrer.LoginPage,\r\n userName.value,\r\n password.value,\r\n isPersistent,\r\n captchaToken,\r\n recaptchaVersion\r\n );\r\n }\r\n catch(ex){}\r\n\r\n if(\r\n response &&\r\n response.statusCode === 200 &&\r\n response.data &&\r\n response.data.isValid){\r\n\r\n // all is well ---------------\r\n\r\n // reset and reload user purchased products\r\n await updateUserPurchasedData();\r\n\r\n // clear recently viewed products storage\r\n rvpSetNullToStorage();\r\n\r\n // perform redirect\r\n redirectAfterLogin();\r\n\r\n return;\r\n }\r\n\r\n // handle errors ---------\r\n\r\n setIsLoading(false);\r\n\r\n if(isChina){\r\n\r\n // re-render simple captcha\r\n setSimpleCaptchaAttempts(simpleCaptchaAttempts + 1);\r\n }\r\n else{\r\n if(response?.data.relatedData === 'recaptcha-error') {\r\n setRecaptchaVersion(2);\r\n renderCaptcha2Fallback();\r\n }\r\n\r\n if(recaptchaVersion === 2){\r\n resetRecaptcha2();\r\n }\r\n }\r\n\r\n // render errors\r\n setResponse(response?.data);\r\n };\r\n\r\n /**\r\n * and enter / return keys\r\n */\r\n const handleEnter = async (evt: KeyboardEvent) => {\r\n if(evt.key === 'Enter') {\r\n await performLogin();\r\n }\r\n };\r\n\r\n /**\r\n * empty errors on click\r\n */\r\n const handleFieldClick = () =>{\r\n setResponse(null);\r\n setCaptchaError('');\r\n };\r\n\r\n return (\r\n <>\r\n {\r\n !isUserAuth &&\r\n \r\n \r\n\r\n \r\n\r\n {\r\n const $target = evt.target as HTMLInputElement;\r\n setUserName(updateControl(userName, $target.value, !userName.isValid));\r\n setResponse(null); // empty server error\r\n setCaptchaError('');\r\n }}\r\n onBlur={ () => {\r\n setUserName(validateControl(userName));\r\n }}\r\n onClick={ handleFieldClick }\r\n onKeyUp={ handleEnter }\r\n onPaste={ (evt: ClipboardEvent) => {\r\n setUserName(updateControl(userName, removeInvisibleCharsOnPaste(evt)));\r\n }}\r\n />\r\n\r\n {\r\n const $target = evt.target as HTMLInputElement;\r\n setPassword(updateControl(password, $target.value, !password.isValid));\r\n setResponse(null); // empty server error\r\n setCaptchaError('');\r\n }}\r\n onBlur={ () => {\r\n setPassword(validateControl(password));\r\n }}\r\n onClick={ handleFieldClick }\r\n onKeyUp={ handleEnter }\r\n onPaste={ (evt: ClipboardEvent) => {\r\n setPassword(updateControl(password, removeInvisibleCharsOnPaste(evt)));\r\n }}\r\n />\r\n\r\n {\r\n setIsPersistent(val => !val);\r\n }}\r\n onClick={ handleFieldClick }\r\n additionalContent={\r\n
\r\n Forgot Password?\r\n
\r\n }\r\n />\r\n\r\n {\r\n /* ------------- google recaptcha version 2 or 3 ------------- */\r\n !isChina &&\r\n
\r\n }\r\n\r\n {\r\n /* ------------- china simple captcha ------------- */\r\n isChina &&\r\n \r\n }\r\n\r\n
\r\n\r\n { isLoading && }\r\n\r\n {\r\n !isLoading &&\r\n {\r\n await performLogin();\r\n }}\r\n >Log in\r\n }\r\n
\r\n\r\n {\r\n response && !response.isValid && (\r\n
\r\n \r\n
\r\n )\r\n }\r\n\r\n {\r\n captchaError &&\r\n
{ captchaError }
\r\n }\r\n\r\n \r\n\r\n {\r\n !isChina && recaptchaVersion === 3 &&\r\n
\r\n \r\n
\r\n }\r\n \r\n }\r\n\r\n { isUserAuth && }\r\n\r\n \r\n\r\n )\r\n};\r\n\r\nexport default Login;","const __WEBPACK_NAMESPACE_OBJECT__ = ReactDOM;","import { IIndexable } from './interfaces';\r\n\r\n/**\r\n * Read a page's GET URL variables and return them as an associative array\r\n * search (optional) - '?me=myValue&name2=SomeOtherValue'\r\n *\r\n * Usage:\r\n * ------\r\n * getQueryString(); //window.location.search\r\n * getQueryString('?me=myValue&name2=SomeOtherValue');\r\n * getQueryString()['key'] -> value\r\n *\r\n * Result:\r\n * -------\r\n * {\r\n * \"me\" : \"myValue\",\r\n * \"name2\" : \"SomeOtherValue\"\r\n * }\r\n *\r\n */\r\nexport const getQueryString = (search?: string, caseSensitive: boolean = true) : IIndexable => {\r\n\r\n const result = {} as IIndexable;\r\n\r\n if(!search){\r\n search = window.location.search;\r\n }\r\n\r\n // decode if needed\r\n search = window.decodeURIComponent(search.toString());\r\n\r\n if(!caseSensitive){\r\n search = search?.toLowerCase();\r\n }\r\n\r\n if(search.length <= 1) return result;\r\n\r\n // get hashes\r\n const hashes = search.substring(1).split('&');\r\n\r\n for(let i = 0; i < hashes.length; i++){\r\n\r\n //get hash\r\n const hash = hashes[i];\r\n\r\n //get hash sections\r\n const sections = hash.split('=');\r\n\r\n if(sections.length >= 2){\r\n\r\n let val = '';\r\n\r\n for(let s=1; s 1){\r\n val += '=';\r\n }\r\n\r\n val += sections[s];\r\n }\r\n\r\n //add to the object\r\n result[sections[0]] = val;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * generate return URL that includes query string and hashes\r\n * https://www.waves.com/login?ReturnUrl=/vocal-mixing-masterclass-leslie-brathwaite?playlist=756640c2-13c0-408b-ad77-0294173d7721\r\n */\r\nexport const getReturnURL = (prefix = '/login') => {\r\n /*\r\n const qs = Object.entries(getQueryString()).map(([key, value], index) => `${key}=${value}`); //\r\n qs.push(`returnurl=${encodeURIComponent(window.location.pathname)}`);\r\n return `/login?${qs.join('&')}`*/\r\n\r\n const returnURL = `ReturnUrl=${window.location.pathname}${window.location.search}${window.location.hash}`;\r\n return `${prefix}?${returnURL}`\r\n};\r\n\r\nexport const removeQueryParamFromUrl = (queryParam: string) => {\r\n if(!queryParam || typeof URLSearchParams === 'undefined') return;\r\n\r\n const url = new URL(window.location.href);\r\n const params = new URLSearchParams(url.search);\r\n if(params.has(queryParam)){\r\n params.delete(queryParam);\r\n url.search = params.toString();\r\n }\r\n\r\n window.history.replaceState({}, '', url.toString());\r\n};","import { IWavesAppDetection } from './interfaces';\r\nimport { getQueryString } from '../../../../domain/url-provider';\r\nimport { get, post } from '../../../../DAL/data-provider';\r\n\r\nexport const WAVES_APP_DEFAULT_LOGIN_ERR = 'Login failed, please try again.';\r\n\r\n/**\r\n * detects waves app in URL query string, and parses the URL\r\n */\r\nexport const detectWavesApp = () : IWavesAppDetection => {\r\n\r\n const res = {\r\n isWavesApp: false,\r\n hasError: false,\r\n };\r\n\r\n const qs = getQueryString();\r\n if(!qs) return res;\r\n\r\n // this array will contain all query string except 'logintoken'\r\n // that is used for waves apps login\r\n const remainQS = [];\r\n\r\n let loginToken = '';\r\n\r\n // loop through the query string\r\n for (const [key, value] of Object.entries(qs)) {\r\n\r\n if(key.trim().toLowerCase() !== 'logintoken'){\r\n remainQS.push(`${key}=${value}`);\r\n }\r\n else{\r\n loginToken = value;\r\n }\r\n }\r\n\r\n // 'logintoken' is not found in query string ---> wavesapp is not detected\r\n if(!loginToken) return res;\r\n\r\n // parse login token --------------------------\r\n\r\n let [uuid, mac, ts, appCode, version, port] = ['', '', '', '', '', ''];\r\n\r\n try{\r\n [uuid, mac, ts, appCode, version, port] = window.atob(loginToken).split(',');\r\n }\r\n catch(ex){}\r\n\r\n const tsNum = Number(ts) ?? 0;\r\n\r\n // remove loginToken querystring from URL bar\r\n const url = window.location.href.replace(window.location.search, '');\r\n const updatedURL = remainQS.length > 0 ? `${ url }?${remainQS.join('?')}` : url;\r\n window.history.replaceState({}, document.title, updatedURL);\r\n\r\n const hasError = !uuid || uuid.length <= 0 || tsNum <= 0 || !appCode || appCode.length <= 0;\r\n\r\n return {\r\n isWavesApp: true,\r\n hasError,\r\n uuid,\r\n mac,\r\n ts: tsNum,\r\n appCode,\r\n version,\r\n qs: loginToken,\r\n port,\r\n }\r\n};\r\n\r\nexport const getWavesAppData = async (appCode: string, timeToken: number, isLoggedIn = false, loginToken = '') => {\r\n\r\n return post('/api/membership/waves-app-data', {\r\n appCode,\r\n timeToken,\r\n\r\n // already logged in\r\n isLoggedIn,\r\n loginToken,\r\n });\r\n};\r\n\r\nexport const getAppSuccessCallback = (\r\n successCallback: string,\r\n wavesAppLoginToken: string,\r\n port: string\r\n) => {\r\n try{\r\n // parse current page url\r\n const currentPageUrl = new URL(window.location.href);\r\n let successCallbackUrlDecoded = decodeURIComponent(successCallback);\r\n successCallbackUrlDecoded = successCallbackUrlDecoded.replaceAll('{port}', port);\r\n\r\n // parse success callback url\r\n const successCallbackUrl = new URL(successCallbackUrlDecoded);\r\n for(const [key, value] of successCallbackUrl.searchParams) {\r\n if(!value.startsWith('{')) continue;\r\n\r\n if(value.toLowerCase() === '{logintoken}') {\r\n successCallbackUrl.searchParams.set(key, wavesAppLoginToken);\r\n continue;\r\n }\r\n\r\n if(value.toLowerCase() === '{port}') {\r\n successCallbackUrl.searchParams.set(key, port);\r\n continue;\r\n }\r\n\r\n // check if param exists in the current query string ---> replace\r\n if(currentPageUrl.searchParams.has(key)) {\r\n successCallbackUrl.searchParams.set(key, currentPageUrl.searchParams.get(key) || '');\r\n }\r\n }\r\n\r\n return decodeURIComponent(successCallbackUrl.toString());\r\n }\r\n catch (ex) {\r\n console.log(ex);\r\n return '';\r\n }\r\n};\r\n\r\n/*\r\nexport const getAppSuccessCallback = (\r\n successCallback: string,\r\n wavesAppLoginToken: string,\r\n port: string\r\n) => {\r\n const url = decodeURIComponent(successCallback)\r\n .replaceAll('{LoginToken}', wavesAppLoginToken)\r\n .replaceAll('{port}', port);\r\n\r\n console.log('url', url);\r\n\r\n // http://localhost:{port}/login/update_login?loginToken={LoginToken}&success=true\r\n return url;\r\n};*/\r\n\r\n\r\n/**\r\n * after successful request\r\n */\r\nexport const handleAppSuccess = async (\r\n callbackTypeID: string | number,\r\n url: string\r\n) : Promise => {\r\n return new Promise(async (resolve, reject) => {\r\n if(callbackTypeID.toString() === '2'){\r\n // used for cosmos\r\n // in case of cosmos: perform an ajax\r\n try{\r\n const response = await get(url);\r\n if(response?.data?.is_succeeded){\r\n window.close();\r\n }\r\n else{\r\n reject();\r\n }\r\n /*\r\n const response = await fetch(url);\r\n const json = await response.json();\r\n if(json.is_succeeded){\r\n window.close();\r\n }\r\n else{\r\n reject();\r\n }*/\r\n }\r\n catch(ex){\r\n console.log('Cosmos ajax error:', ex);\r\n }\r\n }\r\n else{\r\n /*\r\n try{\r\n window.close();\r\n }\r\n catch(ex){ }*/\r\n\r\n // used for central\r\n // waves-central://login/success?loginToken={LoginToken}\r\n openApp(url);\r\n }\r\n\r\n resolve();\r\n });\r\n};\r\n\r\n/**\r\n * open app with custom protocol\r\n */\r\nexport const openApp = (url: string) => {\r\n\r\n console.log('Open app url:', url);\r\n\r\n const $link = document.createElement('a');\r\n $link.id = 'waves-app-custom-protocol';\r\n $link.href = url;\r\n $link.style.display = 'none';\r\n\r\n document.body.appendChild($link);\r\n $link.click();\r\n $link.remove();\r\n};\r\n","import React, { useEffect, useState } from 'react';\r\nimport WavesLogo from '../../../../ui/svg/common/waves-logo';\r\nimport Preloader from '../../../../ui/svg/common/preloader';\r\nimport { IWavesAppData, IWavesAppDetection } from './interfaces';\r\nimport {\r\n getAppSuccessCallback,\r\n getWavesAppData,\r\n handleAppSuccess,\r\n WAVES_APP_DEFAULT_LOGIN_ERR\r\n} from './waves-apps-provider';\r\nimport { logout, sendPluginsBIConsent } from '../../dal/data-provider';\r\n\r\ninterface IWavesAppsLoggedIn {\r\n wavesAppDetectionData: IWavesAppDetection\r\n wavesAppData: IWavesAppData | null,\r\n isAfterLogin: boolean,\r\n setLoggedInScreenShown: Function,\r\n}\r\n\r\nconst WavesAppsLoggedIn = (props: IWavesAppsLoggedIn) => {\r\n\r\n const [isLoading, setIsLoading] = useState(false);\r\n const [wavesAppsError, setWavesAppsError] = useState('');\r\n\r\n const { wavesAppDetectionData, wavesAppData, isAfterLogin, setLoggedInScreenShown } = props;\r\n const { appCode, ts, qs, port } = wavesAppDetectionData;\r\n\r\n const userName = wavesAppData?.userName || '';\r\n const wavesAppName = wavesAppData?.appName || '';\r\n\r\n const continueToApp = async () => {\r\n\r\n setIsLoading(true);\r\n\r\n const response = await getWavesAppData(\r\n appCode || '',\r\n ts ?? 0,\r\n true,\r\n qs\r\n );\r\n\r\n setIsLoading(false);\r\n\r\n if(!response ||\r\n response.statusCode !== 200 ||\r\n !response.data.isValid ||\r\n !response.data.relatedData ||\r\n !response.data.relatedData.relatedData){\r\n\r\n try{\r\n // https://wavesaudio.atlassian.net/browse/CEN2-2206\r\n const isInvalidToken = response?.data?.relatedData?.relatedData?.tokenInvalid;\r\n\r\n if(isInvalidToken){\r\n setWavesAppsError('Login failed, please ensure your computer clock is set to correct date and time (learn how), then try to log in again.');\r\n return;\r\n }\r\n }\r\n catch(ex){\r\n console.log(ex);\r\n }\r\n\r\n setWavesAppsError(WAVES_APP_DEFAULT_LOGIN_ERR);\r\n return;\r\n }\r\n\r\n const data = response.data.relatedData.relatedData as IWavesAppData;\r\n const successCallback = data?.successCallback ?? '';\r\n\r\n if(successCallback){\r\n const url = getAppSuccessCallback(\r\n successCallback,\r\n qs ?? '',\r\n port ?? '',\r\n );\r\n console.log('url', url);\r\n\r\n try{\r\n await handleAppSuccess(data?.callbackTypeID ?? '', url);\r\n }\r\n catch(ex){\r\n setWavesAppsError('An error has occurred.');\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n if(appCode !== 'CTR') return;\r\n (async () => {\r\n await sendPluginsBIConsent();\r\n })();\r\n }, [appCode]);\r\n\r\n const signOut = async () => {\r\n\r\n setLoggedInScreenShown(false);\r\n\r\n try{\r\n await logout();\r\n }\r\n catch (ex){\r\n console.log('Logout error:', ex);\r\n }\r\n };\r\n\r\n return (\r\n
\r\n \r\n
\r\n\r\n
\r\n \r\n
\r\n\r\n {\r\n !isAfterLogin &&\r\n <>\r\n
\r\n You're already logged in as { userName }.\r\n
\r\n\r\n {\r\n isLoading &&\r\n
\r\n \r\n
\r\n }\r\n\r\n {\r\n !isLoading &&\r\n <>\r\n {\r\n await continueToApp();\r\n }}\r\n >Continue to Waves { wavesAppName }\r\n\r\n

If you need to log in with a\r\n different account, please\r\n .\r\n

\r\n \r\n }\r\n\r\n \r\n }\r\n\r\n {\r\n isAfterLogin &&\r\n <>\r\n
\r\n You're logged in as { userName }.\r\n
\r\n\r\n {\r\n isLoading &&\r\n
\r\n \r\n
\r\n }\r\n\r\n {\r\n !isLoading &&\r\n <>\r\n {\r\n await continueToApp();\r\n }}\r\n >Continue to Waves { wavesAppName }\r\n Go to My Account\r\n \r\n }\r\n \r\n }\r\n\r\n\r\n {\r\n !isLoading && wavesAppsError &&\r\n
\r\n }\r\n
\r\n
\r\n
\r\n )\r\n};\r\n\r\nexport default WavesAppsLoggedIn;","import React, {\r\n KeyboardEvent,\r\n ClipboardEvent,\r\n useState,\r\n useRef,\r\n useEffect, useCallback\r\n} from 'react';\r\nimport { ILoginReferrer, login } from '../../dal/data-provider';\r\nimport { IServerValidation } from '../../../../domain/validation/interfaces';\r\nimport ValidationErrors from '../../../../domain/validation/server-errors/validation-errors';\r\nimport {\r\n createControl,\r\n updateControl,\r\n validateForm,\r\n removeInvisibleCharsOnPaste,\r\n validateControl\r\n} from '../../../../domain/validation/validation';\r\nimport { getSimpleCaptchaValidationError } from '../../../../domain/captcha/simple-captcha';\r\nimport { getIsChina, getIsAuthenticated } from '../../../../domain/hidden-data-provider';\r\nimport { getRecaptchaToken, renderRecaptcha2, resetRecaptcha2, getRecaptcha2Error } from '../../../../domain/captcha/recaptcha-provider';\r\nimport Recaptcha3Text from '../../../../domain/captcha/recaptcha3-terms';\r\nimport { updateUserPurchasedData } from '../../purchased-products/user-purchased-products';\r\nimport { IFormControl } from '../../../../ui/forms/interfaces';\r\nimport FormTextField from '../../../../ui/forms/fields/text-field';\r\nimport FormCheckboxField from '../../../../ui/forms/fields/checkbox-field';\r\nimport ChinaCaptchaField from '../../../../ui/forms/fields/captcha-china-field';\r\nimport FormTitle from '../../../../ui/forms/form-title';\r\nimport FormBorder from '../../../../ui/forms/form-border';\r\nimport FormPreloader from '../../../../ui/forms/form-preloader';\r\nimport { rvpSetNullToStorage } from '../../../recently-viewed-products/data/data-service';\r\nimport {\r\n getAppSuccessCallback,\r\n getWavesAppData, handleAppSuccess,\r\n WAVES_APP_DEFAULT_LOGIN_ERR\r\n} from './waves-apps-provider';\r\nimport { IWavesAppData, IWavesAppDetection } from './interfaces';\r\nimport Preloader from '../../../../ui/svg/common/preloader';\r\nimport { sendGAEvent } from '../../../../domain/marketing/gtm-provider';\r\nimport WavesAppsLoggedIn from './logged-in';\r\nimport ExternalLogin from '../external-login/external-login';\r\nimport { GOOGLE_ERROR, GOOGLE_SIGNED_IN } from '../../../../domain/google/google-login-provider';\r\n\r\ninterface IWavesAppsLogin {\r\n wavesAppDetectionData: IWavesAppDetection\r\n}\r\n\r\n/**\r\n * Waves Apps Login\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-1917\r\n */\r\nconst WavesAppsLogin = (params: IWavesAppsLogin) => {\r\n\r\n const { wavesAppDetectionData } = params;\r\n const [loggedInScreenShown, setLoggedInScreenShown] = useState(getIsAuthenticated());\r\n const [isAfterLogin, setIsAfterLogin] = useState(false);\r\n\r\n const userNameRef = useRef(null); // used for focus\r\n const isChina = getIsChina();\r\n\r\n // validation ---------------------------------------\r\n const userNameControl = createControl('userName', '', {\r\n required: true\r\n });\r\n const passwordControl = createControl('password', '', {\r\n required: true\r\n });\r\n const simpleCaptchaControl = createControl('simpleCaptcha', '', {\r\n required: true,\r\n requiredMessage: getSimpleCaptchaValidationError(),\r\n length: 5,\r\n });\r\n\r\n const [ isWavesAppLoading, setIsWavesAppLoading] = useState(true);\r\n const [ isLoading, setIsLoading] = useState(false);\r\n const [ wavesAppsError, setWavesAppsError] = useState('');\r\n const [ wavesAppData, setWavesAppData] = useState(null);\r\n\r\n const [ response, setResponse] = useState();\r\n const [ userName, setUserName] = useState(userNameControl);\r\n const [ password, setPassword] = useState(passwordControl);\r\n const [ isPersistent, setIsPersistent] = useState(true);\r\n\r\n // simple captcha - used for chine\r\n const [ simpleCaptchaCode, setSimpleCaptchaCode] = useState(simpleCaptchaControl);\r\n const [ simpleCaptchaAttempts, setSimpleCaptchaAttempts] = useState(0);\r\n\r\n // google recaptcha version 2 & 3\r\n const [ recaptchaVersion, setRecaptchaVersion] = useState(3);\r\n const [ recaptcha2WidgetID, setRecaptcha2WidgetID] = useState(0);\r\n\r\n // captcha: common\r\n const [ captchaError, setCaptchaError] = useState('');\r\n const { appCode, ts, uuid, qs, port } = wavesAppDetectionData;\r\n\r\n useEffect(() => {\r\n\r\n // load waves apps data\r\n (async () => {\r\n const response = await getWavesAppData(\r\n appCode || '',\r\n ts ?? 0,\r\n );\r\n\r\n setIsWavesAppLoading(false);\r\n\r\n if(!response ||\r\n response.statusCode !== 200 ||\r\n !response.data.isValid ||\r\n !response.data.relatedData ||\r\n !response.data.relatedData.relatedData){\r\n\r\n try{\r\n // https://wavesaudio.atlassian.net/browse/CEN2-2206\r\n const isInvalidToken = response?.data?.relatedData?.relatedData?.tokenInvalid;\r\n\r\n if(isInvalidToken){\r\n setWavesAppsError('Login failed, please ensure your computer clock is set to correct date and time (learn how), then try to log in again.');\r\n return;\r\n }\r\n }\r\n catch(ex){\r\n console.log(ex);\r\n }\r\n\r\n setWavesAppsError(WAVES_APP_DEFAULT_LOGIN_ERR);\r\n return;\r\n }\r\n\r\n const data = response.data.relatedData.relatedData as IWavesAppData;\r\n\r\n setWavesAppData(data);\r\n\r\n // https://wavesaudio.atlassian.net/browse/DSWEB-2064\r\n sendGAEvent('External Login', data.appName ?? '');\r\n })();\r\n\r\n // on page load -> focus on the username field\r\n if(!userNameRef || !userNameRef.current) return;\r\n userNameRef.current.focus();\r\n }, [appCode, ts]);\r\n\r\n const onLoginSuccess = useCallback(async () => {\r\n console.log('onLoginSuccess')\r\n // reset and reload user purchased products\r\n await updateUserPurchasedData();\r\n\r\n // clear recently viewed products storage\r\n rvpSetNullToStorage();\r\n\r\n const successCallback = wavesAppData?.successCallback ?? '';\r\n\r\n if(successCallback){\r\n // add additional query strings to success callback url\r\n console.log('wavesAppParams', wavesAppDetectionData);\r\n\r\n const url = getAppSuccessCallback(\r\n successCallback,\r\n qs ?? '',\r\n port ?? '',\r\n );\r\n console.log('url', url);\r\n\r\n // call the url or perform other actions depending on callback type\r\n try{\r\n await handleAppSuccess(wavesAppData?.callbackTypeID ?? '', url);\r\n }\r\n catch(ex){\r\n setWavesAppsError('An error has occurred.');\r\n }\r\n }\r\n\r\n // get app data again to show the 'logged in screen'\r\n const dataResponse = await getWavesAppData(\r\n appCode || '',\r\n ts ?? 0,\r\n );\r\n console.log('dataResponse', dataResponse)\r\n\r\n setIsLoading(false);\r\n\r\n const isError = !dataResponse ||\r\n dataResponse.statusCode !== 200 ||\r\n !dataResponse.data.isValid ||\r\n !dataResponse.data.relatedData ||\r\n !dataResponse.data.relatedData.relatedData;\r\n\r\n if(!isError){\r\n const data = dataResponse.data.relatedData.relatedData as IWavesAppData;\r\n\r\n // show 'logged in' screen with 2 buttons: 'Continue...' and 'Go to my account'\r\n setIsAfterLogin(true);\r\n setWavesAppData(data);\r\n setLoggedInScreenShown(true)\r\n }\r\n }, [\r\n appCode, port, qs, ts, wavesAppData?.successCallback, wavesAppData?.callbackTypeID, wavesAppDetectionData\r\n ]);\r\n\r\n const onLoginError = useCallback((response: {data: IServerValidation, statusCode: number } | null) => {\r\n if(isChina){\r\n\r\n // re-render simple captcha\r\n setSimpleCaptchaAttempts(simpleCaptchaAttempts + 1);\r\n }\r\n else{\r\n if(response?.data.relatedData === 'recaptcha-error') {\r\n setRecaptchaVersion(2);\r\n renderCaptcha2Fallback();\r\n }\r\n\r\n if(recaptchaVersion === 2){\r\n resetRecaptcha2();\r\n }\r\n }\r\n\r\n // render errors\r\n setResponse(response?.data);\r\n }, [\r\n isChina, recaptchaVersion, simpleCaptchaAttempts,\r\n ]);\r\n\r\n const googleError = useCallback((evt: CustomEvent) => {\r\n if(!evt || !evt.detail) return;\r\n onLoginError(evt.detail);\r\n }, [ onLoginError ]);\r\n\r\n const googleSignedIn = useCallback(async () => {\r\n await onLoginSuccess();\r\n }, [ onLoginSuccess ]);\r\n\r\n useEffect(() => {\r\n // @ts-ignore\r\n document.body.addEventListener(GOOGLE_ERROR, googleError);\r\n document.body.addEventListener(GOOGLE_SIGNED_IN, googleSignedIn);\r\n\r\n return () => {\r\n // @ts-ignore\r\n document.body.removeEventListener(GOOGLE_ERROR, googleError);\r\n document.body.removeEventListener(GOOGLE_SIGNED_IN, googleSignedIn);\r\n };\r\n }, [googleError, googleSignedIn]);\r\n\r\n /**\r\n * if recaptcha 3 returns low score (the limit is defined in kentico settings),\r\n * then recaptcha 2 fallback should be rendered inside
\r\n */\r\n const renderCaptcha2Fallback = () => {\r\n if(!window.grecaptcha) return;\r\n\r\n window.grecaptcha.ready(async () => {\r\n const widgetID = await renderRecaptcha2('recaptcha');\r\n setRecaptcha2WidgetID(widgetID);\r\n });\r\n };\r\n\r\n /**\r\n * perform user login on server\r\n */\r\n const performLogin = async () => {\r\n\r\n // client side validation\r\n const isValid =\r\n isChina ?\r\n validateForm([\r\n [userName, setUserName],\r\n [password, setPassword],\r\n [simpleCaptchaCode, setSimpleCaptchaCode],\r\n ]) :\r\n validateForm([\r\n [userName, setUserName],\r\n [password, setPassword],\r\n ]);\r\n\r\n if(!isValid) return;\r\n\r\n setIsLoading(true);\r\n\r\n let response = null;\r\n\r\n try {\r\n const captchaToken = !isChina ? await getRecaptchaToken(recaptchaVersion) : simpleCaptchaCode.value;\r\n\r\n if(!captchaToken){\r\n setCaptchaError(isChina ? getSimpleCaptchaValidationError() : getRecaptcha2Error());\r\n setIsLoading(false);\r\n return;\r\n }\r\n\r\n response = await login(\r\n ILoginReferrer.LoginPage,\r\n userName.value,\r\n password.value,\r\n isPersistent,\r\n captchaToken,\r\n recaptchaVersion,\r\n undefined,\r\n\r\n // waves apps like Central etc.\r\n // https://wavesaudio.atlassian.net/browse/DSWEB-1917\r\n appCode,\r\n ts,\r\n uuid,\r\n qs,\r\n );\r\n }\r\n catch(ex){}\r\n\r\n if(\r\n response &&\r\n response.statusCode === 200 &&\r\n response.data &&\r\n response.data.isValid){\r\n\r\n // all is well ---------------\r\n await onLoginSuccess();\r\n return;\r\n }\r\n\r\n // handle errors ---------\r\n setIsLoading(false);\r\n\r\n // render errors\r\n onLoginError(response);\r\n };\r\n\r\n /**\r\n * and enter / return keys\r\n */\r\n const handleEnter = async (evt: KeyboardEvent) => {\r\n if(evt.key === 'Enter') {\r\n await performLogin();\r\n }\r\n };\r\n\r\n /**\r\n * empty errors on click\r\n */\r\n const handleFieldClick = () =>{\r\n setResponse(null);\r\n setCaptchaError('');\r\n };\r\n\r\n const externalLoginCallback = (response: { data: IServerValidation, statusCode: number } | null) => {\r\n\r\n (async () => {\r\n if( response &&\r\n response.statusCode === 200 &&\r\n response.data &&\r\n response.data.isValid) {\r\n await onLoginSuccess();\r\n }\r\n else{\r\n onLoginError(response);\r\n }\r\n })();\r\n\r\n };\r\n\r\n return (\r\n <>\r\n {\r\n isWavesAppLoading &&\r\n \r\n
\r\n \r\n
\r\n
\r\n }\r\n\r\n {\r\n !isWavesAppLoading && wavesAppsError &&\r\n \r\n
\r\n
\r\n }\r\n\r\n {\r\n !isWavesAppLoading && !wavesAppsError &&\r\n <>\r\n {\r\n !loggedInScreenShown &&\r\n \r\n \r\n\r\n \r\n\r\n {\r\n const $target = evt.target as HTMLInputElement;\r\n setUserName(updateControl(userName, $target.value, !userName.isValid));\r\n setResponse(null); // empty server error\r\n setCaptchaError('');\r\n }}\r\n onBlur={ evt => {\r\n setUserName(validateControl(userName));\r\n }}\r\n onClick={ handleFieldClick }\r\n onKeyUp={ handleEnter }\r\n onPaste={ (evt: ClipboardEvent) => {\r\n setUserName(updateControl(userName, removeInvisibleCharsOnPaste(evt)));\r\n }}\r\n />\r\n\r\n {\r\n const $target = evt.target as HTMLInputElement;\r\n setPassword(updateControl(password, $target.value, !password.isValid));\r\n setResponse(null); // empty server error\r\n setCaptchaError('');\r\n }}\r\n onBlur={ evt => {\r\n setPassword(validateControl(password));\r\n }}\r\n onClick={ handleFieldClick }\r\n onKeyUp={ handleEnter }\r\n onPaste={ (evt: ClipboardEvent) => {\r\n setPassword(updateControl(password, removeInvisibleCharsOnPaste(evt)));\r\n }}\r\n />\r\n\r\n {\r\n setIsPersistent(val => !val);\r\n }}\r\n onClick={ handleFieldClick }\r\n additionalContent={\r\n
\r\n Forgot Password?\r\n
\r\n }\r\n />\r\n\r\n {\r\n /* ------------- google recaptcha version 2 or 3 ------------- */\r\n !isChina &&\r\n
\r\n }\r\n\r\n {\r\n /* ------------- china simple captcha ------------- */\r\n isChina &&\r\n \r\n }\r\n\r\n
\r\n\r\n { isLoading && }\r\n\r\n {\r\n !isLoading &&\r\n {\r\n await performLogin();\r\n }}\r\n >Log in\r\n }\r\n
\r\n\r\n {\r\n response && !response.isValid && (\r\n
\r\n \r\n
\r\n )\r\n }\r\n\r\n {\r\n captchaError &&\r\n
{ captchaError }
\r\n }\r\n\r\n \r\n\r\n {\r\n !isChina && recaptchaVersion === 3 &&\r\n
\r\n \r\n
\r\n }\r\n \r\n }\r\n\r\n { loggedInScreenShown &&\r\n \r\n }\r\n \r\n }\r\n \r\n\r\n )\r\n};\r\n\r\nexport default WavesAppsLogin;","import Login from './standard-login/login';\r\nimport ReactDOM from 'react-dom';\r\nimport React from 'react';\r\nimport { detectWavesApp } from './waves-app-login/waves-apps-provider';\r\nimport WavesAppsLogin from './waves-app-login/login';\r\nimport { initFacebookForLogin } from '../../../domain/facebook/facebook-login-provider';\r\nimport { initGoogleForLogin } from '../../../domain/google/google-login-provider';\r\n\r\n/**\r\n * entry point\r\n */\r\nconst init = () => {\r\n const $root = document.getElementById('membership-login-app');\r\n if (!$root) return;\r\n\r\n const wavesApp = detectWavesApp();\r\n const isWavesApp = !!wavesApp && wavesApp.isWavesApp;\r\n\r\n initFacebookForLogin();\r\n initGoogleForLogin(isWavesApp, wavesApp);\r\n\r\n ReactDOM.render(\r\n \r\n { !isWavesApp && }\r\n { isWavesApp && }\r\n ,\r\n $root\r\n );\r\n};\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n init();\r\n});\r\n\r\nexport {};"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","React","ifShouldDenyOnReadOnly","async","response","status","window","location","href","url","data","qs","params","push","encodeURIComponent","join","encodeData","headers","Headers","append","fetch","method","credentials","Error","json","statusCode","post","body","JSON","stringify","ProductDepartmentEnum","LastPaymentOption","PaymentTabsEnum","CreditCardServiceEnum","CreditCardTabTabsEnum","_defineProperty","value","configurable","writable","defaultMessages","createControl","id","initialValue","rules","touched","isValid","error","validateControl","control","updatedControl","required","_value","trim","requiredMessage","handle","re","RegExp","toString","test","handleMessage","minlength","length","minlengthMessage","replace","maxlength","maxlengthMessage","lengthMessage","undefined","decimalPlaces","Number","isInteger","num","match","Math","max","getDecimalPlaces","decimalPlacesMessage","email","indexOf","emailMessage","name","nameMessage","password","regexes","r","passwordMessage","regex","regexMessage","phone","intRegex","onlyZerosRegex","phoneMessage","number","isNumeric","isNaN","parseFloat","isFinite","numberMessage","int","intMessage","minDate","min","Date","minDateMessage","maxDate","maxDateMessage","maxValue","maxValueMessage","minValue","minValueMessage","general","generalMessage","atLeastOneDigit","atLeastOneDigitMessage","validateForm","errorControlsListHolder","i","param","setControl","updateControl","updatedValue","validate","reset","invisibleCharactersRegex","removeInvisibleCharsOnPaste","evt","preventDefault","$target","target","currentFieldValue","clipboardData","getData","pasteText","substring","selectionStart","selectionEnd","e","this","message","atob","bind","t","String","n","c","charAt","fromCharCode","decodeURIComponent","charCodeAt","toUpperCase","COOKIES","SESSION_STORAGE","LOCAL_STORAGE","getCookie","cookies","document","cookie","split","index","substr","toLowerCase","getFromStorage","storageType","storageName","temp","localStorage","setItem","removeItem","sessionStorage","isStorageEnabled","getItem","getLocalStorageItem","getSessionStorageItem","requiredArgs","args","TypeError","toDate","argument","arguments","argStr","getTime","console","warn","stack","NaN","getTimezoneOffsetInMilliseconds","date","utcDate","UTC","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","setUTCFullYear","startOfDay","dirtyDate","setHours","compareLocalAsc","dateLeft","dateRight","diff","treatAsUTC","result","setMinutes","getTimezoneOffset","isUTMExpired","utm","now","expirationDays","$box","getElementById","textContent","getExpirationSettings","dirtyDateLeft","dirtyDateRight","sign","difference","abs","startOfDayLeft","startOfDayRight","timestampLeft","timestampRight","round","differenceInCalendarDays","setDate","differenceInDays","firstTimestamp","getUTMFromStorage","storageData","parse","lastTimestamp","ex","ExternalLoginServiceEnum","guidHelper","floor","random","getPageNodeGUID","$div","querySelector","getHiddenDataBoolean","$el","innerText","getHiddenDataString","getIsAuthenticated","getIsChina","formatDistanceLocale","lessThanXSeconds","one","other","xSeconds","halfAMinute","lessThanXMinutes","xMinutes","aboutXHours","xHours","xDays","aboutXWeeks","xWeeks","aboutXMonths","xMonths","aboutXYears","xYears","overXYears","almostXYears","buildFormatLongFn","options","width","defaultWidth","formats","formatLong","full","long","medium","short","time","dateTime","formatRelativeLocale","lastWeek","yesterday","today","tomorrow","nextWeek","buildLocalizeFn","dirtyIndex","dirtyOptions","valuesArray","context","formattingValues","defaultFormattingWidth","_defaultWidth","_width","values","argumentCallback","buildMatchFn","string","matchPattern","matchPatterns","defaultMatchWidth","matchResult","matchedString","parsePatterns","defaultParseWidth","Array","isArray","array","predicate","findIndex","object","findKey","valueCallback","rest","slice","code","formatDistance","token","count","tokenValue","addSuffix","comparison","formatRelative","_date","_baseDate","_options","localize","ordinalNumber","dirtyNumber","rem100","era","narrow","abbreviated","wide","quarter","month","day","dayPeriod","am","pm","midnight","noon","morning","afternoon","evening","night","parsePattern","parseInt","parseResult","any","weekStartsOn","firstWeekContainsDate","toInteger","ceil","startOfUTCISOWeek","getUTCDay","setUTCDate","getUTCDate","setUTCHours","getUTCISOWeekYear","year","getUTCFullYear","fourthOfJanuaryOfNextYear","startOfNextYear","fourthOfJanuaryOfThisYear","startOfThisYear","startOfUTCWeek","locale","localeWeekStartsOn","defaultWeekStartsOn","RangeError","getUTCWeekYear","localeFirstWeekContainsDate","defaultFirstWeekContainsDate","firstWeekOfNextYear","firstWeekOfThisYear","addLeadingZeros","targetLength","output","signedYear","getUTCMonth","getUTCHours","getUTCMinutes","getUTCSeconds","numberOfDigits","milliseconds","getUTCMilliseconds","pow","formatTimezoneShort","offset","dirtyDelimiter","absOffset","hours","minutes","delimiter","formatTimezoneWithOptionalMinutes","formatTimezone","G","y","unit","lightFormatters","Y","signedWeekYear","weekYear","R","u","Q","q","M","L","w","week","firstWeek","startOfUTCWeekYear","getUTCWeek","I","isoWeek","fourthOfJanuary","startOfUTCISOWeekYear","getUTCISOWeek","D","dayOfYear","timestamp","setUTCMonth","getUTCDayOfYear","E","dayOfWeek","localDayOfWeek","isoDayOfWeek","dayPeriodEnumValue","b","B","h","H","K","k","m","s","S","X","_localize","timezoneOffset","_originalDate","x","O","z","originalDate","T","dateLongFormatter","pattern","timeLongFormatter","longFormatters","p","P","dateTimeFormat","datePattern","timePattern","protectedDayOfYearTokens","protectedWeekYearTokens","throwProtectedError","format","input","concat","formattingTokensRegExp","longFormattingTokensRegExp","escapedStringRegExp","doubleQuoteRegExp","unescapedLatinCharacterRegExp","dirtyFormatStr","formatStr","isDate","dirtyAmount","amount","addMilliseconds","subMilliseconds","formatterOptions","map","firstCharacter","longFormatter","formatter","useAdditionalWeekYearTokens","useAdditionalDayOfYearTokens","isProtectedDayOfYearToken","getGdprDefaultValues","isOptOut","isGdprOptOut","IsMarketing","IsPerformance","ItemModifiedWhen","IsCountryGDPR","getGdprCookie","parsed","CartSteps","sendRegistrationEvents","gdpr","isPerformance","isMarketing","referrer","dataLayer","gtmCreateAccount","img","createElement","style","borderStyle","setAttribute","appendChild","initAdwords","ttq","track","obApi","log","ire","orderId","customerId","customerEmail","verifySiteDefinitionMatch","GOOGLE_SIGN_IN_INITIALIZED","GOOGLE_SIGNED_IN","GOOGLE_ERROR","EFacebookStatus","facebookLogOut","startsWith","Promise","resolve","_reject","FB","logout","ILoginReferrer","login","userName","isPersistent","captchaCode","recaptchaVersion","localData","wavesAppCode","wavesAppTimeToken","wavesUserGuid","wavesAppLoginToken","shipAddressLine","shipCity","shipZipCode","shipCountry2LetterCode","shipState2LetterCode","shippingCode","taxCountry2LetterCode","taxState2LetterCode","taxZipCode","externalLogin","externalService","accessToken","userID","isShoppingCart","pageNodeGUID","firstUTMSource","firstUTMMedium","firstUTMCampaign","lastUTMSource","lastUTMMedium","lastUTMCampaign","google","accounts","disableAutoSelect","props","hasErrors","errors","defaultError","qa","dangerouslySetInnerHTML","__html","role","xmlns","viewBox","height","title","fill","color","getChinaCaptchaTimestamp","getSrc","src","setSrc","useState","simpleCaptchaAttempts","refresh","useCallback","useEffect","className","alt","type","onClick","simpleCaptchaCode","onChange","setSimpleCaptchaCode","NOT_DEFINED_ERR","getRecaptchaSiteKey","version","env","navigator","userAgent","getRecaptchaToken","reject","grecaptcha","ready","execute","action","then","getResponse","renderRecaptcha2","containerID","siteKeyV2","widgetID","render","resetRecaptcha2","rel","classes","fillRule","isLoading","setIsLoading","maxWidth","text","reload","performLogout","SESSION_STORAGE_KEY","updateUserPurchasedData","res","getUserPurchasedData","endsWith","viewPortWidth","viewPortHeight","widthNum","getSVGHeight","controlRef","useRef","isPasswordVisible","setIsPasswordVisible","focus","current","rootClasses","textBoxClasses","maxLength","onBlur","onKeyUp","onPaste","ref","disabled","htmlFor","label","val","comment","qaError","checked","isChecked","additionalContent","alignLeft","children","rvpSetNullToStorage","ExternalLoginResultStatusCode","facebookText","googleTextParam","dividerText","socialLoginEnabled","setError","googlePlaceholderRef","googleInitialized","vw","documentElement","clientWidth","innerWidth","renderButton","size","theme","logo_alignment","addEventListener","removeEventListener","dispatchEvent","CustomEvent","googleError","detail","handleServerError","facebookAfterLogin","api","fields","Facebook","CartExternalLogin","MainExternalLogin","appCode","ts","uuid","firstSource","firstMedium","firstCampaign","lastSource","lastMedium","lastCampaign","relatedData","isExistingUser","callback","redirectAfterLogin","DisabledUser","background","borderRadius","textAlign","padding","MSStream","loginResponse","authResponse","scope","statusResponse","getLoginStatus","margin","search","newURL","decoded","returnUrlParam","URL","searchParams","isValidUrl","uri","host","returnUrl","userNameRef","isChina","isUserAuth","userNameControl","passwordControl","simpleCaptchaControl","setResponse","setUserName","setPassword","setIsPersistent","setSimpleCaptchaAttempts","setRecaptchaVersion","recaptcha2WidgetID","setRecaptcha2WidgetID","captchaError","setCaptchaError","performLogin","captchaToken","LoginPage","handleEnter","handleFieldClick","ReactDOM","WAVES_APP_DEFAULT_LOGIN_ERR","getWavesAppData","timeToken","isLoggedIn","loginToken","getAppSuccessCallback","successCallback","port","currentPageUrl","successCallbackUrlDecoded","replaceAll","successCallbackUrl","has","set","handleAppSuccess","callbackTypeID","is_succeeded","close","openApp","$link","display","click","remove","wavesAppsError","setWavesAppsError","wavesAppDetectionData","wavesAppData","isAfterLogin","setLoggedInScreenShown","wavesAppName","appName","continueToApp","tokenInvalid","sendPluginsBIConsent","loggedInScreenShown","setIsAfterLogin","isWavesAppLoading","setIsWavesAppLoading","setWavesAppData","eventValue","pathname","onLoginSuccess","dataResponse","onLoginError","renderCaptcha2Fallback","googleSignedIn","init","$root","wavesApp","isWavesApp","hasError","caseSensitive","hashes","sections","getQueryString","remainQS","entries","mac","tsNum","updatedURL","history","replaceState","detectWavesApp","js","fjs","fbAsyncInit","appId","xfbml","getElementsByTagName","parentNode","insertBefore","handleCredentialResponse","header","jwt_decode","credential","serverResponse","Google","sub","initGoogleForLogin","onload","initialize","client_id"],"sourceRoot":""}