{"version":3,"file":"app-bf1e818b.js","sources":["../../src/components/layouts/LayoutError.vue","../../src/assets/img/500-decor.svg","../../src/composables/error.ts","../../src/views/Error500View.vue","../../src/composables/theme.ts","../../src/api/response.ts","../../src/api/auth/client.ts","../../src/api/private/client.ts","../../src/model/user.ts","../../src/stores/me.ts","../../src/api/client.ts","../../src/assets/img/404-decor.svg","../../src/views/Error404View.vue","../../src/App.vue","../../src/plugins/reCaptcha.ts","../../src/router/index.ts","../../src/i18n/index.ts","../../src/plugins/omnica.ts","../../src/plugins/gtm.ts","../../src/plugins/metrika.ts","../../src/plugins/sentry.ts","../../src/main.ts","../../src/assets/img/login__decor_ru.svg","../../src/assets/img/login__decor_en.svg","../../src/assets/img/login__decor_es.svg","../../src/components/layouts/LayoutBase.vue","../../src/components/common/HighlightText.vue","../../src/model/account.ts","../../src/stores/accounts.ts","../../src/views/MainView.vue","../../src/components/icons/IconDone.vue","../../src/components/common/PasswordComplexityTooltip.vue","../../src/components/icons/IconVisibleOutlined.vue","../../src/components/icons/IconHiddenOutlined.vue","../../src/components/common/AuthInput.vue","../../src/api/public/client.ts","../../src/stores/password.ts","../../src/composables/sending.ts","../../src/views/LoginView.vue","../../src/views/ReminderView.vue","../../src/views/ResetView.vue","../../src/components/password-change/PasswordChange.vue","../../src/components/password-change/PasswordChangeResult.vue","../../src/views/PasswordChangeView.vue","../../src/views/EmailChangeView.vue","../../src/views/EmailConfirmView.vue"],"sourcesContent":["\n\n\n\n\n\n\n{\n \"error\": \"Ошибка {code}\"\n}\n\n\n\n{\n \"error\": \"Error {code}\"\n}\n\n\n\n{\n \"error\": \"Error {code}\"\n}\n\n","export default \"__VITE_ASSET__5566fa4a__\"","import { computed, ref } from 'vue';\n\nconst code = ref()\n\nexport function useError() {\n const setCode = (newCode: number) => {\n code.value = newCode\n }\n\n const resetCode = () => {\n code.value = undefined\n }\n\n const has500 = computed(() => {\n return code.value != undefined && code.value >= 500\n })\n\n const has404 = computed(() => {\n return code.value != undefined && code.value === 404\n })\n\n return {\n setCode,\n resetCode,\n has500,\n has404,\n }\n}\n","\n\n\n\n\n{\n \"title\": \"Внутренняя ошибка\",\n \"description\": {\n \"first\": \"Произошла непредвиденная ошибка. Мы уже уведомлены об инциденте и в ближайшее время все починим.\",\n \"second\": \"Попробуйте начать с\",\n \"mainPage\": \"главной страницы.\"\n }\n}\n\n\n\n{\n \"title\": \"Internal error\",\n \"description\": {\n \"first\": \"An unexpected error has occurred. We have already been notified of the incident and will fix it shortly.\",\n \"second\": \"Try to start with\",\n \"mainPage\": \"the main page.\"\n }\n}\n\n\n\n{\n \"title\": \"Error interno\",\n \"description\": {\n \"first\": \"Ha ocurrido un error imprevisto. Ya hemos notificado el incidente y lo solucionaremos lo antes posible.\",\n \"second\": \"Intenta con la\",\n \"mainPage\": \"página principal.\"\n }\n}\n\n","import { computed, ref } from 'vue';\n\nenum Theme {\n RETAILCRM = 'retailcrm',\n SIMLA = 'simla'\n}\n\nenum Region {\n RU = 'ru-central-1',\n EU = 'eu-central-1'\n}\n\nconst theme = ref(Theme[import.meta.env.VITE_THEME])\nconst region = ref(Region[import.meta.env.VITE_S3_REGION])\n\nexport function useTheme() {\n const logo = computed(() => {\n return `https://s3-s1.retailcrm.tech/${region.value.toString()}/retailcrm-static/branding/${theme.value.toString()}/logo/logo_icon.svg`\n })\n\n const favicon = computed(() => {\n return `https://s3-s1.retailcrm.tech/${region.value.toString()}/retailcrm-static/branding/${theme.value.toString()}/favicon/favicon.ico`\n })\n\n const siteName = computed(() => {\n return theme.value === Theme.RETAILCRM ? 'RetailCRM' : 'Simla.com'\n })\n\n const setTheme = (newTheme: 'RETAILCRM'|'SIMLA') => {\n theme.value = Theme[newTheme]\n }\n\n return {\n theme,\n logo,\n favicon,\n siteName,\n setTheme,\n }\n}\n","import axios, { AxiosError } from 'axios';\n\nexport function handleError(\n err: Error | AxiosError,\n resolve: (data: Response) => void,\n reject: (err: Error) => void\n) {\n if (axios.isAxiosError(err) && err.response && err.response.status < 500) {\n return resolve({\n data: null,\n error: {\n code: err.response.status,\n messages: err.response.data.data.errors,\n },\n });\n } else {\n return reject(err);\n }\n}\n\nexport interface Response {\n data: T | null;\n error?: {\n code: number;\n messages: string[];\n };\n}\n\nexport interface ErrorResponse {\n status: string;\n message: string;\n data: {\n errors: string[];\n };\n}\n","import type {\n ClientInterface,\n FastLoginRequest,\n LoginRequest,\n LogoutRequest,\n SuccessResponse,\n} from '@/api/auth/interface';\nimport client from '@/api/client';\nimport type { Response } from '@/api/response';\nimport { handleError } from '@/api/response';\n\nclass Client implements ClientInterface {\n login(request: LoginRequest): Promise> {\n return new Promise>((resolve, reject) => {\n client\n .post(\n '/api/v1/auth/login',\n {\n email: request.email,\n password: request.password,\n remember_me: request.rememberMe,\n },\n {\n headers: {\n recaptcha: request.recaptcha,\n },\n }\n )\n .then(function (response) {\n resolve(response);\n })\n .catch(function (err) {\n handleError(err, resolve, reject);\n });\n });\n }\n\n fastLogin(request: FastLoginRequest): Promise> {\n return new Promise>((resolve, reject) => {\n client\n .post(\n '/api/v1/auth/fast-login',\n {\n token: request.token,\n },\n {\n headers: {\n recaptcha: request.recaptcha,\n },\n }\n )\n .then(function (response) {\n resolve({\n data: response.data,\n });\n })\n .catch(function (err) {\n handleError(err, resolve, reject);\n });\n });\n }\n\n logout(request: LogoutRequest): Promise> {\n return new Promise>((resolve, reject) => {\n client\n .post('/api/v1/auth/logout', {},{\n headers: {\n recaptcha: request.recaptcha,\n },\n })\n .then(function (response) {\n resolve({\n data: response.data,\n });\n })\n .catch(function (err) {\n handleError(err, resolve, reject);\n });\n });\n }\n}\n\nexport default new Client();\n","import type {\n AccountsRequest,\n AccountsResponse, ChangeEmailRequest, ChangePasswordRequest,\n ClientInterface,\n CodeResponse, EmailChangeResponse,\n MeResponse,\n} from '@/api/private/interface';\nimport client from '@/api/client';\nimport type { Response } from '@/api/response';\nimport { handleError } from '@/api/response';\nimport type { SuccessResponse } from '../auth/interface';\n\nclass Client implements ClientInterface {\n me(): Promise> {\n return new Promise>((resolve, reject) => {\n client\n .get('/api/v1/client/me')\n .then(function (response) {\n resolve({\n data: response.data,\n });\n })\n .catch(function (err) {\n handleError(err, resolve, reject);\n });\n });\n }\n\n accounts(request: AccountsRequest): Promise> {\n return new Promise>((resolve, reject) => {\n client\n .get('/api/v1/client/accounts', {\n params: {\n first: request.first,\n last: request.last,\n before: request.before,\n after: request.after,\n filter: {\n domain: request.domain,\n },\n },\n })\n .then(function (response) {\n resolve({\n data: response.data,\n });\n })\n .catch(function (err) {\n handleError(err, resolve, reject);\n });\n });\n }\n\n code(uid: string): Promise> {\n return new Promise>((resolve, reject) => {\n client\n .get(`/api/v1/client/${uid}/code`)\n .then(function (response) {\n resolve({\n data: response.data,\n });\n })\n .catch(function (err) {\n handleError(err, resolve, reject);\n });\n });\n }\n\n changePassword(request: ChangePasswordRequest) {\n return new Promise>((resolve, reject) => {\n client\n .patch('/api/v1/client/account/password', {\n old_password: request.oldPassword,\n new_password: request.newPassword,\n conf_password: request.confPassword,\n })\n .then(resolve)\n .catch((err) => handleError(err, resolve, reject));\n });\n }\n\n changeEmail(request: ChangeEmailRequest) {\n return new Promise>(((resolve, reject) => {\n client\n .patch('/api/v1/client/account/email', request)\n .then(resolve)\n .catch((err) => handleError(err, resolve, reject))\n }))\n }\n}\n\nexport default new Client();\n","export class User {\n email: string;\n isServiceAccount: boolean;\n\n constructor(email: string, isServiceAccount: boolean) {\n this.email = email;\n this.isServiceAccount = isServiceAccount;\n }\n}\n","import { defineStore } from 'pinia';\nimport authClient from '@/api/auth/client';\nimport privateClient from '@/api/private/client';\nimport { computed, ref } from 'vue';\nimport { User } from '@/model/user';\n\nexport const useMeStore = defineStore('me', () => {\n const isAuthorized = ref(undefined);\n const user = ref(null);\n\n const isServiceAccount = computed(() : boolean => {\n return !!user.value?.isServiceAccount\n })\n\n const me = async () => {\n return privateClient\n .me()\n .then(({data}) => {\n if (data != null) {\n isAuthorized.value = true;\n\n user.value = new User(\n data.data.user.email,\n data.data.user.is_service_account\n );\n } else {\n isAuthorized.value = false\n }\n\n return data;\n });\n }\n\n const login = (\n email: string,\n password: string,\n rememberMe: boolean,\n token: string\n ) => {\n return authClient\n .login({\n email: email,\n password: password,\n rememberMe: rememberMe,\n recaptcha: token,\n })\n .then((response) => {\n if (response.data != null) {\n isAuthorized.value = true\n }\n\n return response;\n });\n };\n\n const fastLogin = (fastLoginToken: string, token: string) => {\n return authClient.fastLogin({\n token: fastLoginToken,\n recaptcha: token,\n }).then((response) => {\n if (response.data != null) {\n isAuthorized.value = true\n }\n\n return response;\n });\n };\n\n const logout = (token: string) => {\n return authClient.logout({\n recaptcha: token,\n }).then((response) => {\n if (response.data != null) {\n deAuthorized();\n }\n\n return response;\n });\n }\n\n const deAuthorized = () => {\n user.value = null;\n isAuthorized.value = false;\n };\n\n return { isAuthorized, user, isServiceAccount, me, login, logout, fastLogin, deAuthorized };\n});\n","import axios, { AxiosError } from 'axios';\nimport type { ErrorResponse } from '@/api/response';\nimport { useMeStore } from '@/stores/me';\nimport { useError } from '@/composables/error';\n\nconst client = axios.create({\n baseURL: import.meta.env.VITE_BACKEND_HOST,\n timeout: 4000,\n headers: {\n 'Content-Type': 'application/json',\n },\n});\n\nexport default client;\n\nclient.interceptors.response.use(function (response) {\n return response;\n}, function (error: AxiosError) {\n return new Promise(function() {\n const { setCode } = useError();\n const { deAuthorized } = useMeStore()\n\n if (error.response) {\n setCode(error.response.status);\n \n if (error.response.status === 401) {\n deAuthorized()\n }\n }\n\n throw error;\n });\n});\n","export default \"__VITE_ASSET__51d4e5d7__\"","\n\n\n\n\n{\n \"title\": \"Увы... Такой страницы нет\",\n \"description\": {\n \"first\": \"Страница, которую вы запрашиваете, не существует.\",\n \"second\": \"Возможно, вы ошиблись в адресе или страница была удалена.\",\n \"third\": \"Попробуйте начать с\",\n \"mainPage\": \"главной страницы.\"\n }\n}\n\n\n\n{\n \"title\": \"Oops… This page does not exist\",\n \"description\": {\n \"first\": \"The page you are looking for does not exist.\",\n \"second\": \"Perhaps you entered the wrong address or the page was deleted.\",\n \"third\": \"Try to start with\",\n \"mainPage\": \"the main page.\"\n }\n}\n\n\n\n{\n \"title\": \"Ups... Esta página no existe\",\n \"description\": {\n \"first\": \"La página que estás solicitando no existe.\",\n \"second\": \"Es posible que te hayas equivocado en la dirección o la página haya sido borrada.\",\n \"third\": \"Intenta con la\",\n \"mainPage\": \"página principal.\"\n }\n}\n\n","\n\n\n","import type { App } from 'vue';\n\nlet reCaptchaInstance: ReCaptchaInstanceInterface;\n\nexport function useReCaptcha() {\n return {\n reCaptcha: reCaptchaInstance,\n load,\n }\n}\n\nexport interface ReCaptchaPluginOptions {\n siteKey: string;\n}\n\nexport const ReCaptcha = {\n install(app: App, options: ReCaptchaPluginOptions) {\n reCaptchaInstance = new MockRecaptchaInstance()\n\n if (!options.siteKey) {\n return;\n }\n\n reCaptchaInstance = new ReCaptchaInstance(options)\n },\n};\n\ninterface ReCaptchaInstanceInterface {\n execute(action: string): Promise;\n load(): void\n}\n\nclass MockRecaptchaInstance implements ReCaptchaInstanceInterface {\n execute(action: string): Promise {\n return Promise.resolve(action);\n }\n\n load(): void {\n return\n }\n}\n\nclass ReCaptchaInstance implements ReCaptchaInstanceInterface {\n private options: ReCaptchaPluginOptions\n private renderId = ''\n\n constructor(options: ReCaptchaPluginOptions) {\n this.options = options\n }\n\n execute(action: string): Promise {\n if (!window.grecaptcha) {\n throw new Error('recaptcha not loaded');\n }\n\n return window.grecaptcha.execute(this.renderId, { action: action })\n }\n\n load() {\n if (!window.grecaptcha) {\n throw new Error('recaptcha not loaded');\n }\n\n this.renderId = window.grecaptcha.render({\n sitekey: this.options.siteKey,\n })\n }\n}\n\nconst load = (): Promise => {\n return new Promise(resolve => {\n const doc: Document = document\n const script: HTMLScriptElement = doc.createElement('script')\n\n script.async = true\n script.src = 'https://www.google.com/recaptcha/api.js?render=explicit'\n\n doc.body.appendChild(script);\n\n script.onload = () => {\n wait(() => {\n reCaptchaInstance.load()\n\n resolve()\n })\n }\n })\n}\n\nconst wait = (callback: () => void) => {\n if (window.grecaptcha === undefined) {\n setTimeout(() => {\n wait(callback);\n }, 25);\n } else {\n window.grecaptcha.ready(() => {\n callback();\n });\n }\n}\n","import { createRouter, createWebHistory } from 'vue-router';\nimport type { RouteRecordRaw } from 'vue-router';\nimport { useMeStore } from '@/stores/me';\nimport { useReCaptcha } from '@/plugins/reCaptcha';\n\nconst routes = [\n {\n path: '/',\n name: 'main',\n component: () => import('../views/MainView.vue'),\n meta: { requiresAuth: true },\n },\n {\n path: '/login',\n name: 'login',\n component: () => import('../views/LoginView.vue'),\n meta: { requiresAuth: false },\n props: { successMessage: '' },\n },\n {\n path: '/logout',\n name: 'logout',\n meta: { requiresAuth: true },\n },\n {\n path: '/reminder',\n name: 'reminder',\n component: () => import('../views/ReminderView.vue'),\n meta: { requiresAuth: false },\n },\n {\n path: '/reset/:confirmationToken',\n name: 'reset',\n component: () => import('../views/ResetView.vue'),\n meta: { requiresAuth: false },\n },\n {\n path: '/password-change',\n name: 'password-change',\n component: () => import('../views/PasswordChangeView.vue'),\n meta: { requiresAuth: true },\n },\n {\n path: '/email-change',\n name: 'email-change',\n component: () => import('../views/EmailChangeView.vue'),\n meta: { requiresAuth: true },\n },\n {\n path: '/email-confirm',\n name: 'email-confirm',\n component: () => import('../views/EmailConfirmView.vue'),\n },\n {\n path: '/:pathMatch(.*)*',\n name: '404',\n component: () => import('../views/Error404View.vue'),\n },\n] as RouteRecordRaw[];\n\nconst router = createRouter({\n history: createWebHistory('/'),\n routes,\n});\n\nrouter.beforeEach(async (to) => {\n const { reCaptcha, load } = useReCaptcha()\n const store = useMeStore()\n\n await load()\n\n if (store.isAuthorized === undefined || (store.isAuthorized && store.user === null)) {\n await store.me()\n }\n\n if (to.name === 'logout') {\n if (store.isAuthorized) {\n await reCaptcha.execute('logout')\n .then(function (token: string) {\n return store.logout(token)\n })\n }\n\n return { name: 'login', query: to.query };\n }\n\n if (!store.isAuthorized && to.query['fast-login']) {\n const fastLoginToken = to.query['fast-login'].toString()\n const recaptcha = await reCaptcha.execute('fastLogin')\n if (recaptcha) {\n await store.fastLogin(fastLoginToken, recaptcha)\n }\n }\n\n const route = { query: to.query };\n if (to.meta.requiresAuth === true && !store.isAuthorized) {\n return { name: 'login', ...route };\n } else if (to.meta.requiresAuth === false && store.isAuthorized) {\n return { name: 'main', ...route };\n }\n});\n\nexport default router;\n","import { createI18n } from 'vue-i18n';\n\nimport ru from '@/i18n/locales/ru_RU.json';\nimport en from '@/i18n/locales/en_GB.json';\nimport es from '@/i18n/locales/es_ES.json';\n\nexport enum LOCALES {\n RU = 'ru_RU',\n EN = 'en_GB',\n ES = 'es_ES',\n}\n\nconst defineLocale = (): LOCALES => {\n let queryLang = new URLSearchParams(window.location.search).get('lang')\n queryLang = queryLang?.split('_').shift() ?? null\n\n if (queryLang !== null) {\n for (const variable in LOCALES) {\n if (variable === queryLang.toUpperCase()) {\n return LOCALES[variable as keyof typeof LOCALES]\n }\n }\n }\n\n for (const language of navigator.languages) {\n for (const variable in LOCALES) {\n if (variable.toLowerCase() === language.split('-').shift()) {\n return LOCALES[variable as keyof typeof LOCALES]\n }\n }\n }\n\n return LOCALES[import.meta.env.VITE_LANG as keyof typeof LOCALES]\n}\n\nexport default createI18n({\n legacy: false,\n locale: defineLocale(),\n fallbackLocale: LOCALES.EN,\n messages: {\n [LOCALES.RU]: ru,\n [LOCALES.EN]: en,\n [LOCALES.ES]: es,\n },\n});\n","import type { Plugin } from 'vue';\n\nimport UiAlert from '@omnica/alert-vue3';\nimport UiButton from '@omnica/button-vue3';\nimport UiCheckbox from '@omnica/checkbox-vue3';\nimport UiError from '@omnica/error-vue3';\nimport UiIcon from '@omnica/icon-vue3';\nimport UiInput from '@omnica/input-vue3';\nimport UiLink from '@omnica/link-vue3';\nimport OmnicaPopperPlugin from '@omnica/popper-vue3';\nimport OmnicaTooltipPlugin from '@omnica/tooltip-vue3';\n\nexport default {\n install(app) {\n app.component('UiAlert', UiAlert);\n app.component('UiButton', UiButton);\n app.component('UiCheckbox', UiCheckbox);\n app.component('UiError', UiError);\n app.component('UiIcon', UiIcon);\n app.component('UiInput', UiInput);\n app.component('UiLink', UiLink);\n app.use(OmnicaPopperPlugin);\n app.use(OmnicaTooltipPlugin);\n },\n} as Plugin;\n","import type { App } from 'vue';\nimport type { Router } from 'vue-router';\n\nexport interface GtmOptions {\n id: string;\n vueRouter?: Router;\n}\n\nlet gtmPlugin: GtmPlugin;\n\nexport function useGtm(): GtmPlugin {\n return gtmPlugin;\n}\n\nexport const Gtm = {\n install(app: App, options: GtmOptions) {\n gtmPlugin = new GtmPlugin();\n\n if (options.vueRouter) {\n initVueRouterGuard(\n app,\n options.vueRouter\n );\n }\n\n window.dataLayer = [];\n\n if (!options.id) {\n return;\n }\n\n loadScript(options.id);\n },\n};\n\nfunction initVueRouterGuard(\n app: App,\n vueRouter: Exclude\n): void {\n vueRouter.afterEach(async (to) => {\n if (typeof to.name !== 'string') {\n return;\n }\n\n const name: string = typeof to.meta.gtm === 'string' && !!to.meta.gtm\n ? to.meta.gtm\n : to.name;\n\n let fullUrl: string = vueRouter.options.history.base;\n if (!fullUrl.endsWith('/')) {\n fullUrl += '/';\n }\n\n fullUrl += to.fullPath.startsWith('/')\n ? to.fullPath.substring(1)\n : to.fullPath;\n\n gtmPlugin.trackView(name, fullUrl);\n });\n}\n\nfunction loadScript(id: string) {\n const doc: Document = document;\n const script: HTMLScriptElement = doc.createElement('script');\n\n window.dataLayer.push({\n event: 'gtm.js',\n 'gtm.start': new Date().getTime(),\n });\n\n script.async = true;\n\n const queryString: URLSearchParams = new URLSearchParams({id});\n\n script.src = `https://www.googletagmanager.com/gtm.js?${queryString}`;\n\n doc.body.appendChild(script);\n}\n\nclass GtmPlugin {\n public trackView(\n screenName: string,\n path: string\n ): void {\n window.dataLayer.push({\n event: 'content-view',\n 'content-view-name': screenName,\n 'content-name': path,\n });\n }\n\n public trackEvent(\n event: string,\n target: string | null = null,\n action: string | null = null,\n targetProperties: string | null = null,\n value: string | null = null,\n interactionType: boolean | null = false\n ): void {\n window.dataLayer.push({\n event: event,\n target: target,\n action: action,\n 'target-properties': targetProperties,\n value: value,\n 'interaction-type': interactionType,\n });\n }\n}\n","import type { App } from 'vue';\nimport type { Router } from 'vue-router';\n\nlet metrikaInstance: MetrikaInstanceInterface;\n\nexport function useMetrika(): MetrikaInstanceInterface {\n return metrikaInstance;\n}\n\nexport interface MetrikaPluginOptions {\n id: string;\n vueRouter?: Router;\n}\n\nexport const Metrika = {\n install: function(app: App, options: MetrikaPluginOptions) {\n metrikaInstance = new MockMetrikaInstance()\n\n if (options.vueRouter) {\n initVueRouterGuard(\n app,\n options.vueRouter\n );\n }\n\n if (!options.id) {\n return;\n }\n\n loadScript()\n .then(() => {\n metrikaInstance = new Ya.Metrika2({\n id: options.id,\n clickmap:true,\n trackLinks:true,\n accurateTrackBounce:true,\n webvisor:true,\n trackHash:true,\n })\n });\n },\n};\n\nfunction initVueRouterGuard(\n app: App,\n vueRouter: Exclude\n): void {\n vueRouter.afterEach(async (to, from) => {\n if (to.path == from.path) {\n return;\n }\n\n useMetrika().hit(to.path);\n });\n}\n\nfunction loadScript(): Promise {\n return new Promise(resolve => {\n const doc: Document = document\n const script: HTMLScriptElement = doc.createElement('script')\n\n script.async = true\n script.src = 'https://mc.yandex.ru/metrika/tag.js'\n\n doc.body.appendChild(script);\n\n script.onload = () => resolve()\n })\n}\n\ninterface MetrikaInstanceInterface {\n hit(url: string): void;\n reachGoal(target: string): void;\n}\n\nclass MockMetrikaInstance implements MetrikaInstanceInterface {\n hit(): void {\n return\n }\n reachGoal(): void {\n return\n }\n}\n","import type { App } from 'vue';\nimport * as SentryPlugin from '@sentry/vue';\nimport type { Router } from 'vue-router';\n\nconst replaysSessionSampleRate = 0.1\nconst replaysOnErrorSampleRate = 1.0\n\nexport interface SentryOptions {\n dsn: string;\n vueRouter: Router;\n}\n\nexport const Sentry = {\n install(app: App, options: SentryOptions) {\n if (!options.dsn) {\n return\n }\n\n SentryPlugin.init({\n app,\n dsn: options.dsn,\n integrations: [\n new SentryPlugin.BrowserTracing({\n routingInstrumentation: SentryPlugin.vueRouterInstrumentation(options.vueRouter),\n }),\n new SentryPlugin.Replay(),\n ],\n sendDefaultPii: true,\n replaysSessionSampleRate,\n replaysOnErrorSampleRate,\n ignoreErrors: [\n /^AxiosError:/,\n /^Non-Error promise rejection captured with value/,\n ],\n })\n },\n}\n","import { createApp } from 'vue';\nimport { createPinia } from 'pinia';\n\nimport App from './App.vue';\nimport router from './router';\nimport i18n from './i18n';\nimport Omnica from '@/plugins/omnica';\nimport { ReCaptcha } from '@/plugins/reCaptcha';\nimport { Gtm } from '@/plugins/gtm';\nimport { Metrika } from '@/plugins/metrika';\nimport { Sentry } from '@/plugins/sentry';\n\nimport './assets/styles/main.less';\n\nconst app = createApp(App);\n\napp.use(createPinia());\napp.use(router);\napp.use(i18n);\napp.use(Omnica);\napp.use(ReCaptcha, {\n siteKey: import.meta.env.VITE_RECAPTCHA_SITE_KEY,\n});\napp.use(Gtm, {\n id: import.meta.env.VITE_GTM_ID,\n vueRouter: router,\n})\napp.use(Metrika, {\n id: import.meta.env.VITE_METRIKA_ID,\n vueRouter: router,\n})\napp.use(Sentry, {\n dsn: import.meta.env.VITE_SENTRY_DSN,\n vueRouter: router,\n})\n\napp.mount('#app');\n","export default \"__VITE_ASSET__aba69779__\"","export default \"__VITE_ASSET__a1368e73__\"","export default \"__VITE_ASSET__076247bf__\"","\n\n\n\n\n\n\n{\n \"title\": \"Вход в {siteName}\",\n \"backToTheSystem\": \"Вернуться в систему\",\n \"logout\": \"Выйти\"\n}\n\n\n\n{\n \"title\": \"Log in {siteName}\",\n \"backToTheSystem\": \"Back to system\",\n \"logout\": \"Sign out\"\n}\n\n\n\n{\n \"title\": \"Entrar a {siteName}\",\n \"backToTheSystem\": \"Volver al sistema\",\n \"logout\": \"Cerrar sesión\"\n}\n\n","\n\n\n\n\n","export class Account {\n public uid: string;\n public domain: string;\n public active: boolean;\n\n constructor(uid: string, domain: string, active: boolean) {\n this.uid = uid;\n this.domain = domain;\n this.active = active;\n }\n}\n","import { ref } from 'vue';\nimport { defineStore } from 'pinia';\nimport client from '@/api/private/client';\nimport { Account } from '@/model/account';\nimport type { AccountsRequest } from '@/api/private/interface';\n\nexport const useAccountsStore = defineStore('accounts', () => {\n const limit = 20;\n\n const totalCount = ref(0)\n const hasNextPage = ref(true)\n const cursor = ref(null)\n const accounts = ref([]);\n\n function clear() {\n totalCount.value = 0\n hasNextPage.value = true\n cursor.value = null\n accounts.value = []\n }\n\n function fetchAccounts(search: string) {\n if (!hasNextPage.value) {\n return\n }\n\n const request: AccountsRequest = {\n first: limit,\n }\n\n if (cursor.value != undefined) {\n request.after = cursor.value\n }\n\n if (search) {\n request.domain = search\n }\n\n return client\n .accounts(request)\n .then(({ data, error }) => {\n if (error != null || data == null) {\n return\n }\n\n const response = data.data;\n\n if (totalCount.value === 0) {\n totalCount.value = response.total_count\n }\n\n hasNextPage.value = response.has_next_page\n cursor.value = response.end_cursor\n\n response.accounts.forEach((item) => {\n if (!accounts.value.filter((account) => account.uid === item.uid).length) {\n accounts.value.push(new Account(item.uid, item.domain, item.active));\n }\n });\n })\n .catch((error) => {\n throw error;\n });\n }\n\n return {\n totalCount,\n hasNextPage,\n cursor,\n accounts,\n clear,\n fetchAccounts,\n };\n});\n","\n\n\n\n\n\n\n{\n \"title\": \"Выберите систему\",\n \"description\": \"Почта {email} не зарегистрирована ни в одной системе | Почта {email} зарегистрирована в {count} системе | Почта {email} зарегистрирована в {count} системах. Выберите, в какую хотите зайти\",\n \"accountDisable\": {\n \"top\": \"Ваш профиль не\\u00a0активен в\\u00a0этой системе.\",\n \"bottom\": \"Для входа свяжитесь с\\u00a0администратором системы.\"\n },\n \"systemAccount\": \"Техническая поддержка\",\n \"systemAccountDescription\": \"Вы вошли под аккаунтом технической поддержки. Чтобы перейти в целевую систему, откройте прямую ссылку.\",\n \"noTarget\": \"Вы не имеете доступа к запрошенной системе.\",\n \"targetInactive\": \"Ваш профиль в запрошенной системе неактивен.\",\n \"empty\": \"Нет систем удовлетворяющих вашему запросу.\"\n}\n\n\n\n{\n \"title\": \"Choose a system\",\n \"description\": \"Mail {email} is not registered in any system | Mail {email} is registered in the {count} system | Mail {email} is registered in {count} systems, select which one you want to log in\",\n \"accountDisable\": {\n \"top\": \"Your profile is not active on this system.\",\n \"bottom\": \"To log in, contact the system administrator.\"\n },\n \"systemAccount\": \"Support account\",\n \"systemAccountDescription\": \"You are logged in with a technical support account. To go to the target system, open the direct link.\",\n \"noTarget\": \"You do not have access to the requested system.\",\n \"targetInactive\": \"Your profile in the requested system is inactive.\",\n \"empty\": \"There are no systems that meet your request.\"\n}\n\n\n\n{\n \"title\": \"Selecciona el sistema\",\n \"description\": \"El email {email} no está registrado en ningún sistema | El email {email} está registrado en {count} sistema | El email {email} está registrado en {count} sistemas, seleccione a cual desea ingresar\",\n \"accountDisable\": {\n \"top\": \"Tu perfil no está activo en este sistema.\",\n \"bottom\": \"Para entrar ponte en contacto con el administrador del sistema.\"\n },\n \"systemAccount\": \"Cuenta de soporte\",\n \"systemAccountDescription\": \"Ha iniciado sesión con una cuenta de soporte técnico. Para ir al sistema de destino, abra el enlace directo.\",\n \"noTarget\": \"No tiene acceso al sistema solicitado.\",\n \"targetInactive\": \"Su perfil en el sistema solicitado está inactivo.\",\n \"empty\": \"No hay sistemas que cumplen tu solicitud.\"\n}\n\n","\n","\n\n\n\n\n\n\n{\n \"yourPassword\": \"Ваш пароль\",\n \"forReliability\": \"Для большей надежности используйте\",\n \"passwordRequires\": {\n \"moreThan6Symbols\": \"более 6 символов\",\n \"digits\": \"цифры\",\n \"lowerUpperCase\": \"разный регистр букв\"\n },\n \"strength\": {\n \"weak\": \"не подходит\",\n \"fair\": \"легкий\",\n \"medium\": \"средний\",\n \"strong\": \"надежный\"\n }\n}\n\n\n\n{\n \"yourPassword\": \"Password strength\",\n \"forReliability\": \"For stronger protection use\",\n \"passwordRequires\": {\n \"moreThan6Symbols\": \"at least 6 characters\",\n \"digits\": \"digits\",\n \"lowerUpperCase\": \"upper and lower case letters\"\n },\n \"strength\": {\n \"weak\": \"weak\",\n \"fair\": \"fair\",\n \"medium\": \"good\",\n \"strong\": \"strong\"\n }\n}\n\n\n\n{\n \"yourPassword\": \"Tu contraseña\",\n \"forReliability\": \"Para mayor seguridad, usa\",\n \"passwordRequires\": {\n \"moreThan6Symbols\": \"más de 6 dígitos\",\n \"digits\": \"número\",\n \"lowerUpperCase\": \"diferentes mayúsculas y minúsculas\"\n },\n \"strength\": {\n \"weak\": \"no es adecuada\",\n \"fair\": \"fácil\",\n \"medium\": \"normal\",\n \"strong\": \"segura\"\n }\n}\n\n","\n","\n","\n\n\n\n\n\n\n{\n \"showPassword\": \"Показать пароль\",\n \"hidePassword\": \"Скрыть пароль\"\n}\n\n\n\n{\n \"showPassword\": \"Show password\",\n \"hidePassword\": \"Hide password\"\n}\n\n\n\n{\n \"showPassword\": \"Mostrar la contraseña\",\n \"hidePassword\": \"Ocultar la contraseña\"\n}\n\n","import type {\n ClientInterface, ConfirmEmailRequest,\n RequestPasswordRequest,\n ResetPasswordRequest,\n SuccessResponse,\n} from '@/api/public/interface';\nimport { handleError } from '@/api/response';\nimport type { Response } from '@/api/response';\nimport client from '@/api/client';\n\nclass Client implements ClientInterface {\n requestPassword(\n request: RequestPasswordRequest\n ): Promise> {\n return new Promise>((resolve, reject) => {\n client\n .post(\n '/api/v1/public/request-password', \n {\n email: request.email,\n },\n {\n headers: {\n recaptcha: request.recaptcha,\n },\n }\n )\n .then(function (response) {\n resolve({\n data: response.data,\n });\n })\n .catch(function (err) {\n handleError(err, resolve, reject);\n });\n });\n }\n\n resetPassword(\n request: ResetPasswordRequest\n ): Promise> {\n return new Promise>((resolve, reject) => {\n client\n .post(\n '/api/v1/public/reset-password', \n {\n first_password: request.firstPassword,\n second_password: request.secondPassword,\n confirmation_token: request.confirmationToken,\n },\n {\n headers: {\n recaptcha: request.recaptcha,\n },\n }\n )\n .then(function (response) {\n resolve({\n data: response.data,\n });\n })\n .catch(function (err) {\n handleError(err, resolve, reject);\n });\n });\n }\n\n confirmEmail(\n request: ConfirmEmailRequest\n ): Promise> {\n return new Promise(((resolve, reject) => {\n client\n .post(\n '/api/v1/public/confirm-email',\n {\n confirmation_token: request.confirmationToken,\n },\n {\n headers: {\n recaptcha: request.recaptcha,\n },\n }\n ).then(resolve)\n .catch((err) => handleError(err, resolve, reject))\n }))\n }\n}\n\nexport default new Client();\n","import { defineStore } from 'pinia';\nimport { ref } from 'vue';\nimport client from '@/api/public/client';\n\nexport const usePasswordStore = defineStore('password', () => {\n const makeRequestChangePassword = ref(false);\n const makeRequestResetPassword = ref(false);\n\n const fetchRequestPassword = (email: string, token: string) => {\n return client\n .requestPassword({\n email: email,\n recaptcha: token,\n })\n .then((response) => {\n if (response.data != null) {\n makeRequestChangePassword.value = true;\n }\n\n return response;\n })\n .catch((error) => {\n throw error;\n });\n };\n\n const fetchResetPassword = (\n firstPassword: string,\n secondPassword: string,\n confirmationToken: string,\n token: string\n ) => {\n return client\n .resetPassword({\n firstPassword: firstPassword,\n secondPassword: secondPassword,\n confirmationToken: confirmationToken,\n recaptcha: token,\n })\n .then((response) => {\n if (response.data != null) {\n makeRequestResetPassword.value = true;\n }\n\n return response;\n })\n .catch((error) => {\n throw error;\n });\n };\n\n return {\n makeRequestChangePassword,\n makeRequestResetPassword,\n fetchRequestPassword,\n fetchResetPassword,\n };\n});\n","import { ref } from 'vue';\n\nconst isSending = ref(false)\n\nexport function useSending() {\n const setSending = (value: boolean) => {\n isSending.value = value\n }\n\n return {\n isSending,\n setSending,\n }\n}\n","\n\n\n\n\n\n\n{\n \"forgetPassword\": \"Забыли пароль?\",\n \"signIn\": \"Войти\",\n \"rememberMe\": \"Запомнить меня\",\n \"changePassword\": \"Мы отправили письмо с\\u00a0инструкцией как сбросить пароль\",\n \"resetPassword\": \"Пароль сброшен\",\n \"error\": {\n \"emptyEmail\": \"Введите почту\",\n \"emptyPassword\": \"Введите пароль\",\n \"notValidEmail\": \"Почта введена не верно\",\n \"authError\": \"Неверная почта или пароль\",\n \"undefinedError\": \"Неизвестная ошибка\"\n }\n}\n\n\n\n{\n \"forgetPassword\": \"Forget password?\",\n \"signIn\": \"Sign in\",\n \"rememberMe\": \"Remember me on this computer\",\n \"changePassword\": \"We sent an email with\\u00a0instructions on how to reset the password\",\n \"resetPassword\": \"Password reset\",\n \"error\": {\n \"emptyEmail\": \"Enter your email\",\n \"emptyPassword\": \"Enter password\",\n \"notValidEmail\": \"Email entered is incorrect\",\n \"authError\": \"Incorrect email or password\",\n \"undefinedError\": \"Unknown error\"\n }\n}\n\n\n\n{\n \"forgetPassword\": \"¿Has olvidado contraseña?\",\n \"signIn\": \"Entrar\",\n \"rememberMe\": \"Recordarme en este ordenador\",\n \"changePassword\": \"Hemos enviado el correo con\\u00a0la instrucción para resetear la contraseña\",\n \"resetPassword\": \"Contraseña reseteada\",\n \"error\": {\n \"emptyEmail\": \"Introduce tu correo electrónico\",\n \"emptyPassword\": \"Introducir la contraseña\",\n \"notValidEmail\": \"El correo electrónico ingresado es incorrecto\",\n \"authError\": \"El email o la contraseña es incorrecta\",\n \"undefinedError\": \"Error desconocido\"\n }\n}\n\n","\n\n\n\n\n\n\n{\n \"title\": \"Восстановление доступа в {siteName}\",\n \"receiveEmail\": \"Получить письмо с инструкцией\",\n \"backward\": \"Назад\",\n \"error\": {\n \"emptyEmail\": \"Введите почту\",\n \"invalidEmail\": \"Почта введена не верно\",\n \"userNotFound\": \"Данная почта не зарегистрирована в системе\",\n \"disableServiceAccount\": \"Пользователь тех. поддержки не может менять пароль\",\n \"alreadyRequested\": \"Вы уже запрашивали изменение пароля\",\n \"undefinedError\": \"Неизвестная ошибка\"\n }\n}\n\n\n\n{\n \"title\": \"Restoring access to {siteName}\",\n \"receiveEmail\": \"Receive an email with instructions\",\n \"backward\": \"Back\",\n \"error\": {\n \"emptyEmail\": \"Enter your email\",\n \"invalidEmail\": \"Invalid e-mail\",\n \"userNotFound\": \"This mail is not registered in the system\",\n \"disableServiceAccount\": \"User of tech. support cannot change the password\",\n \"alreadyRequested\": \"You have already requested a password change\",\n \"undefinedError\": \"Unknown error\"\n }\n}\n\n\n\n{\n \"title\": \"Restaurar el acceso a {siteName}\",\n \"receiveEmail\": \"Recibir un email de instrucciones\",\n \"backward\": \"Atrás\",\n \"error\": {\n \"emptyEmail\": \"Introduce tu correo electrónico\",\n \"invalidEmail\": \"Email no válido\",\n \"userNotFound\": \"Este correo no está registrado en el sistema\",\n \"disableServiceAccount\": \"Usuario de tecnología. soporte no puede cambiar la contraseña\",\n \"alreadyRequested\": \"Ya has solicitado un cambio de contraseña\",\n \"undefinedError\": \"Error desconocido\"\n }\n}\n\n","