{"version":3,"file":"5436.chunk.87caa5deeaa3e13c5883.js","mappings":"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","sources":["webpack://Kristiania.Web/./Features/Partials/Utils/utils.ts"],"sourcesContent":["import type { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport omit from 'lodash/omit';\nimport type { RefObject } from 'react';\nimport ExecutionContext from '../../ExecutionContext';\nimport type { Money } from '../../Money.csharp';\nimport { axiosWrapper } from '../FetchData/axiosWrapper';\nimport { getContentLanguage } from '~/Features/Configuration/Utils/languageUtils';\nimport type { Falsy, StrictOmit } from '~/Partials/Utils/typeUtils';\n\nexport const omitProperty = (\n object: TObj,\n ...args: TArgs[]\n): StrictOmit => omit(object, args);\n\n/**\n * compare values\n * TODO: this is temporary solution.\n * make it better and faster or use some small lib\n */\nexport function checkEquals(a: T, b: T) {\n try {\n /** FIXME:\n * JSON.stringify \"ignores\" functions so there\n * is no sense to compare functions.. will always be true\n */\n return JSON.stringify(a) === JSON.stringify(b);\n } catch (e) {\n return false;\n }\n}\n\n/* TODO - needs some work with it */\n\n// Replace with new makePostRequest\nexport async function makePostRequestOld(\n url: string,\n params: ParamsType,\n config: AxiosRequestConfig = {}\n) {\n // No try-catch on purposes.\n const response = await axiosWrapper.post(url, params, config);\n\n return response as AxiosResponse;\n}\n\nexport function objectAssignToEmptyFields>(\n source: TObject,\n fields: TFields\n) {\n /* TODO: test & doc & make code more readable maybe? */\n return Object.entries(source).reduce((acc, [key, oldVal]) => {\n const newVal = fields[key as keyof TObject];\n\n // Only non-boolean \"falsy\" value will be replaced.\n const isOldValueEmpty = () => !oldVal && typeof oldVal !== 'boolean';\n\n // And only if new value is \"truthy\" or boolean\n const isNewValueNonEmpty = () => !!newVal || typeof newVal === 'boolean';\n\n return {\n ...acc,\n [key]: isOldValueEmpty() && isNewValueNonEmpty() ? newVal : oldVal,\n };\n }, {} as TObject);\n}\n\nexport function cloneArrayAndUpdateSingleItem(source: T[], item: T, updateFunction: (oldItem: T) => T) {\n const index = source.indexOf(item);\n const updatedItem = updateFunction(item);\n\n return [...source.slice(0, index), updatedItem, ...source.slice(index + 1)];\n}\n\nexport const moneyToString = (money: Money) => {\n const amountFormatted = formatAmount(money.amount);\n const currencyFormatted = formatCurrency(money.currencyCode);\n\n return money.currencyCode === 'NOK'\n ? `${currencyFormatted} ${amountFormatted}`\n : `${amountFormatted} ${currencyFormatted}`;\n};\n\nconst formatAmount = (amount: number) => {\n const parts = amount.toString().split('.');\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ' ');\n\n return parts.join('.');\n};\n\nconst formatCurrency = (currency: string) => (currency === 'NOK' ? 'kr' : currency);\n\nexport const formatNumber = (value: number) => value.toLocaleString(getContentLanguage());\n\nexport const redirect = (url: string) => {\n if (ExecutionContext.IsServerSide()) {\n return;\n }\n\n window.location.href = url.indexOf('/') === 0 ? `${window.location.origin}${url}` : url;\n};\n\nexport const reload = () => {\n if (ExecutionContext.IsServerSide()) {\n return;\n }\n\n window.location.reload();\n};\n\nexport const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\nexport const getElementById = (id: string) => {\n if (!ExecutionContext.IsServerSide()) {\n return document.getElementById(id);\n }\n};\nexport const scrollToElement = (\n element: HTMLElement,\n behavior: ScrollBehavior = 'smooth',\n block?: ScrollLogicalPosition,\n inline?: ScrollLogicalPosition\n) => {\n if (!ExecutionContext.IsServerSide()) {\n element.scrollIntoView({\n behavior,\n block,\n inline,\n });\n }\n};\n\nexport const smoothScrollToSectionById = (id: string) => {\n const section = getElementById(id);\n\n if (section) {\n scrollToElement(section);\n }\n};\n\nexport const smoothScrollToSectionByRef = (ref: RefObject) => {\n if (ref.current) {\n scrollToElement(ref.current);\n }\n};\n\nexport const scrollToTop = () => scrollTo(0, 0);\n\nexport const isTruthy = (item: T | Falsy): item is T => !!item;\n\nexport const getCurrentUrl = () => (ExecutionContext.IsServerSide() ? undefined : window.location.href);\n\nexport const toUrl = (url: string) => {\n ExecutionContext.ThrowIfServerSide();\n\n return new URL(url, `${location.protocol}//${location.hostname}${location.port ? `:${location.port}` : ''}`);\n};\n\nfunction legacyCopyTextToClipboard(text: string) {\n const textArea = document.createElement('textarea');\n textArea.value = text;\n\n // Avoid scrolling to bottom\n textArea.style.top = '0';\n textArea.style.left = '0';\n textArea.style.position = 'fixed';\n\n document.body.appendChild(textArea);\n textArea.focus();\n textArea.select();\n document.execCommand('copy');\n document.body.removeChild(textArea);\n}\n\nexport async function copyTextToClipboard(text: string) {\n // eslint-disable-next-line compat/compat -- we first check whether the browser supports the clipboard API\n navigator.clipboard ? await navigator.clipboard.writeText(text) : legacyCopyTextToClipboard(text);\n}\n\nexport function combineValidAttributeValues(...values: (string | undefined)[]) {\n const validValues = values.filter(isTruthy);\n\n return validValues.length === 0 ? undefined : validValues.join(' ');\n}\n\nexport const repeat = (item: TItem, count: number) => Array(count).fill(item);\n\nexport const repeatWithId = (item: TItem, count: number) =>\n repeat(item, count).map((element, index) => ({ id: index.toString(), ...element }));\n\nexport const createArray = (factory: (index: number) => TItem, count: number) =>\n Array.from({ length: count }).map((_, index) => factory(index));\n\nexport const replaceNotFriendlyCharacters = (str: string) => str.replace(/[ -/:-@[-`{-}]+/g, '-');\n\nexport const capitalize = (str: T) =>\n (str ? str[0].toUpperCase() + str.slice(1) : str) as Capitalize;\n\nexport const getLastElementOfArray = (array?: TItem[]) =>\n !array || array.length === 0 ? undefined : array[array.length - 1];\n\nexport const stripFromHTMLNode = (rawHtml: string, node: 'p') =>\n rawHtml.replace(new RegExp(`<${node}>|`, 'g'), '');\n\nexport const firstKey = (map: Map) => {\n const result = map.keys().next();\n\n return result.done ? undefined : result.value;\n};\n\nexport const hasAny = (items: TItem[], predicate: (item: TItem) => boolean) =>\n items.find(predicate) !== undefined;\n\nexport const areEqual = (first: string, second: string, ignoreCase = false) =>\n first.localeCompare(second, undefined, { sensitivity: ignoreCase ? 'accent' : 'variant' }) === 0;\n\nexport const isSafari = () => {\n if (ExecutionContext.IsServerSide()) {\n return false;\n }\n\n // eslint-disable-next-line compat/compat -- this is client-side code\n const userAgent = navigator.userAgent.toLowerCase();\n\n return userAgent.includes('safari') && !userAgent.includes('chrome') && !userAgent.includes('crios');\n};\n\nexport const findClosestParent = (\n element: Element,\n predicate: (element: Element) => element is TElement\n): TElement | null => {\n let potentialResult: Element | null = element;\n\n while (potentialResult) {\n if (predicate(potentialResult)) {\n return potentialResult;\n }\n\n potentialResult = potentialResult.parentElement;\n }\n\n return null;\n};\n\nexport const isInteractiveElement = (element: HTMLElement) => {\n const formTags = ['button', 'input', 'select', 'textarea'];\n const linkTags = ['a', 'area'];\n\n const normalizedTagName = element.tagName.toLowerCase();\n\n return (\n (formTags.includes(normalizedTagName) && !element.hasAttribute('disabled')) ||\n (linkTags.includes(normalizedTagName) && element.hasAttribute('href'))\n );\n};\n\nexport const hashValue = async (value: string) => {\n ExecutionContext.ThrowIfServerSide();\n\n const encoder = new TextEncoder();\n const data = encoder.encode(value);\n // eslint-disable-next-line compat/compat -- this is client-side code\n const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n\n return hashArray.map(num => num.toString(16).padStart(2, '0')).join('');\n};\n\nexport const isErrorWithName = (error: unknown, errorName: string) =>\n typeof error === 'object' && error !== null && 'name' in error && error.name === errorName;\n\nexport const urlJoin = (...parts: string[]) => parts.join('/').replace('//', '/');\n"],"names":["omitProperty","object","_len","arguments","length","args","Array","_key","omit","checkEquals","a","b","JSON","stringify","e","async","makePostRequestOld","url","params","config","undefined","axiosWrapper","post","objectAssignToEmptyFields","source","fields","Object","entries","reduce","acc","_ref","key","oldVal","newVal","_objectSpread","cloneArrayAndUpdateSingleItem","item","updateFunction","index","indexOf","updatedItem","slice","moneyToString","money","amountFormatted","formatAmount","amount","currencyFormatted","formatCurrency","currencyCode","concat","parts","toString","split","replace","join","currency","formatNumber","value","toLocaleString","getContentLanguage","redirect","ExecutionContext","IsServerSide","window","location","href","origin","reload","delay","ms","Promise","resolve","setTimeout","getElementById","id","document","scrollToElement","element","behavior","block","inline","scrollIntoView","smoothScrollToSectionById","section","smoothScrollToSectionByRef","ref","current","scrollToTop","scrollTo","isTruthy","getCurrentUrl","toUrl","ThrowIfServerSide","URL","protocol","hostname","port","copyTextToClipboard","text","navigator","clipboard","writeText","textArea","createElement","style","top","left","position","body","appendChild","focus","select","execCommand","removeChild","legacyCopyTextToClipboard","combineValidAttributeValues","_len2","values","_key2","validValues","filter","createArray","factory","count","from","map","_","replaceNotFriendlyCharacters","str","capitalize","toUpperCase","getLastElementOfArray","array","stripFromHTMLNode","rawHtml","node","RegExp","firstKey","result","keys","next","done","hasAny","items","predicate","find","isSafari","userAgent","toLowerCase","includes","findClosestParent","potentialResult","parentElement","isInteractiveElement","normalizedTagName","tagName","hasAttribute","hashValue","data","TextEncoder","encode","hashBuffer","crypto","subtle","digest","Uint8Array","num","padStart","isErrorWithName","error","errorName","name","urlJoin","_len3","_key3"],"sourceRoot":""}