{"version":3,"file":"index.js","mappings":"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","sources":["webpack://shared-core/webpack/runtime/load script","webpack://shared-core/./src/adapters/urania.ts","webpack://shared-core/./src/adapters/mercury.ts","webpack://shared-core/./src/adapters/__mocks__/mercury.ts","webpack://shared-core/./src/adapters/index.ts","webpack://shared-core/./src/helpers/phone-compress.ts","webpack://shared-core/./src/adapters/social.ts","webpack://shared-core/./src/presentation/auth-popup/helpers/concat-auth-params-to-query.ts","webpack://shared-core/./src/helpers/get-cookie.ts","webpack://shared-core/./src/helpers/get-mindbox-device-uuid.ts","webpack://shared-core/./src/helpers/http-api.ts","webpack://shared-core/./src/helpers/subscribe.ts","webpack://shared-core/./src/presentation/auth-popup/components/social-networks/do-social-auth.ts","webpack://shared-core/./src/resources/make.ts","webpack://shared-core/./src/resources/index.ts","webpack://shared-core/./node_modules/react-dom/client.js","webpack://shared-core/external var \"LIBS.react\"","webpack://shared-core/external var \"LIBS[\\\"react-dom\\\"]\"","webpack://shared-core/webpack/bootstrap","webpack://shared-core/webpack/runtime/compat get default export","webpack://shared-core/webpack/runtime/define property getters","webpack://shared-core/webpack/runtime/ensure chunk","webpack://shared-core/webpack/runtime/get javascript chunk filename","webpack://shared-core/webpack/runtime/get mini-css chunk filename","webpack://shared-core/webpack/runtime/global","webpack://shared-core/webpack/runtime/hasOwnProperty shorthand","webpack://shared-core/webpack/runtime/make namespace object","webpack://shared-core/webpack/runtime/publicPath","webpack://shared-core/webpack/runtime/css loading","webpack://shared-core/webpack/runtime/jsonp chunk loading","webpack://shared-core/./src/events/login.ts","webpack://shared-core/./src/controllers/auth.ts","webpack://shared-core/./src/presentation/index.tsx","webpack://shared-core/./src/controllers/meta.ts","webpack://shared-core/./src/helpers/fetch-all.ts","webpack://shared-core/./src/controllers/subscriptions.ts","webpack://shared-core/./src/controllers/stats.ts","webpack://shared-core/./src/actions/index.ts","webpack://shared-core/./src/actions/auth.ts","webpack://shared-core/./src/actions/meta.ts","webpack://shared-core/./src/actions/subscriptions.ts","webpack://shared-core/./src/actions/stats.ts","webpack://shared-core/./src/helpers/dom.ts","webpack://shared-core/./src/helpers/dom/scroll-to-element.ts","webpack://shared-core/./src/helpers/dom/toggle-element-visibility.ts","webpack://shared-core/./src/helpers/dom/render-subscription-form.ts","webpack://shared-core/./src/helpers/window.ts","webpack://shared-core/./src/init.ts","webpack://shared-core/./src/index.ts"],"sourcesContent":["var inProgress = {};\nvar dataWebpackPrefix = \"shared-core:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","import { uraniaApi } from '../helpers/http-api';\nimport type { SubscriptionResource } from '../types';\n\ntype Props = {\n socialId?: number;\n email: string;\n pointOfContact?: string;\n topic: string;\n resourceKey?: string;\n resourceType?: SubscriptionResource;\n};\n\nconst uraniaAdapter = {\n subscriptions: {\n async subscribe({\n socialId,\n resourceKey,\n email,\n pointOfContact,\n topic,\n resourceType = 'course',\n }: Props) {\n return uraniaApi.post(`/users/subscribe/`, {\n email,\n // Условия для обратной совместимости\n topic: resourceKey ? topic : undefined,\n resource_key: resourceKey || topic,\n point_of_contact: pointOfContact,\n social_id: socialId,\n resource_type: resourceType,\n });\n },\n },\n};\n\nexport default uraniaAdapter;\n\nexport type UraniaAdapter = typeof uraniaAdapter;\n","import { handleResponse, MERCURY_API } from '../helpers/http-api';\n\ntype MercuryArticleStats = {\n views: number;\n comments: number;\n likes: number;\n favorites: number;\n};\n\nconst mercuryAdapter = {\n stats: {\n get(articleId: string) {\n return fetch(`${MERCURY_API}/rpc/articles/get-stats/${articleId}`).then(\n handleResponse\n );\n },\n },\n};\n\nexport default mercuryAdapter;\n\nexport type MercuryAdapter = typeof mercuryAdapter;\n","/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable jest/no-mocks-import */\n\nimport type { MercuryAdapter } from '../mercury';\n\nconst mockMercuryAdapter: MercuryAdapter = {\n stats: {\n get() {\n return Promise.resolve({\n favorites: 194,\n views: 151595,\n likes: 98,\n comments: 10,\n });\n },\n },\n};\n\nexport default mockMercuryAdapter;\n\n/* eslint-enable @typescript-eslint/no-unused-vars */\n/* eslint-enable jest/no-mocks-import */\n","/* eslint-disable jest/no-mocks-import */\nimport socialAdapter from './social';\nimport uraniaAdapter from './urania';\nimport mercuryAdapter from './mercury';\nimport socialMockAdapter from './__mocks__/social';\nimport uraniaMockAdapter from './__mocks__/urania';\nimport mercuryMockAdapter from './__mocks__/mercury';\n\n// При добавлении новых адаптеров, нужно написать алиас в webpack.config.js и тогда моки не попадут в продовую сборку\nexport const social = process.env.MOCK ? socialMockAdapter : socialAdapter;\nexport const urania = process.env.MOCK ? uraniaMockAdapter : uraniaAdapter;\nexport const mercury = process.env.MOCK ? mercuryMockAdapter : mercuryAdapter;\n/* eslint-enable jest/no-mocks-import */\n","export function phoneCompress(phone: string): string {\n return phone.replace(/\\s/g, '').replace('+', '').replace(/^8/, '7');\n}\n","import {\n socialApi,\n getRequestOptions,\n handleResponse,\n SOCIAL_API,\n} from '../helpers/http-api';\nimport type { SocialApiLoginUrlOptions } from '../presentation/auth-popup/components/social-networks/do-social-auth';\nimport {\n doSocialAuthFetch,\n doSocialAuthRequestInNewWindow,\n forceCloseAuthWindow,\n initAuthWindow,\n} from '../presentation/auth-popup/components/social-networks/do-social-auth';\nimport type { LoginProviderName } from '../presentation/auth-popup/components/social-networks/providers';\nimport { getMindboxDeviceUuid } from '../helpers/get-mindbox-device-uuid';\nimport { phoneCompress } from '../helpers/phone-compress';\nimport { concatAuthParamsToQuery } from '../presentation/auth-popup/helpers/concat-auth-params-to-query';\nimport type { components } from './types/social-api-types';\n\nexport type LoginParams = {\n pointOfContact: string;\n promocode?: string;\n};\n\nexport type ApiFeatureFlagsResponse = {\n flags: string[];\n};\n\nexport type ApiMergeAccountResponse = {\n id: number;\n email: string;\n};\n\nexport type PublicProfile = {\n id: number;\n name: string;\n image: string;\n karma: number;\n obtained_achievements: Array<{\n slug: string;\n title: string;\n image: string;\n }>;\n // Добавляем только те поля, которые нужны для отображения на этапе мерджа аккаунтов\n [k: string]: unknown;\n};\n\nconst socialAdapter = {\n login: {\n async email(email: string, loginParams: LoginParams): Promise {\n // Временно меняет ручку, для защиты от ddos на email1\n return socialApi.post('/account/login/email1/', {\n email,\n point_of_contact: loginParams.pointOfContact,\n promocode: loginParams.promocode,\n });\n },\n\n async socialNetwork(\n provider: LoginProviderName,\n loginParams: LoginParams\n ): Promise {\n initAuthWindow();\n\n const loginUrlParams: SocialApiLoginUrlOptions = {\n provider,\n point_of_contact: loginParams.pointOfContact,\n promocode: loginParams.promocode,\n };\n\n const mindboxDeviceUuid = getMindboxDeviceUuid();\n if (mindboxDeviceUuid) {\n loginUrlParams.tj_device_id = mindboxDeviceUuid;\n }\n\n const authRedirect = await doSocialAuthFetch(\n '/account/login/',\n loginUrlParams\n );\n if (!authRedirect) {\n forceCloseAuthWindow();\n return Promise.reject();\n }\n\n return doSocialAuthRequestInNewWindow(authRedirect);\n },\n\n async ssoRequestAuthUrl(\n phone: string,\n loginParams: LoginParams\n ): Promise {\n const loginUrlParams: SocialApiLoginUrlOptions = {\n provider: 'tinkoff_sso',\n point_of_contact: loginParams.pointOfContact,\n promocode: loginParams.promocode,\n };\n\n const mindboxDeviceUuid = getMindboxDeviceUuid();\n if (mindboxDeviceUuid) {\n loginUrlParams.tj_device_id = mindboxDeviceUuid;\n }\n\n const authUrl = concatAuthParamsToQuery('/account/login/', {\n phone: phoneCompress(phone),\n theme: 'journal',\n });\n const authRedirect = await doSocialAuthFetch(authUrl, loginUrlParams);\n if (!authRedirect) {\n return Promise.reject();\n }\n\n return Promise.resolve(authRedirect);\n },\n\n async ssoAuth(query: string): Promise<{ status: string; payload: string }> {\n return socialApi.get(`/account/tinkoff/login/callback/?${query}`);\n },\n },\n validateCode: {\n async phone(phone: string, code: string, pointOfContact?: string) {\n return fetch(\n `${SOCIAL_API}/account/login/phone/validate-code/`,\n getRequestOptions('POST', {\n phone,\n code,\n point_of_contact: pointOfContact,\n })\n ).then((r) => {\n if (r.status === 201) {\n return r;\n }\n return handleResponse(r);\n });\n },\n\n async email(email: string, code: string, pointOfContact?: string) {\n return fetch(\n `${SOCIAL_API}/account/login/email/validate-code/`,\n getRequestOptions('POST', {\n email,\n code,\n point_of_contact: pointOfContact,\n })\n ).then((r) => {\n if (r.status === 201) {\n return r;\n }\n return handleResponse(r);\n });\n },\n },\n\n async personalData(name: string, image?: File) {\n let imgUrl;\n if (image) {\n const img: any = await socialApi.uploadImage(image);\n\n if (img?.links?.original) {\n imgUrl = img.links.original;\n }\n }\n\n return socialApi.put('/account/profile/', {\n name,\n image: imgUrl,\n });\n },\n\n logout() {\n return fetch(\n `${SOCIAL_API}/account/logout/`,\n getRequestOptions('POST')\n ).then((result) => {\n if (result.status === 204) {\n return 'success';\n }\n return 'fail';\n });\n },\n\n profile() {\n return socialApi.get('/account/profile/');\n },\n\n publicProfileById(id: number) {\n return socialApi.get(`/profiles/${id}/`);\n },\n\n flags(): Promise {\n return socialApi.get('/flags/');\n },\n merge: {\n post(mergeAccountId: number): Promise {\n return socialApi.post('/account/merge/', {\n account_to_merge: mergeAccountId,\n } as components['schemas']['MergeAccountRequestRequest']);\n },\n validateCode(email: string, code: string): Promise {\n return socialApi.post('/account/merge/validate-code/', {\n email,\n code,\n } as components['schemas']['AccountMergeValidateCodeRequestRequest']);\n },\n get(): Promise {\n return socialApi.get('/account/merge/');\n },\n },\n subscriptions: {\n get(): Promise<{\n email: string[];\n email_is_saved: boolean;\n flows: string[];\n }> {\n return socialApi.get('/account/subscriptions/');\n },\n\n async subscribeToTopic(\n email: string,\n topics: string[],\n pointOfContact: string\n ) {\n return socialApi.post('/notifications/subscribe/', {\n email,\n topics,\n point_of_contact: pointOfContact,\n });\n },\n },\n meta: {\n get: {\n favorites(params?: { limit?: number; offset?: number }): Promise<{\n data: { article_path: string; article_uuid: string }[];\n count: number;\n }> {\n let uri = '/account/favorites/';\n if (params) {\n // Нужно преобразовать объект в Record\n const mappedParams: Record = {};\n for (const [key, value] of Object.entries(params)) {\n mappedParams[key] = value.toString();\n }\n const urlSearchParams = new URLSearchParams(mappedParams);\n\n uri += `?${urlSearchParams}`;\n }\n return socialApi.get(uri, true);\n },\n\n votes(): Promise<\n { article_path: string; article_uuid: string; user_vote: number }[]\n > {\n return socialApi.get('/account/article-votes/');\n },\n },\n add: {\n favorite(\n article_uuid: string\n ): Promise<{ article_path: string; article_uuid: string }> {\n return socialApi.post('/account/favorites/', {\n article_uuid,\n });\n },\n\n async vote(article_uuid: string): Promise {\n return socialApi.post(`/articles/${article_uuid}/vote/`, {\n method: 'up',\n });\n },\n },\n remove: {\n favorite(article_uuid: string): Promise {\n return socialApi.delete(`/account/favorites/${article_uuid}/`);\n },\n\n vote(article_uuid: string): Promise {\n return socialApi.post(`/articles/${article_uuid}/vote/`, {\n method: 'down',\n });\n },\n },\n },\n};\n\nexport default socialAdapter;\n\nexport type SocialAdapter = typeof socialAdapter;\n","export function concatAuthParamsToQuery(\n url: string,\n params: { [key: string]: string }\n): string {\n const authParams = [];\n for (const [key, value] of Object.entries(params)) {\n authParams.push(`${key}=${value}`);\n }\n const query = authParams.length\n ? `?auth_params=${encodeURIComponent(authParams.join('&'))}`\n : '';\n\n return `${url}${query}`;\n}\n","export function getCookie(name: string) {\n const value = `; ${document.cookie}`;\n const parts = value.split(`; ${name}=`);\n if (parts && parts.length === 2) {\n return parts.pop()?.split(';').shift();\n }\n}\n","import { getCookie } from './get-cookie';\n\nconst MINDBOX_DEVICE_UUID_KEY = 'mindboxDeviceUUID';\n\nexport function getMindboxDeviceUuid(): string | undefined {\n const deviceUuidFromCookie = getCookie(MINDBOX_DEVICE_UUID_KEY);\n const deviceUuidFromLocalStorage =\n localStorage.getItem(MINDBOX_DEVICE_UUID_KEY) || undefined;\n // Проверяем наличие deviceUuid в сookie и localStorage.\n // В 99% случаев он должен там лежать. Если вдруг по каким-то\n // причинам скрипт майндбокса не отработал и не проставил куку\n // с deviceUuid, то сами его генерим\n const deviceUuid = deviceUuidFromCookie || deviceUuidFromLocalStorage;\n\n // Если в localStorage нет deviceUuid, то записываем туда\n // полученный из кук\n if (!deviceUuidFromLocalStorage && deviceUuid) {\n localStorage.setItem(MINDBOX_DEVICE_UUID_KEY, deviceUuid);\n }\n\n return deviceUuid;\n}\n","import { getMindboxDeviceUuid } from './get-mindbox-device-uuid';\nimport { getCookie } from './get-cookie';\n\ntype RequestOptions = {\n method: 'GET' | 'POST' | 'DELETE' | 'PUT';\n headers: Record;\n referrerPolicy?: ReferrerPolicy;\n credentials?: RequestCredentials;\n body?: any;\n};\n\nconst { SOCIAL_API_URL, URANIA_API_URL, MERCURY_API_URL } = (window as any)\n .CONSTANTS;\nexport const SOCIAL_API = `${SOCIAL_API_URL}/api/v23`;\nexport const URANIA_API = `${URANIA_API_URL}/api/v14`;\nexport const MERCURY_API = `${MERCURY_API_URL}/public/v2`;\n\nconst getApi = (api: string) => ({\n get: get(api),\n post: post(api),\n put: put(api),\n delete: _delete(api),\n});\n\nfunction get(\n api: string\n): (url: string, fullResponse?: boolean) => Promise {\n return (url: string, fullResponse?: boolean) =>\n fetch(api + url, getRequestOptions('GET')).then((r) =>\n handleResponse(r, fullResponse)\n );\n}\n\nfunction post(api: string): (url: string, body: T) => Promise {\n return (url: string, body: T) =>\n fetch(api + url, getRequestOptions('POST', body)).then((r) =>\n handleResponse(r)\n );\n}\n\nfunction put(\n api: string\n): (url: string, body?: T) => Promise {\n return (url: string, body?: T) =>\n fetch(api + url, getRequestOptions('PUT', body)).then((r) =>\n handleResponse(r)\n );\n}\n\nfunction _delete(api: string): (url: string) => Promise {\n return (url: string) => fetch(api + url, getRequestOptions('DELETE'));\n}\n\nfunction uploadImage(image: File): Promise {\n const formData = new FormData();\n formData.set('image', image);\n\n const option = { ...getRequestOptions('POST') };\n option.body = formData;\n if (option.headers) {\n delete option.headers['Content-Type'];\n }\n\n return fetch(`${SOCIAL_API}/images/`, option).then((r) =>\n handleResponse(r)\n );\n}\n\n// helper functions\nexport function handleResponse(\n response: Response,\n fullResponse?: boolean\n): Promise {\n return response\n .json()\n .then((data) => {\n if (!response.ok || data.status !== 'ok') {\n const errorText = data?.error?.code || response.statusText;\n throw errorText;\n }\n return fullResponse ? data : data.data;\n })\n .catch((err) => {\n throw String(err);\n });\n}\n\nexport function getRequestOptions(\n method: RequestOptions['method'],\n body?: T\n) {\n const requestOptions: RequestOptions = {\n method,\n credentials: 'include',\n // По умолчанию, fetch не отправляет полный Referer при cross-origin\n // запросах. Но у нас он используется, например для аналитики. Поэтому\n // меняем политику на передачу полного Referer'a, кроме HTTP запросов,\n // которых у нас по идее быть не должно\n referrerPolicy: 'no-referrer-when-downgrade',\n headers: {\n 'Content-Type': 'application/json',\n },\n };\n\n // Куку x_csrf подставляет соц.платформа\n // чтобы приложение могло запрашивать/менять данные\n const csrf = getCookie('x_csrf');\n if (csrf) {\n requestOptions.headers['X-CSRFToken'] = csrf;\n }\n\n const mindboxDeviceUuid = getMindboxDeviceUuid();\n if (mindboxDeviceUuid) {\n requestOptions.headers['tj-device-id'] = mindboxDeviceUuid;\n }\n\n if (body) {\n requestOptions.body = JSON.stringify(body);\n }\n\n return requestOptions;\n}\n\nexport const socialApi = {\n ...getApi(SOCIAL_API),\n uploadImage,\n};\n\nexport const uraniaApi = getApi(URANIA_API);\n","import type { SubscribeToTopicParams } from '../types';\nimport { social, urania } from '../adapters';\n\ntype Props = SubscribeToTopicParams & {\n socialId?: number;\n};\n\nexport const subscribe = ({\n socialId,\n provider = 'mindbox',\n pointOfContact,\n topic,\n email,\n resourceKey,\n resourceType,\n}: Props) => {\n if (provider === 'urania') {\n return urania.subscriptions.subscribe({\n socialId,\n email,\n resourceKey,\n topic,\n pointOfContact,\n resourceType,\n });\n }\n\n return social.subscriptions.subscribeToTopic(email, [topic], pointOfContact);\n};\n","import type { LoginProviderName } from './providers';\nimport { socialApi } from '../../../../helpers/http-api';\n\nexport type SocialApiLoginUrlOptions = {\n provider: LoginProviderName;\n // Точка контакта нужна для определения откуда произошёл логин.\n // Используется в аналитике и рассылках.\n // В качестве точки контакта можно использовать любую человеко-\n // читаемую строку, лучше с префиксом проекта/компонента/страницы\n // Например: pro-courseSlug\n point_of_contact: string;\n // fallback_redirect_url используется для редиректа пользователя\n // см «Альтернативный поток для браузеров на основе WebView» в\n // auth-flows.md\n fallback_redirect_url?: string;\n // Необходимо для корректной склейки пользователей в mindbox.\n tj_device_id?: string;\n // Для склеивания карточек в майндбоксе юзеров, авторизовавшихся\n // для активации ранее купленного без авторизации курса Учебника\n promocode?: string;\n // Необходимо для google аналитики\n // google_client_id: string, TODO аналитика\n};\n\nconst WINDOW_CLOSING_TIMEOUT = 5 * 60 * 1000;\nconst WINDOW_CLOSING_POLLING_INTERVAL = 200;\n\nlet authWindow: Window | undefined;\n\n/**\n * Предварительно инициализируем, чтобы удовлетворить синхронности вызова для сафари.\n */\nexport function initAuthWindow() {\n authWindow = window.open('about:blank') || undefined;\n}\n\n/**\n * Закрываем при необходимости\n */\nexport function forceCloseAuthWindow() {\n if (authWindow && !authWindow.closed) {\n authWindow.close();\n }\n}\n\n/**\n * Открывает окно аутентификации, ждёт его закрытия,\n * посылает запрос на сервер для подтверждения того,\n * что пользователь аутентифицировался.\n * @returns Promise если пользователь аутентифицировался\n * Promise если пользователь не прошёл аутен-\n * фикацию или сервер ответил кодом отличным от 200\n */\nexport function doSocialAuthRequestInNewWindow(\n authUrl: string\n): Promise {\n createNewWindowWithSocialAuthRequest(authUrl);\n return waitForClosing(authWindow);\n}\n\nexport function createNewWindowWithSocialAuthRequest(authUrl: string): void {\n if (authWindow && !authWindow.closed) {\n authWindow.focus();\n authWindow.location.replace(authUrl);\n }\n}\n\n/**\n * Аутентификационное окно проходит цепочку редиректов,\n * после чего закрывается само если аутентификация прошла\n * успешно.\n *\n * Но аутентификация может провалиться из-за недостатка прав,\n * корявых настроек сервера или глючащего провайдера.\n * В таком случае пользователь просто закроет окно сам.\n * Вообще пользователь может закрыть окно сам просто так.\n *\n * Потому стоит использовать положительный ответ этого метода\n * как повод сходить на сервер и проверить прошла ли аутентификация.\n *\n * @returns Promise если окно закрыли\n * Promise если окно не закрыли\n * в течении WINDOW_CLOSING_TIMEOUT\n */\nexport async function waitForClosing(\n authWindow?: Window,\n closingTimeout = WINDOW_CLOSING_TIMEOUT\n): Promise {\n const deadlineTime = Date.now() + closingTimeout;\n while (Date.now() < deadlineTime) {\n if (!authWindow || authWindow.closed) {\n return true;\n }\n await wait(WINDOW_CLOSING_POLLING_INTERVAL);\n }\n return false;\n}\n\nexport async function wait(timer: number): Promise {\n return new Promise((resolve) => {\n setTimeout(() => {\n resolve(undefined);\n }, timer);\n });\n}\n\n/**\n * Функция разруливает этап ответа на запрос авторизации\n * через Social Networks.\n * @see SocialFetchData\n * @see createAuthFetch\n * @returns Promise for success case\n * @returns Promise for trouble case\n * @param authUrl\n * @param authBody\n */\nexport async function doSocialAuthFetch(\n authUrl: string,\n authBody: SocialApiLoginUrlOptions\n): Promise {\n return new Promise((resolve) => {\n socialApi\n .post(authUrl, authBody)\n .then((data) =>\n resolve((data as { redirect_url?: string })?.redirect_url)\n )\n .catch(() => resolve(undefined));\n });\n}\n","import type { Resource } from '../types';\n\nexport default function makeResource(\n initialValue: T\n): [Resource, (newValue: T) => void] {\n let value = initialValue;\n\n function get() {\n return value;\n }\n\n function wait() {\n return new Promise((resolve) => {\n const unsubscribe = subscribe((newValue) => {\n unsubscribe();\n resolve(newValue);\n });\n });\n }\n\n const subscribers = new Set<(newValue: T) => void>();\n\n function subscribe(cb: (newValue: T) => void) {\n subscribers.add(cb);\n return () => subscribers.delete(cb);\n }\n\n function set(newValue: T) {\n subscribers.forEach((cb) => cb(newValue));\n value = newValue;\n }\n\n return [{ get, wait, subscribe }, set];\n}\n","import type {\n ArticlesMeta,\n Profile,\n RecentSocialId,\n Subscriptions,\n ArticleStats,\n} from '../types';\nimport makeResource from './make';\n\n/* \n У всех ресурсов по умолчанию должно стоять undefined значение.\n Это нужно для того, чтобы мы могли понимать, завершился запрос к ресурсу или ещё нет.\n Если запрос завершился, но данных нет, ставим null.\n*/\nconst [profile, setProfile] = makeResource(undefined);\nconst [articlesMeta, setArticlesMeta] = makeResource(undefined);\nconst [subscriptions, setSubscriptions] =\n makeResource(undefined);\nconst [recentSocialId, setRecentSocialId] =\n makeResource(undefined);\nconst [articleStats, setArticleStats] = makeResource(undefined);\n\nexport {\n profile,\n setProfile,\n articlesMeta,\n setArticlesMeta,\n subscriptions,\n setSubscriptions,\n recentSocialId,\n setRecentSocialId,\n articleStats,\n setArticleStats,\n};\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n exports.createRoot = m.createRoot;\n exports.hydrateRoot = m.hydrateRoot;\n} else {\n var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n exports.createRoot = function(c, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.createRoot(c, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n exports.hydrateRoot = function(c, h, o) {\n i.usingClientEntryPoint = true;\n try {\n return m.hydrateRoot(c, h, o);\n } finally {\n i.usingClientEntryPoint = false;\n }\n };\n}\n","module.exports = LIBS.react;","module.exports = LIBS[\"react-dom\"];","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\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__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"\" + chunkId + \".css\";\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","var scriptUrl;\nif (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + \"\";\nvar document = __webpack_require__.g.document;\nif (!scriptUrl && document) {\n\tif (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')\n\t\tscriptUrl = document.currentScript.src;\n\tif (!scriptUrl) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tif(scripts.length) {\n\t\t\tvar i = scripts.length - 1;\n\t\t\twhile (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;\n\t\t}\n\t}\n}\n// When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration\n// or pass an empty string (\"\") and set the __webpack_public_path__ variable from your code to use your own logic.\nif (!scriptUrl) throw new Error(\"Automatic publicPath is not supported in this browser\");\nscriptUrl = scriptUrl.replace(/#.*$/, \"\").replace(/\\?.*$/, \"\").replace(/\\/[^\\/]+$/, \"/\");\n__webpack_require__.p = scriptUrl;","if (typeof document === \"undefined\") return;\nvar createStylesheet = (chunkId, fullhref, oldTag, resolve, reject) => {\n\tvar linkTag = document.createElement(\"link\");\n\n\tlinkTag.rel = \"stylesheet\";\n\tlinkTag.type = \"text/css\";\n\tif (__webpack_require__.nc) {\n\t\tlinkTag.nonce = __webpack_require__.nc;\n\t}\n\tvar onLinkComplete = (event) => {\n\t\t// avoid mem leaks.\n\t\tlinkTag.onerror = linkTag.onload = null;\n\t\tif (event.type === 'load') {\n\t\t\tresolve();\n\t\t} else {\n\t\t\tvar errorType = event && event.type;\n\t\t\tvar realHref = event && event.target && event.target.href || fullhref;\n\t\t\tvar err = new Error(\"Loading CSS chunk \" + chunkId + \" failed.\\n(\" + errorType + \": \" + realHref + \")\");\n\t\t\terr.name = \"ChunkLoadError\";\n\t\t\terr.code = \"CSS_CHUNK_LOAD_FAILED\";\n\t\t\terr.type = errorType;\n\t\t\terr.request = realHref;\n\t\t\tif (linkTag.parentNode) linkTag.parentNode.removeChild(linkTag)\n\t\t\treject(err);\n\t\t}\n\t}\n\tlinkTag.onerror = linkTag.onload = onLinkComplete;\n\tlinkTag.href = fullhref;\n\n\n\tif (oldTag) {\n\t\toldTag.parentNode.insertBefore(linkTag, oldTag.nextSibling);\n\t} else {\n\t\tdocument.head.appendChild(linkTag);\n\t}\n\treturn linkTag;\n};\nvar findStylesheet = (href, fullhref) => {\n\tvar existingLinkTags = document.getElementsByTagName(\"link\");\n\tfor(var i = 0; i < existingLinkTags.length; i++) {\n\t\tvar tag = existingLinkTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\") || tag.getAttribute(\"href\");\n\t\tif(tag.rel === \"stylesheet\" && (dataHref === href || dataHref === fullhref)) return tag;\n\t}\n\tvar existingStyleTags = document.getElementsByTagName(\"style\");\n\tfor(var i = 0; i < existingStyleTags.length; i++) {\n\t\tvar tag = existingStyleTags[i];\n\t\tvar dataHref = tag.getAttribute(\"data-href\");\n\t\tif(dataHref === href || dataHref === fullhref) return tag;\n\t}\n};\nvar loadStylesheet = (chunkId) => {\n\treturn new Promise((resolve, reject) => {\n\t\tvar href = __webpack_require__.miniCssF(chunkId);\n\t\tvar fullhref = __webpack_require__.p + href;\n\t\tif(findStylesheet(href, fullhref)) return resolve();\n\t\tcreateStylesheet(chunkId, fullhref, null, resolve, reject);\n\t});\n}\n// object to store loaded CSS chunks\nvar installedCssChunks = {\n\t57: 0\n};\n\n__webpack_require__.f.miniCss = (chunkId, promises) => {\n\tvar cssChunks = {\"391\":1,\"760\":1,\"860\":1};\n\tif(installedCssChunks[chunkId]) promises.push(installedCssChunks[chunkId]);\n\telse if(installedCssChunks[chunkId] !== 0 && cssChunks[chunkId]) {\n\t\tpromises.push(installedCssChunks[chunkId] = loadStylesheet(chunkId).then(() => {\n\t\t\tinstalledCssChunks[chunkId] = 0;\n\t\t}, (e) => {\n\t\t\tdelete installedCssChunks[chunkId];\n\t\t\tthrow e;\n\t\t}));\n\t}\n};\n\n// no hmr\n\n// no prefetching\n\n// no preloaded","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t57: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkshared_core\"] = self[\"webpackChunkshared_core\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","import type { LoginProviderName } from '../presentation/auth-popup/components/social-networks/providers';\n\nexport function buildLoginEvent(\n pointOfContact: string,\n provider: LoginProviderName\n) {\n return new CustomEvent('shared-core:login', {\n detail: { pointOfContact, provider },\n });\n}\n\nexport type LoginEvent = ReturnType;\n","import type {\n ActionStatus,\n Profile,\n RecentSocialId,\n RequestLoginParams,\n Resource,\n} from '../types';\nimport { social } from '../adapters';\nimport { present } from '../presentation';\nimport type { ModalState } from '../presentation/auth-popup/types/types';\nimport { buildLoginEvent } from '../events/login';\nimport type { LoginProviderName } from '../presentation/auth-popup/components/social-networks/providers';\nimport { waitForClosing } from '../presentation/auth-popup/components/social-networks/do-social-auth';\n\nconst recentSocialIdKeyName = 'tj-shared-core-recent-social-id';\n\nexport default class AuthController {\n static current: AuthController;\n private constructor(\n private resource: Resource,\n private updateResource: (newValue: Profile) => void,\n private updateRecentSocialId: (newValue: RecentSocialId) => void\n ) {\n this.init();\n }\n\n // Карусель авторизации в новой вкладке браузера после переезда на новый на домен\n private async checkPrevAuth() {\n const domains = ['t-j.ru', 'journal.tbank.ru'];\n const alreadyTriedToAuth = 'tj-shared-core-already-tried-auth';\n const socialApiUrlCheckPrevAuth =\n 'https://social.journal.tinkoff.ru/api/v26/account/login/session/';\n const windowClosingTimeout = 15 * 1000;\n\n // проверяем, находимся на новом домене или на старом,\n // если на старом, то выходим и идем по стандартному пути\n if (!domains.includes(window.location.hostname)) {\n return;\n }\n\n // проверяем, проходил ли уже пользователь по карусели авторизации\n // если проходил - пропускаем выходим из этого шага и отправляем дальше по стандартному пути\n const isChecked = localStorage.getItem(alreadyTriedToAuth);\n if (isChecked) {\n return;\n }\n\n // если не проходил: ставим ему значение в localStorage в true\n localStorage.setItem(alreadyTriedToAuth, 'true');\n\n try {\n // Открываем новую вкладку браузера\n const authWindow = window.open('about:blank', '_blank') || undefined;\n // Открываем адрес старой соцплатформы\n if (authWindow && !authWindow.closed) {\n authWindow.location.replace(socialApiUrlCheckPrevAuth);\n }\n\n // ждем пока вкладка не закроется или не истечет время ожидания\n await waitForClosing(authWindow, windowClosingTimeout);\n\n if (authWindow && !authWindow.closed) {\n authWindow.close();\n }\n await this.getProfile();\n } catch {}\n }\n\n async login(params: RequestLoginParams): Promise {\n if (!params?.pointOfContact) {\n throw new Error('Params pointOfContact is missing');\n }\n\n await this.checkPrevAuth();\n\n if (this.resource.get()) {\n // уже залогинены, возможно что-то обновляем\n return Promise.resolve('success');\n }\n\n // Динамически импортируем попап авторизации, чтобы грузить его только\n // в ситуациях когда он нужен\n const AuthPopup = (await import('../presentation/auth-popup/auth-popup'))\n .default;\n\n return new Promise((resolve) => {\n // дергаем слой presentation и показываем попап авторизации\n const unmount = present(AuthPopup, {\n onSuccess: async (provider) => {\n await this.getProfile();\n unmount();\n const e = buildLoginEvent(params.pointOfContact, provider);\n dispatchEvent(e);\n resolve('success');\n },\n onDismiss: async (provider: LoginProviderName, state?: ModalState) => {\n let status: ActionStatus = 'fail';\n // Если новый пользователь ввел проверочный код и дошел до заполнения имени и фото,\n // то при закрытии попапа, даже без ввода инфы, он является успешно залогиненным\n // Так же здесь добавлены кейсы, когда пользователь дошел до этапа мерджа аккаунтов и закрыл попап,\n // то он так же является успешно залогиненным\n const successStates = [\n 'personal',\n 'merge_accounts',\n 'code_merge_accounts',\n 'merge_accounts_success',\n ];\n\n if (state && successStates.includes(state)) {\n status = 'success';\n await this.getProfile();\n const e = buildLoginEvent(params.pointOfContact, provider);\n dispatchEvent(e);\n }\n if (status === 'fail' && params.onAuthCancel) {\n params.onAuthCancel();\n }\n unmount();\n resolve(status);\n },\n popup: {\n pointOfContact: params.pointOfContact,\n uiText: params.uiText,\n initialLoginValue: params.initialLoginValue,\n promocode: params.promocode,\n },\n });\n });\n }\n\n async logout() {\n return social.logout().then((status) => {\n this.updateResource(null);\n return status;\n });\n }\n\n async getProfile() {\n await social\n .profile()\n .then((p: any) => {\n if (p) {\n this.updateResource(p);\n\n const socialId = p.id;\n if (socialId) {\n localStorage.setItem(recentSocialIdKeyName, socialId);\n this.updateRecentSocialId(socialId);\n }\n }\n })\n .catch(() => this.updateResource(null));\n }\n\n private init() {\n // Получить закэшированные данные\n this.getProfile();\n\n const socialId = localStorage.getItem(recentSocialIdKeyName);\n if (socialId) {\n this.updateRecentSocialId(parseInt(socialId, 10));\n }\n }\n\n static initialize(\n resource: Resource,\n updateResource: (newValue: Profile) => void,\n updateRecentSocialId: (newValue: RecentSocialId) => void\n ) {\n if (AuthController.current) {\n throw new Error('Already initialized');\n }\n AuthController.current = new AuthController(\n resource,\n updateResource,\n updateRecentSocialId\n );\n }\n}\n","import React from 'react';\nimport ReactDOMClient from 'react-dom/client';\n\nexport function present

(\n Component: React.ComponentType

,\n props: P\n) {\n const holder = createHolder();\n const root = ReactDOMClient.createRoot(holder);\n\n root.render();\n\n return function () {\n root.unmount();\n holder.remove();\n };\n}\n\nfunction createHolder() {\n const holder = document.createElement('div');\n holder.classList.add('tj-light-theme');\n document.body.appendChild(holder);\n return holder;\n}\n","import type { ArticlesMeta, Resource } from '../types';\nimport { social } from '../adapters';\nimport { fetchAll } from '../helpers/fetch-all';\n\nconst EMPTY_META = {\n favorites: [],\n favoritesCount: 0,\n votes: [],\n downVotes: [],\n};\nconst REQUEST_LIMIT = 100;\n\nexport default class ArticlesMetaController {\n private metaPromise: Promise | null = null;\n\n static current: ArticlesMetaController;\n private constructor(\n private resource: Resource,\n private updateResource: (newValue: ArticlesMeta) => void\n ) {}\n\n /**\n *\n * @param options.isFullFavorite - запросить все закладки без лимитов <= 100\n * @private\n */\n async getMeta(options?: { isFullFavorite?: boolean }) {\n // Сохраняем промис отдельно и дожидаемся его выполнения,\n // чтобы нельзя было одновременно несколько раз запросить и обновить ресурс\n if (!this.metaPromise) {\n this.metaPromise = this.getMetaPromise(options);\n }\n await this.metaPromise;\n this.metaPromise = null;\n }\n\n async clearMeta() {\n this.updateResource(null);\n }\n\n /**\n * Выполняем операции \"оптимистично\" - сразу предполагаем что операция\n * будет выполнена успешно, в противном случае откатываем операцию.\n * Актуально для addFavorite, addVote, removeFavorite и removeVote.\n */\n async addFavorite(uuid: string) {\n if (this.metaPromise) {\n await this.metaPromise;\n }\n this.updateFavorite(uuid, 'add');\n try {\n await social.meta.add.favorite(uuid);\n } catch {\n this.updateFavorite(uuid, 'remove');\n return 'fail';\n }\n return 'success';\n }\n\n async addVote(uuid: string) {\n if (this.metaPromise) {\n await this.metaPromise;\n }\n this.moveVote(uuid, { from: 'downVotes', to: 'votes' });\n try {\n await social.meta.add.vote(uuid);\n } catch {\n this.moveVote(uuid, { from: 'votes', to: 'downVotes' });\n return 'fail';\n }\n return 'success';\n }\n\n async removeFavorite(uuid: string) {\n this.updateFavorite(uuid, 'remove');\n try {\n await social.meta.remove.favorite(uuid);\n } catch {\n this.updateFavorite(uuid, 'add');\n return 'fail';\n }\n return 'success';\n }\n\n async removeVote(uuid: string) {\n this.moveVote(uuid, { from: 'votes', to: 'downVotes' });\n try {\n await social.meta.remove.vote(uuid);\n } catch {\n this.moveVote(uuid, { from: 'downVotes', to: 'votes' });\n return 'fail';\n }\n return 'success';\n }\n\n private updateFavorite(uuid: string, action: 'add' | 'remove') {\n const oldValue = this.resource.get() ?? EMPTY_META;\n\n let newFavorites: string[] = [];\n let { favoritesCount } = oldValue;\n if (action === 'add') {\n newFavorites = [...oldValue.favorites, uuid];\n favoritesCount += 1;\n } else {\n newFavorites = oldValue.favorites.filter((favorite) => favorite !== uuid);\n favoritesCount -= 1;\n }\n\n const newValue = { ...oldValue, favorites: newFavorites, favoritesCount };\n this.updateResource(newValue);\n }\n\n /**\n * В соцплатформе у каждой статьи есть свой рейтинг оценки от пользователя user_score: -1, 0, 1.\n * И методы addVote и removeVote повышают или понижают этот рейтинг на 1.\n */\n private moveVote(\n uuid: string,\n direction: { from: 'votes' | 'downVotes'; to: 'votes' | 'downVotes' }\n ) {\n const oldValue = this.resource.get() ?? EMPTY_META;\n\n let from = oldValue[direction.from];\n let to = oldValue[direction.to];\n\n if (from.includes(uuid)) {\n // Если оценка есть в исходном массиве, то удаляем оттуда и рейтинг становится нейтральным\n from = from.filter((u: string) => u !== uuid);\n } else if (!to.includes(uuid)) {\n // Если рейтинг был нейтральным, то добавляем оценку\n to = [...to, uuid];\n }\n\n this.updateResource({\n ...oldValue,\n [direction.from]: from,\n [direction.to]: to,\n });\n }\n\n /**\n * @param options.isFullFavorite - запросить все закладки без лимитов <= 100\n * @private\n */\n private async getMetaPromise(options?: { isFullFavorite?: boolean }) {\n const [favorites, votes] = await Promise.all([\n this.getFavorites(options?.isFullFavorite),\n social.meta.get.votes(),\n ]);\n\n const uuidFavorites = favorites.data.map(\n (favorite) => favorite.article_uuid\n );\n const uuidVotes = votes\n .filter((v) => v.user_vote > 0)\n .map((f) => f.article_uuid);\n const uuidDownVotes = votes\n .filter((v) => v.user_vote < 0)\n .map((f) => f.article_uuid);\n\n this.updateResource({\n favorites: uuidFavorites,\n favoritesCount: favorites.count,\n votes: uuidVotes,\n downVotes: uuidDownVotes,\n });\n }\n\n /**\n *\n * @param allFavorites - запросить все закладки пользователя, по умолчанию возвращается <= 100\n * @private\n */\n private async getFavorites(allFavorites?: boolean) {\n if (!allFavorites) {\n return social.meta.get.favorites({ limit: REQUEST_LIMIT });\n }\n\n return fetchAll(social.meta.get.favorites, REQUEST_LIMIT);\n }\n\n static initialize(\n resource: Resource,\n updateResource: (newValue: ArticlesMeta) => void\n ) {\n if (ArticlesMetaController.current) {\n throw new Error('Already initialized');\n }\n ArticlesMetaController.current = new ArticlesMetaController(\n resource,\n updateResource\n );\n }\n}\n","type RequestFn = (params: {\n limit: number;\n offset?: number;\n}) => Promise<{ data: T[]; count: number }>;\n\nexport async function fetchAll(requestFn: RequestFn, limit: number) {\n let response = await requestFn({ limit });\n let result = [...response.data];\n const totalCount = response.count;\n\n for (\n let currentOffset = limit;\n currentOffset < totalCount;\n currentOffset += limit\n ) {\n response = await requestFn({ limit, offset: currentOffset });\n result = result.concat(response.data);\n }\n\n return {\n count: totalCount,\n data: result,\n };\n}\n","import { social } from '../adapters';\nimport { profile } from '../resources';\nimport type { Resource, SubscribeToTopicParams, Subscriptions } from '../types';\nimport { subscribe } from '../helpers/subscribe';\n\nexport default class SubscriptionsController {\n static current: SubscriptionsController;\n private constructor(\n private resource: Resource,\n private updateResource: (newValue: Subscriptions) => void\n ) {}\n\n async getSubscriptions() {\n const subscriptions = await social.subscriptions.get();\n\n this.updateResource({\n flows: subscriptions.flows,\n topics: subscriptions.email,\n isEmailSaved: subscriptions.email_is_saved,\n });\n }\n\n async subscribeToTopic({\n email,\n topic,\n pointOfContact,\n provider = 'mindbox',\n resourceKey,\n resourceType,\n }: SubscribeToTopicParams) {\n if (!email || !topic || !pointOfContact) {\n console.error('Email, topic and pointOfContact params are required');\n return;\n }\n\n const socialId = profile.get()?.id;\n\n return subscribe({\n email,\n topic,\n pointOfContact,\n provider,\n socialId,\n resourceKey,\n resourceType,\n });\n }\n\n static initialize(\n resource: Resource,\n updateResource: (newValue: Subscriptions) => void\n ) {\n if (SubscriptionsController.current) {\n throw new Error('Already initialized');\n }\n SubscriptionsController.current = new SubscriptionsController(\n resource,\n updateResource\n );\n }\n}\n","import { mercury } from '../adapters';\nimport type { ArticleStats, Resource } from '../types';\n\nexport default class ArticleStatsController {\n private statsPromise: Promise | null = null;\n\n static current: ArticleStatsController;\n private constructor(\n private resource: Resource,\n private updateResource: (newValue: ArticleStats) => void\n ) {\n this.init();\n }\n\n async getStats(articleId: string) {\n if (!this.statsPromise) {\n this.statsPromise = this.getStatsPromise(articleId);\n }\n await this.statsPromise;\n this.statsPromise = null;\n }\n\n private async getStatsPromise(articleId: string) {\n const { favorites, likes, views, comments } =\n await mercury.stats.get(articleId);\n this.updateResource({\n favoritesCount: favorites,\n commentsCount: comments,\n likes,\n views,\n // TODO: Дизлайки для статей не используются, нужно удалить, после того, как убедимся, что ничего не ломается\n dislikes: 0,\n } as ArticleStats);\n }\n\n private init() {\n if (window.TJ_ARTICLE_META?.articleId) {\n this.getStats(window.TJ_ARTICLE_META.articleId);\n }\n }\n\n static initialize(\n resource: Resource,\n updateResource: (newValue: ArticleStats) => void\n ) {\n if (ArticleStatsController.current) {\n throw new Error('Already initialized');\n }\n\n ArticleStatsController.current = new ArticleStatsController(\n resource,\n updateResource\n );\n }\n}\n","import { requestLogin, requestLogout, requestProfileRefresh } from './auth';\nimport {\n requestAddArticleFavorite,\n requestAddArticleVote,\n requestArticlesMeta,\n requestClearMeta,\n requestRemoveArticleFavorite,\n requestRemoveArticleVote,\n} from './meta';\nimport {\n requestSubscriptions,\n requestTopicSubscription,\n} from './subscriptions';\nimport { requestArticleStats } from './stats';\n\nexport default {\n requestLogin,\n requestLogout,\n requestArticlesMeta,\n requestAddArticleFavorite,\n requestAddArticleVote,\n requestRemoveArticleFavorite,\n requestRemoveArticleVote,\n requestClearMeta,\n requestSubscriptions,\n requestTopicSubscription,\n requestProfileRefresh,\n requestArticleStats,\n};\n","import type { ActionStatus, RequestLoginParams } from '../types';\nimport AuthController from '../controllers/auth';\n\nexport async function requestLogin(\n params: RequestLoginParams\n): Promise {\n return AuthController.current.login(params);\n}\n\nexport async function requestLogout(): Promise {\n return AuthController.current.logout();\n}\n\nexport async function requestProfileRefresh() {\n return AuthController.current.getProfile();\n}\n","import MetaController from '../controllers/meta';\n\n/**\n *\n * @param options.isFullFavorite - запросить все закладки без лимитов <= 100\n * @private\n */\nexport async function requestArticlesMeta(options?: {\n isFullFavorite?: boolean;\n}) {\n return MetaController.current.getMeta(options);\n}\n\nexport async function requestAddArticleFavorite(uuid: string) {\n return MetaController.current.addFavorite(uuid);\n}\n\nexport async function requestAddArticleVote(uuid: string) {\n return MetaController.current.addVote(uuid);\n}\n\nexport async function requestRemoveArticleFavorite(uuid: string) {\n return MetaController.current.removeFavorite(uuid);\n}\n\nexport async function requestRemoveArticleVote(uuid: string) {\n return MetaController.current.removeVote(uuid);\n}\n\nexport async function requestClearMeta() {\n return MetaController.current.clearMeta();\n}\n","import SubscriptionsController from '../controllers/subscriptions';\nimport type { SubscribeToTopicParams } from '../types';\n\nexport async function requestSubscriptions() {\n return SubscriptionsController.current.getSubscriptions();\n}\n\nexport async function requestTopicSubscription(params: SubscribeToTopicParams) {\n return SubscriptionsController.current.subscribeToTopic(params);\n}\n","import ArticleStatsController from '../controllers/stats';\n\nexport async function requestArticleStats(articleId: string) {\n return ArticleStatsController.current.getStats(articleId);\n}\n","import { scrollToElement } from './dom/scroll-to-element';\nimport { toggleElementVisibility } from './dom/toggle-element-visibility';\nimport { renderSubscriptionForm } from './dom/render-subscription-form';\n\nexport default {\n scrollToElement,\n toggleElementVisibility,\n renderSubscriptionForm,\n};\n","import type { ScrollParams } from '../../types';\n\nexport const getElementTop = (element: HTMLElement): number =>\n element.getBoundingClientRect().top -\n document.documentElement.getBoundingClientRect().top;\n\n/**\n * Прокручивает страницу до некоторого элемента на странице\n * @param element - элемент страницы или айдишник этого элемента\n * @param elementTargetPosition - в какой части окна просмотра должен оказаться элемент\n * @param duration - длительность анимации\n * @param offset - добавить отклонение от целевой позиции прокрутки\n */\nexport const scrollToElement = (\n element: HTMLElement | string,\n { elementTargetPosition = 'start', duration = 600, offset = 0 }: ScrollParams\n): void => {\n const currentElement =\n typeof element === 'string'\n ? document.querySelector(`#${element}`)\n : element;\n\n if (!currentElement) {\n return;\n }\n\n const startY =\n window.scrollY || window.pageYOffset || document.documentElement.scrollTop;\n\n let diffY = getElementTop(currentElement) - startY + offset;\n if (elementTargetPosition === 'center') {\n diffY -= window.innerHeight / 2 - currentElement.clientHeight / 2;\n } else if (elementTargetPosition === 'end') {\n diffY -= window.innerHeight - currentElement.clientHeight;\n }\n\n let startTime: number;\n const step = (timestamp: number) => {\n if (!startTime) {\n startTime = timestamp;\n }\n const elapsedTime = timestamp - startTime;\n const timeRatio = Math.min(elapsedTime / duration, 1);\n\n let t = timeRatio * 2;\n\n if (t < 1) {\n window.scrollTo(0, startY + (diffY / 2) * t ** 2);\n } else {\n t -= 2;\n window.scrollTo(0, startY - (diffY / 2) * (t ** 4 - 2));\n }\n\n if (elapsedTime < duration) {\n window.requestAnimationFrame(step);\n }\n };\n\n window.requestAnimationFrame(step);\n};\n","import type { ToggleElementVisibilityParams } from '../../types';\n\n// Возвращает true, если скрытие элемента произошло успешно\nexport const toggleElementVisibility = ({\n element,\n isHidden,\n}: ToggleElementVisibilityParams): boolean => {\n const currentElement =\n typeof element === 'string'\n ? document.querySelector(`#${element}`)\n : element;\n\n const hiddenStyle = isHidden ? 'hidden' : '';\n\n if (currentElement) {\n // Скрываем элемент именно таким способом, потому что есть кейсы,\n // в которых необходима возможность вычислять высоту скрытого элемента\n currentElement.style.visibility = hiddenStyle;\n currentElement.style.height = isHidden ? '0' : '';\n currentElement.style.overflow = hiddenStyle;\n }\n\n return currentElement?.style.visibility === hiddenStyle;\n};\n","import { createElement } from 'react';\nimport ReactDOMClient from 'react-dom/client';\nimport type { SubscriptionFormProps } from '../../types';\n\nexport function renderSubscriptionForm(\n element: HTMLElement,\n props: SubscriptionFormProps\n) {\n const root = ReactDOMClient.createRoot(element);\n\n // До того как форма отрендерилась первый раз, rerender просто подменяет пропсы на новые\n let rerender = (newProps: SubscriptionFormProps) => {\n // eslint-disable-next-line no-param-reassign\n props = newProps;\n };\n\n // Динамически импортируем форму подписки, чтобы не тянуть ее если она не нужна\n // Используем промисы вместо async/await, чтобы api оставался синхронным, т.к. на это\n // уже заточен внешний код\n import('../../presentation/subscription-form/subscription-form').then(\n ({ default: SubscriptionForm }) => {\n root.render(createElement(SubscriptionForm, props));\n\n // После первого рендера ререндер реально вызывает root.render с переданными пропсами\n rerender = (newProps: SubscriptionFormProps) => {\n root.render(createElement(SubscriptionForm, newProps));\n };\n }\n );\n\n // Должна быть возможность снаружи менять пропсы формы, для этого отдаем наружу\n // функцию для вызова ререндера\n return (newProps: SubscriptionFormProps) => rerender(newProps);\n}\n","import type { Core, SharedCoreHolder } from '../types';\n\nexport function isCoreInitialized(\n wnd: SharedCoreHolder | null = getDefaultHolder() as SharedCoreHolder\n) {\n return Boolean(wnd?.tjlib?.core);\n}\n\nexport function setCore(\n core: Core,\n wnd: SharedCoreHolder | null = getDefaultHolder() as SharedCoreHolder\n) {\n if (!wnd) {\n throw new Error('unable to initialize shared core without holder');\n }\n if (isCoreInitialized(wnd)) {\n throw new Error('tjlib.core is already initialized');\n }\n wnd.tjlib = wnd.tjlib || {};\n wnd.tjlib.core = core;\n}\n\nexport function getCore(\n wnd: SharedCoreHolder | null = getDefaultHolder() as SharedCoreHolder\n) {\n return wnd?.tjlib?.core;\n}\n\nfunction getDefaultHolder() {\n return typeof window !== 'undefined' ? window : null;\n}\n","import React from 'react';\nimport ReactDOMClient from 'react-dom/client';\nimport type { Core } from './types';\nimport actions from './actions';\nimport dom from './helpers/dom';\nimport {\n profile,\n setProfile,\n articlesMeta,\n setArticlesMeta,\n subscriptions,\n setSubscriptions,\n recentSocialId,\n setRecentSocialId,\n articleStats,\n setArticleStats,\n} from './resources';\nimport AuthController from './controllers/auth';\nimport ArticlesMetaController from './controllers/meta';\n\nimport { getCore, isCoreInitialized, setCore } from './helpers/window';\nimport SubscriptionsController from './controllers/subscriptions';\nimport ArticleStatsController from './controllers/stats';\n\nexport default function init(): Core | undefined {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n if (typeof React === 'undefined' || typeof ReactDOMClient === 'undefined') {\n throw new Error(\n 'facade did not provide LIBS[react, react-dom] required for shared core'\n );\n }\n\n if (isCoreInitialized()) {\n return getCore();\n }\n\n AuthController.initialize(profile, setProfile, setRecentSocialId);\n ArticlesMetaController.initialize(articlesMeta, setArticlesMeta);\n SubscriptionsController.initialize(subscriptions, setSubscriptions);\n ArticleStatsController.initialize(articleStats, setArticleStats);\n\n const core: Core = {\n actions,\n dom,\n profile,\n articlesMeta,\n articleStats,\n subscriptions,\n recentSocialId,\n };\n\n setCore(core);\n\n return core;\n}\n","import init from './init';\n\ninit();\n"],"names":["inProgress","dataWebpackPrefix","subscriptions","subscribe","_ref","socialId","resourceKey","email","pointOfContact","topic","resourceType","uraniaApi","post","undefined","resource_key","point_of_contact","social_id","resource_type","stats","get","articleId","fetch","MERCURY_API","then","handleResponse","social","socialAdapter","urania","uraniaAdapter","mercury","mercuryAdapter","phoneCompress","phone","replace","login","async","loginParams","socialApi","promocode","socialNetwork","provider","initAuthWindow","loginUrlParams","mindboxDeviceUuid","getMindboxDeviceUuid","tj_device_id","authRedirect","doSocialAuthFetch","doSocialAuthRequestInNewWindow","forceCloseAuthWindow","Promise","reject","ssoRequestAuthUrl","authUrl","url","params","authParams","key","value","Object","entries","push","length","encodeURIComponent","join","concatAuthParamsToQuery","theme","resolve","ssoAuth","query","validateCode","code","SOCIAL_API","getRequestOptions","r","status","personalData","name","image","imgUrl","img","uploadImage","links","original","put","logout","result","profile","publicProfileById","id","flags","merge","mergeAccountId","account_to_merge","subscribeToTopic","topics","meta","favorites","uri","mappedParams","toString","URLSearchParams","votes","add","favorite","article_uuid","vote","method","remove","delete","getCookie","parts","document","cookie","split","pop","shift","MINDBOX_DEVICE_UUID_KEY","deviceUuidFromCookie","deviceUuidFromLocalStorage","localStorage","getItem","deviceUuid","setItem","SOCIAL_API_URL","URANIA_API_URL","MERCURY_API_URL","window","CONSTANTS","URANIA_API","getApi","api","_delete","fullResponse","body","response","json","data","ok","error","statusText","catch","err","String","requestOptions","credentials","referrerPolicy","headers","csrf","JSON","stringify","formData","FormData","set","option","WINDOW_CLOSING_TIMEOUT","WINDOW_CLOSING_POLLING_INTERVAL","authWindow","open","closed","close","focus","location","createNewWindowWithSocialAuthRequest","waitForClosing","closingTimeout","deadlineTime","Date","now","wait","timer","setTimeout","authBody","redirect_url","makeResource","initialValue","subscribers","Set","cb","unsubscribe","newValue","forEach","setProfile","articlesMeta","setArticlesMeta","setSubscriptions","recentSocialId","setRecentSocialId","articleStats","setArticleStats","m","exports","createRoot","hydrateRoot","module","LIBS","react","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","f","e","chunkId","all","keys","reduce","promises","u","miniCssF","g","globalThis","this","Function","obj","prop","prototype","hasOwnProperty","call","l","done","script","needAttach","scripts","getElementsByTagName","i","s","getAttribute","createElement","charset","timeout","nc","setAttribute","src","onScriptComplete","prev","event","onerror","onload","clearTimeout","doneFns","parentNode","removeChild","fn","bind","type","target","head","appendChild","Symbol","toStringTag","scriptUrl","importScripts","currentScript","tagName","toUpperCase","test","Error","p","installedCssChunks","miniCss","href","fullhref","existingLinkTags","dataHref","tag","rel","existingStyleTags","findStylesheet","oldTag","linkTag","nonce","errorType","realHref","request","createStylesheet","loadStylesheet","installedChunks","j","installedChunkData","promise","realSrc","message","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self","buildLoginEvent","CustomEvent","detail","recentSocialIdKeyName","AuthController","constructor","resource","updateResource","updateRecentSocialId","init","checkPrevAuth","alreadyTriedToAuth","includes","hostname","getProfile","AuthPopup","default","unmount","Component","props","holder","classList","createHolder","root","ReactDOMClient","render","React","present","onSuccess","dispatchEvent","onDismiss","state","onAuthCancel","popup","uiText","initialLoginValue","parseInt","initialize","current","EMPTY_META","favoritesCount","downVotes","ArticlesMetaController","metaPromise","getMeta","options","getMetaPromise","clearMeta","addFavorite","uuid","updateFavorite","addVote","moveVote","from","to","removeFavorite","removeVote","action","oldValue","newFavorites","filter","direction","getFavorites","isFullFavorite","uuidFavorites","map","uuidVotes","v","user_vote","uuidDownVotes","count","allFavorites","requestFn","limit","totalCount","currentOffset","offset","concat","fetchAll","SubscriptionsController","getSubscriptions","flows","isEmailSaved","email_is_saved","console","ArticleStatsController","statsPromise","getStats","getStatsPromise","likes","views","comments","commentsCount","dislikes","TJ_ARTICLE_META","requestLogin","requestLogout","requestArticlesMeta","MetaController","requestAddArticleFavorite","requestAddArticleVote","requestRemoveArticleFavorite","requestRemoveArticleVote","requestClearMeta","requestSubscriptions","requestTopicSubscription","requestProfileRefresh","requestArticleStats","scrollToElement","element","elementTargetPosition","duration","currentElement","querySelector","startY","scrollY","pageYOffset","documentElement","scrollTop","startTime","diffY","getBoundingClientRect","top","getElementTop","innerHeight","clientHeight","step","timestamp","elapsedTime","t","Math","min","scrollTo","requestAnimationFrame","toggleElementVisibility","isHidden","hiddenStyle","style","visibility","height","overflow","renderSubscriptionForm","rerender","newProps","SubscriptionForm","isCoreInitialized","wnd","getDefaultHolder","Boolean","tjlib","core","setCore","actions","dom"],"sourceRoot":""}