{"version":3,"file":"main.js","sources":["../../lib/main.ts"],"sourcesContent":["// import 'vite/modulepreload-polyfill'\r\n\r\nexport const $Resources: $AllResources = <$AllResources>{};\r\nwindow.$Resources = $Resources as any;\r\n\r\nconst navigatorLanguage = navigator.language.slice(0, 2);\r\n\r\nexport const appconfig: GlobalConfig = {\r\n lang: {\r\n user: navigatorLanguage,\r\n loc: navigatorLanguage,\r\n key: '$Resources',\r\n filepath: '/Journeys/lang/resources',\r\n ext: '.json',\r\n },\r\n api: {\r\n apiHost: 'https://ui.ungapped.com/',\r\n authCookie: '.ASPXAUTH',\r\n md30Host: '',\r\n youTubeApiUrl: 'https://www.googleapis.com/youtube/v3/videos?part=snippet&id={id}&key=',\r\n language: '',\r\n },\r\n};\r\nwindow.appconfig = appconfig; // temp\r\n\r\nexport const encodeJSONBlob = (\r\n data: any,\r\n options?: {\r\n replacerFunction: ((this: any, key: string, value: any) => any) | undefined;\r\n jsonWhiteSpace: number;\r\n }\r\n) => {\r\n let str = JSON.stringify(data, options?.replacerFunction || undefined, options?.jsonWhiteSpace ?? 2),\r\n utf8 = new Uint8Array(str.length);\r\n\r\n new TextEncoder().encodeInto(str, utf8);\r\n\r\n let blob = new Blob([utf8], {\r\n type: 'application/jsoncharset=utf-8',\r\n });\r\n\r\n return blob;\r\n};\r\n\r\nexport const decodeJSONBlob = async (blob: Blob, chunk?: boolean) => {\r\n let s = await blob.arrayBuffer();\r\n let e = new TextDecoder().decode(s);\r\n return await JSON.parse(e);\r\n};\r\n\r\n// token cookies\r\nexport function setSessionCookie(name: string, value: any) {\r\n document.cookie = name + '=' + value + ';path=/';\r\n}\r\n\r\nexport function getCookie(name: string) {\r\n let regex = new RegExp('(?:(?:^|.*;\\\\s*)' + name + '\\\\s*\\\\=\\\\s*([^;]*).*$)|^.*$');\r\n var cookie = document.cookie.replace(regex, '$1');\r\n return cookie;\r\n}\r\n\r\nexport function deleteCookie(name: string) {\r\n document.cookie = name + '=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n}\r\n\r\nexport function deleteAllCookies() {\r\n var cookies = document.cookie.split(';');\r\n for (var i = 0; i < cookies.length; i++) {\r\n var cookie = cookies[i];\r\n var eqPos = cookie.indexOf('=');\r\n var name = eqPos > -1 ? cookie.substring(0, eqPos) : cookie;\r\n document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT';\r\n }\r\n}\r\n\r\nexport const token = (token?: any, sameSiteNone?: any) => {\r\n if (token) {\r\n let attrs: any = { expires: token.expires_in / 86000 };\r\n if (sameSiteNone) {\r\n attrs.sameSite = 'none';\r\n attrs.secure = true;\r\n }\r\n // OAuth token expires_in is in seconds, parameter to Cookies is in days (86400 sec/day), rounded down so that we don't overlap calls\r\n setSessionCookie(api.settings.authCookie!, JSON.stringify(token));\r\n return token;\r\n }\r\n\r\n var cookie = getCookie(api.settings.authCookie!);\r\n if (!!cookie && cookie.indexOf('{%22') === 0) cookie = decodeURIComponent(cookie);\r\n if (!cookie) return null;\r\n return JSON.parse(cookie);\r\n};\r\n\r\n// wip\r\ninterface ApiOptions {\r\n method?: string;\r\n dataType?: string;\r\n contentType?: string;\r\n url?: string;\r\n body?: BodyInit;\r\n headers: HeadersInit;\r\n}\r\n\r\ninterface ApiSettings {\r\n apiHost?: string;\r\n authCookie?: string;\r\n publicHost?: string;\r\n unauthorized?: () => void;\r\n requireAuth?: boolean;\r\n}\r\n\r\ninterface AppApi {\r\n rc: number;\r\n lang: {};\r\n services: {};\r\n defaults: ApiSettings;\r\n settings: ApiSettings;\r\n beforeSend: (settings: ApiSettings) => ApiOptions;\r\n queryStringParams: ProxyConstructor | URLSearchParams | any;\r\n init: any;\r\n get: any;\r\n put: (url: string, payload?: any, contentType?: string, onSuccess?: (...args: unknown | any) => unknown | any) => Promise;\r\n post: (url: string, payload?: any, contentType?: string, onSuccess?: (...args: unknown | any) => unknown | any) => Promise;\r\n delete: any;\r\n}\r\n\r\nconst defaults: ApiSettings = {\r\n apiHost: '',\r\n authCookie: 'auth',\r\n publicHost: '',\r\n unauthorized: function () {\r\n console.log('default unauthorized');\r\n },\r\n requireAuth: true,\r\n};\r\n\r\nfunction handleUnauthorized(response: { res: Response; body: string }, unauthorized: Function) {\r\n let err = response.res;\r\n let body = response.body;\r\n if (!err) return false;\r\n console.log(response);\r\n if (err.status === 403 && body === 'BankIDRegistrationRequired') {\r\n document.location = '/Account/Register/BankID?ReturnUrl=' + document.location.pathname;\r\n } else if (err.status === 403 && body === 'BankIDRequired') {\r\n document.location = '/Account/Signin/BankID?ReturnUrl=' + document.location.pathname;\r\n } else if (err.status === 403 && body === 'GoogleAuthenticatorRegistrationRequired') {\r\n document.location = '/Account/Register/Authenticator' + document.location.search;\r\n } else if (err.status === 403 && body === 'GoogleAuthenticatorRequired') {\r\n document.location = '/Account/Signin/Authenticator' + document.location.search;\r\n } else if (err.status === 403 && body.startsWith('OpenIdRequired:')) {\r\n var providerName = body.split(':')[1];\r\n document.location = '/Account/openid/' + providerName + document.location.search;\r\n } else if (err.status === 403 && body.indexOf('account-expired') > 0) {\r\n document.location = '/Account/Expired/';\r\n } else if (err.status === 401) {\r\n if (unauthorized) {\r\n unauthorized.apply(undefined, err);\r\n }\r\n document.location = '/Account/SignIn?ReturnUrl=' + encodeURIComponent(document.location.pathname);\r\n } else if (err.status === 403 && body.substring(12, 38) === 'Not authorized for Feature') {\r\n document.location = '/Account/Unauthorized/CustomRole?responseText=' + body;\r\n } else if (err.status === 403) {\r\n if (unauthorized) {\r\n unauthorized.apply(undefined, err);\r\n }\r\n document.location = '/Account/SignIn?ReturnUrl=' + encodeURIComponent(document.location.pathname);\r\n } else if (err.status === 402) {\r\n document.location = '/Account/Evaluation/';\r\n }\r\n return false;\r\n}\r\n\r\nfunction failHandler(err: any, settings: ApiSettings) {\r\n if (!err || !err.text) return Promise.reject(err);\r\n let promise = null;\r\n\r\n promise = err.text();\r\n return promise.then((body: string) => {\r\n if (!handleUnauthorized({ res: err, body: body }, settings.unauthorized!)) {\r\n return Promise.reject({ status: err.status, statusText: err.statusText, message: body });\r\n }\r\n return Promise.reject(err);\r\n });\r\n}\r\n\r\nexport const api: AppApi = {\r\n rc: 0,\r\n lang: {},\r\n services: {},\r\n defaults,\r\n settings: {},\r\n beforeSend: (settings: ApiSettings) => ({ headers: {} }),\r\n queryStringParams: new Proxy(new URLSearchParams(self.location.search), {\r\n get: (searchParams: URLSearchParams, prop: string | symbol) => searchParams.get(prop as string),\r\n }),\r\n init(options: ApiOptions) {\r\n Object.assign(this.settings, options);\r\n\r\n this.beforeSend = (settings: any) => {\r\n let auth = token();\r\n if (!auth && settings.requireAuth) {\r\n window.location.href = '/Account/SignIn?ReturnUrl=' + encodeURIComponent(document.location.pathname); //Go to login if cookie is missing -> check handle unauthorzied aswell\r\n }\r\n\r\n if (!settings.requireAuth && !auth) {\r\n return { headers: { Host: settings.apiHost! } };\r\n }\r\n\r\n return {\r\n headers: {\r\n Host: settings.apiHost!,\r\n Authorization: auth.token_type + ' ' + auth.access_token,\r\n },\r\n };\r\n };\r\n },\r\n\r\n // fetch methods\r\n get(url: string, options?: any, target?: any) {\r\n let settings = options ? Object.assign(this.settings, options) : this.settings;\r\n options = this.beforeSend(settings);\r\n\r\n options.method = 'GET';\r\n\r\n if (url.indexOf('/') === 0) {\r\n url = settings.apiHost + url;\r\n }\r\n\r\n let req_num = ++this.rc;\r\n\r\n return fetch(url, options)\r\n .then((res: any) => {\r\n if (res.ok) {\r\n if (/json/g.test(res.headers.get('content-type'))) return res.json();\r\n else return res.text();\r\n } else {\r\n console.log(`[${req_num}]`, 'Failed GET:', res.status, res.statusText);\r\n\r\n return Promise.reject(res);\r\n }\r\n })\r\n .then((data: unknown) => {\r\n if (target) return Object.assign(target, data);\r\n\r\n return data;\r\n })\r\n .catch((err: Response) => {\r\n return failHandler(err, settings);\r\n });\r\n },\r\n put(url: string, payload: any, contentType: string = 'application/json; charset=UTF-8', onSuccess?: (...args: unknown | any) => unknown | any) {\r\n let settings = this.settings,\r\n options = this.beforeSend(settings);\r\n\r\n options.method = 'PUT';\r\n options.headers['Content-Type' as keyof HeadersInit] = contentType;\r\n options.body = /json/g.test(contentType) ? JSON.stringify(payload) : payload;\r\n\r\n if (url.indexOf('/') === 0) {\r\n url = settings.apiHost + url;\r\n }\r\n\r\n let req_num = ++this.rc;\r\n\r\n return (\r\n fetch(url, options)\r\n //******* Q: how often do we get responses with content-types other than json?\r\n //********* ex. string, int, null will throw error during result parse\r\n .then((res: any) => {\r\n if (res.ok) {\r\n if (/json/g.test(res.headers.get('content-type'))) return res.json();\r\n else return res.text();\r\n } else {\r\n console.log(`[${req_num}]`, 'Failed PUT:', res.status, res.statusText);\r\n\r\n return Promise.reject(res);\r\n }\r\n })\r\n .then((data: any) => {\r\n return onSuccess ? onSuccess(data) : data;\r\n })\r\n .catch((err: any) => {\r\n return failHandler(err, settings);\r\n })\r\n );\r\n },\r\n post(url: string, payload: any, contentType: string = 'application/json; charset=UTF-8', onSuccess?: (...args: unknown | any) => unknown | any) {\r\n let settings = this.settings,\r\n options = this.beforeSend(settings);\r\n\r\n options.method = 'POST';\r\n options.headers['Content-Type' as keyof HeadersInit] = contentType;\r\n options.body = /json/g.test(contentType) ? JSON.stringify(payload) : payload;\r\n\r\n if (url.indexOf('/') === 0) {\r\n url = settings.apiHost + url;\r\n }\r\n\r\n let req_num = ++this.rc;\r\n\r\n return (\r\n fetch(url, options)\r\n //******* Q: how often do we get responses with content-types other than json?\r\n //********* ex. string, int, null will throw error during result parse\r\n .then((res: any) => {\r\n if (res.ok) {\r\n if (/json/g.test(res.headers.get('content-type'))) return res.json();\r\n else return res.text();\r\n } else {\r\n console.log(`[${req_num}]`, 'Failed POST:', res.status, res.statusText);\r\n\r\n return Promise.reject(res);\r\n }\r\n })\r\n .then((data: any) => {\r\n return onSuccess ? onSuccess(data) : data;\r\n })\r\n .catch((err: any) => {\r\n return failHandler(err, settings);\r\n })\r\n );\r\n },\r\n delete(\r\n url: string,\r\n payload: any,\r\n onSuccess?: (...args: unknown | any) => unknown | any,\r\n // contentType: string = 'application/x-www-form-urlencoded; charset=UTF-8'\r\n contentType: string = 'application/json; charset=UTF-8'\r\n ) {\r\n let settings = this.settings,\r\n options = this.beforeSend(settings);\r\n\r\n options.method = 'DELETE';\r\n options.headers['Content-Type' as keyof HeadersInit] = contentType;\r\n options.body = /json/g.test(contentType) ? JSON.stringify(payload) : payload;\r\n\r\n if (url.indexOf('/') === 0) {\r\n url = settings.apiHost + url;\r\n }\r\n\r\n let req_num = ++this.rc;\r\n\r\n return fetch(url, options)\r\n .then((res: any) => {\r\n if (res.ok) {\r\n if (/json/g.test(res.headers.get('content-type'))) return res.json();\r\n else return res.text();\r\n } else {\r\n console.log(`[${req_num}]`, 'Failed DELETE:', res.status, res.statusText);\r\n\r\n return Promise.reject(res);\r\n }\r\n })\r\n .catch((err: any) => {\r\n return failHandler(err, settings);\r\n });\r\n },\r\n};\r\n\r\nexport function clearUserEvents() {\r\n setSessionCookie('UserEvents', '');\r\n}\r\n\r\n// Register event with Google\r\nexport function registerUserEvent(category: string, action: string, label: string) {\r\n var dataLayer = (window as any).dataLayer || [];\r\n dataLayer.push({\r\n event: 'gaEvent',\r\n eventCategory: category,\r\n eventAction: action,\r\n eventLabel: label,\r\n eventValue: undefined,\r\n nonInteraction: undefined,\r\n });\r\n\r\n var evtstr = getCookie('UserEvents');\r\n var evts = evtstr ? evtstr.split(', ') : [];\r\n evts.push(action);\r\n setSessionCookie('UserEvents', evts.join(', '));\r\n}\r\n"],"names":["$Resources","navigatorLanguage","appconfig","setSessionCookie","name","value","getCookie","regex","cookie","deleteCookie","token","sameSiteNone","api","defaults","handleUnauthorized","response","unauthorized","err","body","providerName","failHandler","settings","promise","searchParams","prop","options","auth","url","target","req_num","res","data","payload","contentType","onSuccess","registerUserEvent","category","action","label","dataLayer","evtstr","evts"],"mappings":"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"}