{"version":3,"sources":["serviceWorker.ts","i18n.ts","index.tsx","enums.ts","consts.ts"],"names":["Boolean","window","location","hostname","match","translationConfig","appendNamespaceToMissingKey","backend","loadPath","contextSeparator","debug","defaultNS","detection","lookupCookie","COOKIE_LANGUAGE_KEY","fallbackLng","APP_DEFAULT_LANGUAGE","interpolation","escapeValue","format","value","toUpperCase","moment","DATE_FORMAT","keySeparator","load","ns","nsSeparator","pluralSeparator","whitelist","ELanguage","EN","RU","init","i18n","use","XHR","LanguageDetector","initReactI18next","accessToken","localStorage","getItem","TOKEN_NAME","then","registerApplication","EApp","LOGIN","MAIN","start","navigator","serviceWorker","ready","registration","unregister","ECheckErrorLevel","EProcessStatus","ECurrencyCode","EGender","EUserPermission","defaultCacheConfig","frequentlyChanged","maxAge","infrequentlyChanged","prefix","commonRestConfig","baseURL","timeout","DEFAULT_PATH","LOADING_PAGE_PATH","TOKEN_REFRESH_PATH","ERROR_CLASS_NAME"],"mappings":"oKAYoBA,QACa,cAA7BC,OAAOC,SAASC,UAEiB,UAA7BF,OAAOC,SAASC,UAEhBF,OAAOC,SAASC,SAASC,MAAM,2D,mECJjCC,EAAiC,CACnCC,6BAA6B,EAC7BC,QAAS,CACLC,SAAU,4BAEdC,iBAAkB,IAClBC,OAAO,EACPC,UAAW,SACXC,UAAW,CACPC,aAAcC,KAElBC,YAAaC,IACbC,cAAe,CACXC,aAAa,EACbC,OAFW,SAEJC,EAAYD,GACf,MAAe,cAAXA,EACOC,EAAMC,cAEF,YAAXF,EACOG,IAAOF,GAAOD,OAAOI,KAEzBH,IAGfI,aAAc,IACdC,KAAM,MACNC,GAAI,CAAC,SAAU,QAAS,OAAQ,UAChCC,YAAa,IACbC,gBAAiB,IACjBC,UAAW,CAACC,IAAUC,GAAID,IAAUE,KAYzB,GAAEC,KANJC,IACRC,IAAIC,KACJD,IAAIE,KACJF,IAAIG,KACJL,KAAK5B,IC7CJkC,EAAsBC,aAAaC,QAAQC,MAAe,GAEhER,EAAKD,KAAKU,MAAK,WAIXC,YACIC,IAAKC,OACL,kBAAM,+DACN,kBAAOP,KAKXK,YACIC,IAAKE,MACL,kBAAM,6EACN,kBAAM/C,QAAQuC,MAGlBS,iBFiGI,kBAAmBC,WACnBA,UAAUC,cAAcC,MAAMR,MAAK,SAAAS,GAC/BA,EAAaC,iB,+BG7HlB,IAAKR,EAQAS,EAWAC,EAoBAC,EASA1B,EAQA2B,EAMAC,EA/DZ,wI,SACYb,K,YAAAA,E,eAAAA,M,cAQAS,K,cAAAA,E,mBAAAA,M,cAWAC,K,oBAAAA,E,cAAAA,E,YAAAA,E,kBAAAA,E,mBAAAA,M,cAoBAC,K,UAAAA,E,UAAAA,E,WAAAA,M,cASA1B,K,QAAAA,E,SAAAA,M,cAQA2B,K,YAAAA,E,iBAAAA,M,cAMAC,K,cAAAA,E,cAAAA,E,sCAAAA,E,6BAAAA,M,qCC7DZ,+VAKa5C,EAAsB,OAKtBE,EAAuBc,IAAUE,GAKjC2B,EAAqB,CAC9BC,kBAAmB,CACfC,OAAQ,KAEZC,oBAAqB,CACjBD,OAAQ,MAEZE,OAAQ,MAMCC,EAAuC,CAChDC,QAAS,OACTC,QAAS,KAIAC,EAAe,IAGfC,EAAoB,gBAGpBC,EAAqB,gBAGrBC,EAAmB,mBAGnB5B,EAAa,cAMbnB,EAAc,e","file":"static/js/main.1d2815d5.chunk.js","sourcesContent":["// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(/^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/),\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nfunction registerValidSW(swUrl: string, config?: Config): void {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n // eslint-disable-next-line no-param-reassign\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all tabs for this page are closed. See https://bit.ly/CRA-PWA.',\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config): void {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (response.status === 404 || (contentType != null && contentType.indexOf('javascript') === -1)) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log('No internet connection found. App is running in offline mode.');\n });\n}\n\nexport function register(config?: Config): void {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL((process as { env: { [key: string]: string } }).env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log('This web app is being served cache-first by a service worker. To learn more, visit https://bit.ly/CRA-PWA');\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nexport function unregister(): void {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import i18n, { InitOptions } from 'i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport XHR from 'i18next-xhr-backend';\nimport moment from 'moment';\nimport { initReactI18next } from 'react-i18next';\n\nimport { APP_DEFAULT_LANGUAGE, COOKIE_LANGUAGE_KEY, DATE_FORMAT } from 'consts';\n\nimport { ELanguage } from './enums';\n\n/**\n * Translation (i18next) configuration.\n */\nconst translationConfig: InitOptions = {\n appendNamespaceToMissingKey: true,\n backend: {\n loadPath: '/nls/{{lng}}/{{ns}}.json',\n },\n contextSeparator: '#',\n debug: false,\n defaultNS: 'Common',\n detection: {\n lookupCookie: COOKIE_LANGUAGE_KEY,\n },\n fallbackLng: APP_DEFAULT_LANGUAGE,\n interpolation: {\n escapeValue: false,\n format(value: any, format?: string): string {\n if (format === 'uppercase') {\n return value.toUpperCase();\n }\n if (format === 'fromIso') {\n return moment(value).format(DATE_FORMAT);\n }\n return value;\n },\n },\n keySeparator: '.',\n load: 'all',\n ns: ['Common', 'Login', 'Poll', 'Portal'],\n nsSeparator: ':',\n pluralSeparator: '-',\n whitelist: [ELanguage.EN, ELanguage.RU],\n};\n\n/**\n * Initialize i18next.\n */\nconst init = i18n\n .use(XHR)\n .use(LanguageDetector)\n .use(initReactI18next)\n .init(translationConfig);\n\nexport default { init };\n","import { registerApplication, start } from 'single-spa';\n\nimport * as serviceWorker from './serviceWorker';\nimport { TOKEN_NAME } from './consts';\nimport { EApp } from './enums';\nimport i18n from './i18n';\n\nconst accessToken: string = localStorage.getItem(TOKEN_NAME) || '';\n\ni18n.init.then(() => {\n /**\n * Register Login app.\n */\n registerApplication(\n EApp.LOGIN,\n () => import('apps/login'),\n () => !accessToken,\n );\n /**\n * Register Admin app.\n */\n registerApplication(\n EApp.MAIN,\n () => import('apps/main'),\n () => Boolean(accessToken),\n );\n\n start();\n});\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","/** Apps. */\nexport enum EApp {\n MAIN = 'main',\n LOGIN = 'login',\n}\n\n/**\n * Error levels.\n */\nexport enum ECheckErrorLevel {\n /** Error. */\n ERROR = 'ERROR',\n\n /** Warning. */\n WARNING = 'WARNING',\n}\n\n/**\n * API processing statuses.\n */\nexport enum EProcessStatus {\n /** Request canceled. */\n CANCELED = 'CANCELED',\n\n /** Request fall via errors. */\n ERROR = 'ERROR',\n\n /** Initial state. */\n IDLE = 'IDLE',\n\n /** Request pending. */\n PENDING = 'PENDING',\n\n /** Request resolved successfully. */\n SUCCESS = 'SUCCESS',\n}\n\n/**\n * Currencies.\n */\nexport enum ECurrencyCode {\n USD = 'USD',\n EUR = 'EUR',\n RUB = 'RUB',\n}\n\n/**\n * Languages.\n */\nexport enum ELanguage {\n EN = 'en',\n RU = 'ru',\n}\n\n/**\n * Gender.\n */\nexport enum EGender {\n MALE = 'MALE',\n FEMALE = 'FEMALE',\n}\n\n/** User permission. */\nexport enum EUserPermission {\n // TODO: `ADMIN` и `PILOT` оставили до лучших времён, когда мы реализуем хорошие гранулярные пермишены, отдельные под каждое действие.\n // До тех пор эти два \"пермишена\" будут закрывать разные участки функционала.\n ADMIN = 'ADMIN',\n PILOT = 'PILOT',\n GROUND_INSTRUCTOR = 'GROUND_INSTRUCTOR',\n\n /** Регистрация на рейс. Доступна при аутентификации по пропуску */\n REGISTRATION = 'REGISTRATION',\n}\n","import { AxiosRequestConfig } from 'axios';\n\nimport { ELanguage } from './enums';\n\n/**\n * Language cookie key.\n */\nexport const COOKIE_LANGUAGE_KEY = 'lang';\n\n/**\n * Default language.\n */\nexport const APP_DEFAULT_LANGUAGE = ELanguage.RU;\n\n/**\n * Common REST configuration.\n */\nexport const defaultCacheConfig = {\n frequentlyChanged: {\n maxAge: 60 * 1000, // 1 min\n },\n infrequentlyChanged: {\n maxAge: 60 * 60 * 1000, // 1 hour\n },\n prefix: 'kb',\n};\n\n/**\n * Common REST configuration.\n */\nexport const commonRestConfig: AxiosRequestConfig = {\n baseURL: '/api',\n timeout: 60000,\n};\n\n/** Default application path. */\nexport const DEFAULT_PATH = '/';\n\n/** Full screen loading page location. */\nexport const LOADING_PAGE_PATH = '/loading.html';\n\n/** Token refresh path. */\nexport const TOKEN_REFRESH_PATH = '/auth/refresh';\n\n/** Error class name. */\nexport const ERROR_CLASS_NAME = 'elementWithError';\n\n/** Session token name. */\nexport const TOKEN_NAME = 'accessToken';\n\n/** User inactivity timeout. */\nexport const INACTIVITY_TIMEOUT_MS = 300000;\n\n/** Default date format. */\nexport const DATE_FORMAT = 'DD.MM.YYYY';\n\n/** Time format without seconds. */\nexport const TIME_FORMAT_HH_MM = 'hh:mm';\n\n/** Polling interval. */\nexport const POLLING_INTERVAL = 5000;\n\n/** Modal root id. Should be same as in index.html. */\nexport const MODAL_ROOT = 'modal';\n"],"sourceRoot":""}