{"version":3,"sources":["webpack:///./src/utils/google-tagmanager.js","webpack:///./src/lang/shared-config.js","webpack:///./src/lang/boot-languages.js","webpack:///./src/state/environment/reducer.ts","webpack:///./src/utils/http.ts","webpack:///./src/utils/environment.ts","webpack:///./src/state/language/selectors.ts","webpack:///./src/localization/languagecode.js","webpack:///./src/localization/use-localized-price-formatter.ts","webpack:///./src/state/member/selectors.ts","webpack:///./src/utils/cookie.js","webpack:///./src/utils/versions.js","webpack:///./src/state/environment/native-app-support.js","webpack:///./src/apps/nextweb/utils/viewport.js","webpack:///./src/state/environment/initial-state.js","webpack:///./src/state/environment/native-app-info-helper.js","webpack:///./src/state/environment/actions.js","webpack:///./src/state/page/selectors.js","webpack:///./src/apps/nextweb/components/next-link.tsx","webpack:///./src/components/alink/use-next-web-spa-link.ts","webpack:///./src/components/alink/alink.tsx","webpack:///./src/utils/cookie-helpers.js","webpack:///./src/apps/nextweb/i18n/translation-keys.js","webpack:///./src/lang/translate.tsx","webpack:///./src/hooks/use-location.js","webpack:///./src/constants/cookies.js","webpack:///./src/utils/language.js","webpack:///./src/state/hooks.ts","webpack:///./src/constants/hosts.js","webpack:///./src/utils/url.js","webpack:///./src/utils/nextjs.js","webpack:///./src/lang/constants.mjs","webpack:///./src/localization/format-price.ts","webpack:///./src/utils/format.js","webpack:///./src/legacy/static/packages/init-data.js","webpack:///./src/utils/object.js","webpack:///./src/backend/utils/host.js","webpack:///./src/backend/utils/cookies.js","webpack:///./src/utils/api.ts","webpack:///./src/apps/my-tradera/app/constants/list-types.ts","webpack:///./src/state/shipping-region/selectors.js","webpack:///./src/legacy/static/packages/logger.ts","webpack:///./src/services/google-tagmanager-service.js","webpack:///./src/constants/endpoints.js","webpack:///./src/constants/breakpoints.ts","webpack:///./src/blueprint/theme/scss/export/breakpoints.module.scss","webpack:///./src/utils/gdpr-settings.js","webpack:///./src/state/multi-currency/selectors.js","webpack:///./src/state/environment/selectors.js","webpack:///./src/components/toasts/item-toast.module.scss","webpack:///./src/components/toasts/item-toast.jsx","webpack:///./src/components/toasts/message-toast.tsx","webpack:///./src/services/toasts.tsx","webpack:///./src/services/toast-queue.js","webpack:///./src/hooks/use-is-feature-enabled.js","webpack:///./src/localization/countrycode.js","webpack:///./src/utils/date.js"],"names":["buildInitialGtmDataLayerFromInitData","initData","initialDataLayer","memberId","userLanguage","languageCodeIso2","memberEmail","isLoggedIn","memberHashedEmail","memberEmailSha256","memberEmailMd5","memberFirstName","memberLastName","memberCountry","loginState","isNotInIframe","window","self","top","blueshiftEventApiKey","blueshiftEventSignature","isSinglePageApp","isNativeAppContext","isQuantcastConsentEnabled","featureSwitches","isTikTokPixelEnabled","isDigitalAudienceTrackingEnabled","quantcastSite","splitTestGroups","_ref","Object","entries","_ref2","_slicedToArray","key","value","missingKeyLoggingConfig","saveMissing","saveMissingTo","missingKeyHandler","language","namespace","_fallbackValue","_updateMissing","options","isNextJs","isServer","hasLoadedAllTranslations","errorMessage","Sentry","Error","missingInterpolationHandler","text","JSON","stringify","i18nInitialized","bootLanguages","translations","arguments","length","undefined","touchwebTranslations","attributeTranslations","translationResources","map","attributeResources","_ref3","_ref4","resources","concat","reduce","prev","_ref5","s","_objectSpread","i18n","use","initReactI18next","LanguageDetector","init","initOptions","err","logger","detection","order","htmlTag","document","html","defaultNS","NS_TOUCHWEB","ns","NS_ATTRIBUTES","fallbackLng","DEFAULT_LANGUAGE","debug","keySeparator","nsSeparator","interpolation","skipOnVariables","escapeValue","format","formatNumberWithSeparators","react","useSuspense","whenInitialized","then","t","toLocalizedUrl","url","slice","createSlice","name","initialState","variables","reducers","initialize","_state","payload","setEnvironmentHash","state","environmentHash","setIsSpaNavigationEnabled","isSpaNavigationEnabled","setExperiments","_state$experiments","experiments","setGATrackingData","gaTrackingSessionId","sessionId","_slice$actions","actions","reducer","ensureClientOnly","httpClient","baseUrl","shouldLocalizeUrl","axiosWrapper","httpClientConfig","axiosCaller","cancelTokenId","axiosConfig","_objectWithoutProperties","_excluded","version","_utilizeCancelToken","utilizeCancelToken","cancel","cancelToken","safeUrl","getSafeUrl","endsWith","startsWith","substring","localizedUrl","getLanguage","axiosWithTokenRefresh","checkResponseVersion","response","finalizeResponse","catch","handleError","get","axiosConfigs","authenticated","axios","config","post","put","delete","request","enhancedConfig","trpcClient","endpoint","client","unpackResponse","data","command","commandName","query","queryName","defaultClient","touchWebClient","webApiClient","ENDPOINTS","WEB_API","cmsApiClient","marketingApiClient","MARKETING_PUBLIC_API","memberIdentificationClient","translationDynamicApiClient","shippingRecommendationsClient","isDev","_process","_process$env","process","NODE_ENV","selectAvailableLanguages","available","selectAvailableLanguageCodesIso2","_state$language$avail","x","selectPreferredLanguage","preferred","selectPreferredLanguageCode","_state$language$prefe","selectLocale","memberCountryCodeIso2","selectIsForeignLanguageActivated","_selectPreferredLangu","selectAutomaticTranslationPreference","_state$language$autom","automaticTranslationPreference","isSwedishOrUndefined","toLowerCase","getLanguageFromCountryCode","countryCodeIso2","isFrenchDutchSelectable","se","dk","de","fr","nl","getCountryCodeForFlagFromLanguage","languageCode","en","da","getCountryCodeFromLanguage","areLanguageCodesIso2Equal","first","second","toUpperCase","useLocalizedPriceFormatter","_useLocalizedPriceFormatter","useLocalizedPriceFormatterRoundingUp","roundUp","useLocalizedPriceFormatterNoConversion","conversion","useLocalizedPriceFormatterNoSymbol","style","useLocalizedPriceFormatterAllowFractions","allowFractions","_ref$conversion","useCurrentLanguage","preferredCurrency","useSelector","selectPreferredCurrency","useCallback","price","formatPrice","rate","Number","currency","code","minimumFractionDigits","decimals","maximumFractionDigits","selectMember","member","selectIsLoggedIn","_state$member","selectGeolocation","_state$member2","geolocation","selectMemberId","_state$member3","selectMemberEmail","_state$member5","selectMemberFirstName","_state$member6","selectMemberLastName","_state$member7","selectMemberCountryCodeIso2","_state$member9","selectIsOutsideSweden","_state$member10","_state$member10$geolo","_state$member11","_state$member11$geolo","isoCode","showDanishFromCountry","fromCountry","selectShippingRegionCountryCodeIso2","areCountryCodesIso2Equal","selectMemberTown","_state$member12","memberTown","CookieUtil","constructor","getCookie","setCookie","this","gdpr","GdprSettings","segment","convertToExpiresStr","expires","expiresStr","Infinity","String","Date","toUTCString","createCookie","cookieKey","cookieValue","path","domain","secure","test","category","CATEGORIZED_COOKIES","COOKIE_DEFAULT_CATEGORY","isCategoryEnabled","encodeURIComponent","location","protocol","readCookie","hasCookie","eraseCookie","getCookieFromBrowser","setCookieToBrowser","parseAppVersion","_String$split$map$fil2","split","filter","number","isNaN","_String$split$map$fil3","major","_String$split$map$fil4","minor","_String$split$map$fil5","patch","isSupportedMinimumVersion","appVersionString","minimumVersionString","appVersion","minimumVersion","getNativeAppSupport","isHybridAppContext","hybridAppDevice","hybridAppVersion","appOsVersion","isIOS","isAndroid","isHybridAppContextForAndroid","Boolean","includes","isHybridAppContextForIos","isIos13","isNativeAppWithApplyPaySupport","isNativeAppWithSwishCallbackSupport","isNativeAppWithKlarnaSupport","BREAKPOINTS","XS","SM","MD","BREAKPOINT_SIZES","min","LG","XL","NATIVE_APP_COOKIE_AND_HEADER_CONFIG","osVersion","header","initDataName","appDevice","appContext","appLanguage","appInstanceId","createNativeAppCookieValue","nativeAppInfo","valueObject","fromEntries","extractNativeAppInfoFromCookie","nativeAppCookieString","parse","decodeURIComponent","updateEnvironmentHash","async","dispatch","getState","queryParameters","URLSearchParams","next","set","preferredLanguageCode","getVersionUrl","headers","environment","getAndUpdateNativeAppInfo","nativeAppInfoFromInitData","obj","_ref7","_ref8","extractNativeAppInfoFromInitData","values","nativeAppCookieValue","cookie","NATIVE_APP_ENVIRONMENT","initEnvironment","_getAndUpdateNativeAp","_initData$experiments","googleAnalyticsTrackingId","googleAnalyticsMeasurementId","geoPublicApiBaseUrl","splitTests","webLiveUrl","nullifyUndefinedProperties","isMobileDevice","isMobile","isMobileSafari","frameElement","PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID","PUBLIC_GOOGLE_ANALYTICS_MEASUREMENT_ID","PUBLIC_GEO_PUBLIC_API_BASE_URL","PUBLIC_WEB_LIVE_URL","getInitialState","gtm","pushArguments","callback","optimizeCallback","variant","id","experiment","parseInt","selectPageType","_state$page","page","type","arr","i","Array","isArray","_arrayWithHoles","_i","Symbol","iterator","_s","_e","_x","_r","_arr","_n","_d","call","done","push","return","_iterableToArrayLimit","o","minLen","_arrayLikeToArray","n","prototype","toString","from","_unsupportedIterableToArray","TypeError","_nonIterableRest","len","arr2","source","excluded","target","sourceKeys","keys","indexOf","_objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","NextLink","React","forwardRef","props","forwardedRef","hrefProp","href","asProp","as","children","passHref","replace","shallow","scroll","locale","onClick","onMouseEnter","onTouchStart","restProps","router","useContext","RouterContext","appRouter","AppRouterContext","_React$useMemo","useMemo","resolveHref","resolvedHref","resolvedAs","childProps","ref","e","defaultPrevented","isAppRouter","currentTarget","nodeName","event","metaKey","ctrlKey","shiftKey","altKey","nativeEvent","which","isModifiedEvent","isLocalURL","preventDefault","navigate","forceOptimisticNavigation","startTransition","linkClicked","curLocale","localeDomain","isLocaleDomain","getDomainLocale","locales","domainLocales","addBasePath","addLocale","defaultLocale","createElement","assign","NEXTWEB_PATHS","PATH_PREFIX","URL_LANGUAGES","join","vipPathRegex","RegExp","categoryPathRegex","searchPathRegex","startPagePathRegex","isLastDigitEnabled","digits","enabledDigits","isIn99Percent","itemId","lastTwoNumbers","useNextWebSpaLink","absoluteUrl","toggles","selectFeatureSwitches","cookies","_state$request","pathname","isStartPageLink","bucket","isVipLink","_pathname$match","match","isCategoryLink","_pathname$match2","categoryId","isSearchLink","searchParams","some","nextwebPath","PRODUCTION_ORIGIN","ALink","isTouchwebSpaLink","useLink","givenOnClick","otherProps","useDispatch","useLocation","useAppSelector","isNextWebAddUrlParamEnabled","useIsFeatureEnabled","isTouchWebAddUrlParamEnabled","URL","isNextWebSpaLink","handleSpaNavigationClick","evt","isRelativeUrl","origin","relativeUrl","search","getRelativeUrl","_jsx","Link","to","getCookieFromString","cookieString","usedKeyPageTypes","Map","getOrCreatePageTypeNamespaces","pageType","has","I18N_FRONTEND_NAMESPACES","Set","createWrappedT","i18nObject","pathType","throwOnTransSuffix","i18nKey","TRANS_SUFFIX","addKeyToServerCache","_len","args","_key","useTranslator","_state$status","status","_useTranslation","useTranslation","ready","wrappedT","_i18n$translator$extr","translator","extractFromKey","addKey","usedKeys","add","namespaces","resolve","exactUsedKey","withTranslator","WrappedComponent","WithTranslator","displayName","withUrlLocalizer","WithUrlLocalizer","useUrlLocalizer","_useTranslation2","_useTranslation3","urlLocalizer","useRef","current","Trans","_state$status2","_useTranslation4","defaults","TransComponent","_Fragment","DEFAULT_COOKIES","ITEM_LAYOUT","default","SITE_LAYOUT","MYTRADERA_DEFAULT_COOKIES","LIST_VIEW_TYPE","ITEMS_PER_PAGE","SHOW_FILTERS","LIST_VIEW_TYPE_BUYER_ACTIVE_ITEMS","PAGE_LIST_TYPES","BUYER_ACTIVE_ITEMS","LIST_VIEW_TYPE_BUYER_PURCHASES","BUYER_PURCHASES","LIST_VIEW_TYPE_BUYER_ITEMS_LOST","BUYER_ITEMS_LOST","LIST_VIEW_TYPE_SELLER_ACTIVE","SELLER_ACTIVE","LIST_VIEW_TYPE_SELLER_SOLD","SELLER_SOLD","LIST_VIEW_TYPE_SELLER_NOT_SOLD","SELLER_NOT_SOLD","GDPR_CONSENT_COOKIE","FORCE_GEO_DEV","REGION_PICKER_DISMISSED","SHIPPING_COUNTRY","SAVE_SEARCH_MODAL_DISMISSED","CART_ID","SHIP_TO_SWEDEN_DISCLAIMER_DISMISSED","EXPERIMENTS","EXPERIMENT_BUCKET","PRODUCT_COMMUNICATION_DISMISSED","WISH_LIST_NOTIFICATION_DISPLAY_COUNT","WISH_LIST_NOTIFICATION_HIDDEN","RECENTLY_VIEWED_ITEM_IDS","COOKIE_CATEGORIES","Essential","Performance","Functional","Marketing","COLLECT_SSN_MODAL_DISMISSED","toLocalizedRiotUrl","querySelector","getAttribute","useAppDispatch","SPA_PATH_REGEX","formatQueryParams","queryParams","_removePropertiesWith","removePropertiesWithoutValue","formattedQueryParams","fromPrice","toPrice","priceRange","prunePriceRange","_excluded2","isSpaLink","urlOrPath","stripCategoryIdFromQueryParameters","_excluded4","stripHost","HOSTS","stripItmFromQueryParameters","itm_source","itm_medium","_excluded5","stripPaginationFromQueryParameters","spage","paging","fe","_excluded6","stripSavedQueryNameFromQueryParameters","savedQueryName","_excluded7","stripSaveSearchNameFromQueryParameters","saveSearch","_excluded8","toAbsoluteUrl","webApiUrl","find","setLanguagePrefix","absoluteUrlMatch","_absoluteUrlMatch","host","pathAndQuery","toQueryParameters","qs","ignoreQueryPrefix","toRelativeTraderaUrl","toSearchString","_ref$addQueryPrefix","addQueryPrefix","_ref$encode","encode","_ref$skipNulls","skipNulls","_ref$arrayFormat","arrayFormat","languagePrefix","matches","firstMatch","index","getLanguagePrefixFromUrl","getBackToHereRedirectUrl","forceRedirect","Math","round","random","replacePartInPath","oldPart","newPart","part","getElementById","NS_CATEGORIES","NS_BACKEND","I18N_BACKEND_NAMESPACES","SUPPORTED_LANGUAGES","inputLocale","overrideOptions","currencyDisplay","useGrouping","priceAsNumber","decimalFactorForRounding","pow","ceil","isLocaleFormattingSupportedInBrowser","formattedPrice","toLocaleString","toLocaleStringSupportsLocales","Intl","NumberFormat","formatEndDate","endDateInput","nowDateInput","dayjs","endDate","swedishTimeZoneDate","now","isSameOrAfter","hours","diff","minutes","timeParts","count","isAfter","separator","formatSellerDsrAverage","getCurrencySymbol","defaultOptions","trim","initDataEL","mapObject","omitBy","isProductionHost","regex","isLocalHost","isDevHost","getAccessTokenCookieName","req","getMemberIdFromAuthCookie","_getJwtPayload","_req$cookies","getJwtPayload","mbr","getExpiryFromAuthCookie","_getJwtPayload2","_req$cookies2","exp","jwtToken","Buffer","error","addCookie","res","previouslySetCookies","getHeader","setHeader","API_ERRORS","IGNORE_ME","ABORTED","CANCELLED","NETWORK","TIMEOUT","VERSION_MISMATCH","LOGGED_OUT","defaultJsonRequestHeaders","Accept","withCredentials","notAuthenticated","isUnauthorized","statusCode","addAntiCacheParam","antiCacheRegExp","getTime","submitOriginalRequest","errorResponseInterceptor","_error$request","_error$request2","responseString","responseStatus","errorCode","isMissingAuthToken","refreshAccessToken","_errorAfterRefreshTok","errorAfterRefreshToken","message","Promise","reject","handleMissingAuthToken","checkLoginState","_response$data","handleUnauthorized","axiosInstance","instance","create","interceptors","cancelTokens","tokenId","CancelToken","token","checkResponseLoggedOut","statusHandlers","isCancel","reloadOnUnauthorized","reload","logError","scope","LIST_VIEW_TYPES","BASIC","NORMAL","PAGE_BULK_ACTIONS","ACTIVE_CANCEL","UNSOLD_RESTART","BUYER_MARK_PAID","BUYER_SHOW_ACTIVE","BUYER_HIDE_ACTIVE","PURCHASES_SHOW","selectShowRegionSelection","selectAvailableShippingCountryCodes","shippingRegion","availableShippingCountryCodes","selectAvailableShippingCountries","availableShippingCountries","selectShippingCountry","shippingCountry","selectIsLoadingAvailableShippingCountries","isLoadingAvailableShippingCountries","selectHasLoadedAvailableShippingCountries","hasLoadedAvailableShippingCountries","_state$shippingRegion","selectIsSwedishVisitor","isSwedenCountryCodeOrUndefined","selectIsDanishVisitor","isDenmarkCountryCode","selectShowLocalizationRegionPicker","regionPickerDismissed","shippingCountryCookieValue","_geoLocation$isoCode","_selectPreferredLangu2","geoLocation","country","selectIsFeatureEnabled","gpsMatchesLanguage","sentryException","spaPageViewTrackingEnabled","GtmService","_hasPreviouslyTrackedPage","_window$dataLayer","dataLayer","item","isScriptLoaded","_setWebViewHelperFunctionsToWindow","loadGtmScript","_newPageFromServer","accountId","NEXT_PUBLIC_GOOGLE_TAG_MANAGER_ACCOUNT_ID","w","d","l","f","getElementsByTagName","j","src","parentNode","insertBefore","_getDatalayerObject","output","entry","_reset","newPage","_pushInitialDataLayer","newSpaPage","legacyDataLayer","trackAction","action","label","nonInteractive","eventCategory","eventAction","eventLabel","eventValue","eventNonInteractive","level","trackGtmEvent","eventName","trackPageView","trackLinkClickAndCallback","eventCallback","trackLinkClickAndGotoUrl","logGaWebViewEvent","params","AnalyticsWebInterface","logEvent","webkit","messageHandlers","firebase","parameters","postMessage","setGaWebViewUserProperty","setUserProperty","PUBLIC_TOUCHWEB_WINDOW_LOCATION_ORIGIN","AVAILABLE_SHIPPING_COUNTRIES","CART_OVERVIEW_VIEW","CART_ADD_ITEM","CART_REMOVE_ITEMS","CART_SET_ITEM_QUANTITY","FAVOURITE_SELLERS","HYPERWALLET_PAYOUT_COMPLETE","HYPERWALLET_PAYOUT_TOKEN","HYPERWALLET_PAYOUT","INTERNATIONAL_SHIPPING_CALCULATOR","MEMBER_PAYOUT_SETTINGS_REMOVE","MEMBER_PAYOUT_SETTINGS","ORDER_CHECKOUT_CONFIRMATION","ORDER_CHECKOUT_PAYMENT","orderCheckoutPaymentUrl","ORDER_CHECKOUT_REQUEST_COMBINED_PRICE","ORDER_CHECKOUT_CREATE_UNCOMMITTED_PURCHASE_ORDER","ORDER_PURCHASE_SHOP_ITEMS","PERSONALISED_SUGGESTIONS","SEARCH","SWISH_APP2APP_CALLBACK","SWISH_APP2APP_CALLBACK_MARK_AS_PAID","UPI","purchaseOrderId","MCP","MCP_CONFIRM","PURCHASE_ORDER","SHIPPING_CHECKOUT_DELETE","bp","size","max","cookieCategory","encodedConsentCookie","consentCookie","decodeURI","isPerformanceEnabled","isFunctionalEnabled","isMarketingEnabled","performance","functional","marketing","httpOnly","serialize","toDate","selectCurrencies","multiCurrency","currencies","c","selectIsPreferredCurrencySEK","_selectPreferredCurre","selectShowCurrencySelection","enabled","featureName","_selectFeatureSwitche","selectWebLiveUrl","ItemToast","imageUrl","itemUrl","shortDescription","eventData","className","styles","_jsxs","title","alt","ToastMessage","localizedPriceFormatter","newLeadingBid","newLeadingBidAmount","timeLeftMinutes","MessageToast","messageData","queuedToasts","createQueue","items","isAlive","ttlInMinutes","timeStamp","inProgress","_itemData","itemData","shift","notifyDone","isInProgress","getLength","openNextToast","nextItem","queueLength","toastOptions","autoClose","onClose","toast","_nextItem$eventData","handleNotification","visibilityState","showItemOutbiddedToast","showItemFirstBidToast","showItemSoldToast","showItemWonToast","showItemPaidToast","showItemWishListReminderToast","showSuccessToast","TYPE","SUCCESS","showErrorToast","ERROR","showInfoToast","INFO","isSwedenCountryNameOrUndefined","countryName","plainDayjs","extend","isBetween","utc","timezone","localizedFormat","localizedDayjs","date","localizedDayjsFn","tz","formatUtcDateAsSwedishTimeZoneDate","getTimeSpanParts","seconds","optionsWithDefaults","startUnit","endUnit","parts","remaining","started","TIME_SPAN_UNIT_LENGTHS","floor","TIME_SPAN_UNITS","DAYS","HOURS","MINUTES","SECONDS"],"mappings":"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","file":"script/chunks/chunk.campaigns~default~login~resolution~swedish-private.3b768f5116.js","sourcesContent":["import { isDev } from './environment';\n\nexport const buildInitialGtmDataLayerFromInitData = (initData) => {\n // ***** ATTENTION !!! *****\n // If you change anything here you must\n // also change in buildInitialGtmDataLayerFromState\n // so that they match. Otherwise values\n // between Touchweb and NextWeb don't match.\n const initialDataLayer = {\n memberId: initData.memberId || 0,\n userLanguage: initData.languageCodeIso2,\n memberEmail: initData.isLoggedIn ? initData.memberEmail : '',\n memberHashedEmail: initData.isLoggedIn\n ? initData.memberEmailSha256\n : '',\n 'criteo.hashedEmail': initData.isLoggedIn\n ? initData.memberEmailMd5\n : '',\n memberFirstName: initData.isLoggedIn ? initData.memberFirstName : '',\n memberLastName: initData.isLoggedIn ? initData.memberLastName : '',\n memberCountry: initData.isLoggedIn ? initData.memberCountry : '',\n loginState: initData.isLoggedIn ? 'logged in' : 'not logged in',\n isNotInIframe: window.self === window.top,\n 'blueshift.event-api-key': initData.blueshiftEventApiKey,\n 'blueshift.event-signature': initData.blueshiftEventSignature || '',\n 'blueshift.event-verification-key': initData.memberId || 0,\n isSinglePageApp: initData.isSinglePageApp,\n isNativeAppContext: initData.isNativeAppContext,\n isQuantcastConsentEnabled:\n initData.featureSwitches['quantcast-consent'],\n isTikTokPixelEnabled: initData.featureSwitches['tiktok-pixel'],\n isDigitalAudienceTrackingEnabled:\n initData.featureSwitches['digital-audience-tracking'],\n quantcastSite: initData.quantcastSite\n };\n // add split tests to datalayer\n if (initData.splitTestGroups) {\n for (const [key, value] of Object.entries(initData.splitTestGroups)) {\n initialDataLayer[`splittest_${key}`] = value;\n }\n }\n return initialDataLayer;\n};\n\nexport const buildInitialGtmDataLayerFromState = (state) => {\n const quantcastSite = isDev() ? 'beta.tradera.com' : 'www.tradera.com';\n const { environment, language, member } = state;\n const { featureSwitches } = environment;\n const isQuantcastConsentEnabled = featureSwitches['quantcast-consent'];\n const isTikTokPixelEnabled = featureSwitches['tiktok-pixel'];\n const isDigitalAudienceTrackingEnabled =\n featureSwitches['digital-audience-tracking'];\n const splitTestGroups = Object.entries(environment.splitTestGroups).reduce(\n (groups, [key, value]) => {\n return {\n ...groups,\n [`splittest_${key}`]: value\n };\n },\n {}\n );\n // ***** ATTENTION !!! *****\n // If you change anything here you must\n // also change in buildInitialGtmDataLayerFromInitData\n // so that they match. Otherwise values\n // between Touchweb and NextWeb don't match.\n return {\n memberId: member.memberId || 0,\n userLanguage: language.preferred.languageCodeIso2,\n memberEmail: member.memberEmail || '',\n memberHashedEmail: member.memberEmailSha256 || '',\n 'criteo.hashedEmail': member.memberEmailMd5 || '',\n memberFirstName: member.memberFirstName || '',\n memberLastName: member.memberLastName || '',\n memberCountry: member.memberCountry || '',\n loginState: member.isLoggedIn ? 'logged in' : 'not logged in',\n isNotInIframe: window.self === window.top,\n 'blueshift.event-api-key':\n environment.variables.PUBLIC_BLUESHIFT_EVENT_API_KEY,\n 'blueshift.event-signature': member.blueshiftEventSignature || '',\n 'blueshift.event-verification-key': member.memberId || 0,\n isSinglePageApp: true,\n isNativeAppContext: environment.isNativeAppContext,\n isQuantcastConsentEnabled,\n isDigitalAudienceTrackingEnabled,\n isTikTokPixelEnabled,\n quantcastSite,\n ...splitTestGroups\n };\n};\n","import * as Sentry from '@sentry/nextjs';\nimport { isNextJs, isServer } from 'tradera/utils/nextjs';\n\nexport const missingKeyLoggingConfig = {\n saveMissing: true,\n saveMissingTo: 'current',\n missingKeyHandler: (\n language,\n namespace,\n key,\n _fallbackValue,\n _updateMissing,\n options\n ) => {\n if (\n !isNextJs ||\n isServer ||\n (isNextJs && !isServer && options.hasLoadedAllTranslations)\n ) {\n const errorMessage = `TranslationMissing (javascript) - Unable to find key ${key} (namespace ${namespace}) in language ${language}!`;\n Sentry.captureException(new Error(errorMessage));\n }\n },\n missingInterpolationHandler: (text, value) => {\n Sentry.captureException(\n new Error(\n `InterpolationFailure (javascript) - Unable to interpolate the text \"${text}\" fully. The following placeholder values were missing: ${JSON.stringify(\n value\n )}`\n )\n );\n return undefined;\n }\n};\n","/* eslint-disable better-mutation/no-mutation */\n\nimport i18n from 'i18next';\nimport { logger } from 'packages/logger';\nimport { initReactI18next } from 'react-i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { toLocalizedUrl } from 'tradera/utils/url';\nimport { formatNumberWithSeparators } from 'tradera/utils/format';\nimport { missingKeyLoggingConfig } from 'tradera/lang/shared-config';\nimport {\n NS_TOUCHWEB,\n NS_ATTRIBUTES,\n DEFAULT_LANGUAGE\n} from 'tradera/lang/constants.mjs';\nimport 'dayjs/locale/sv';\nimport 'dayjs/locale/da';\nimport 'dayjs/locale/de';\nimport { isServer } from 'tradera/utils/nextjs';\n\nif (isServer) {\n // Do not remove this without also removing the disable of eslint better-mutation/no-mutation at top of file.\n throw new Error(\n 'This implementation is not compatible with SSR as global properties are shared between server instances'\n );\n}\n\nlet i18nInitialized;\n\n/**\n * Initialize function for i18next\n * Must be run before doing any translations\n * @param {Array} [translations]\n * @param {Object} [options]\n * @returns {Promise} - a promise to the i18next t function\n */\nexport const bootLanguages = (\n translations = window.touchwebTranslations,\n attributeTranslations = window.attributeTranslations\n) => {\n const translationResources = Object.entries(translations).map(\n ([key, value]) => ({\n key,\n value,\n namespace: 'touchWeb'\n })\n );\n const attributeResources = Object.entries(attributeTranslations).map(\n ([key, value]) => ({ key, value, namespace: 'attributes' })\n );\n\n const resources = translationResources\n .concat(attributeResources)\n .reduce((prev, { key, value, namespace }) => {\n const s = prev[key] || {};\n s[namespace] = value;\n return {\n ...prev,\n [key]: s\n };\n }, {});\n\n i18nInitialized = i18n\n .use(initReactI18next)\n .use(LanguageDetector)\n .init(initOptions(resources), (err) => {\n if (err) {\n logger('error when loading translations', err);\n }\n });\n\n return i18nInitialized;\n};\n\nexport const initOptions = (resources) => ({\n detection: {\n order: ['htmlTag'],\n htmlTag: document.html\n },\n defaultNS: [NS_TOUCHWEB],\n ns: [NS_ATTRIBUTES],\n fallbackLng: DEFAULT_LANGUAGE,\n resources,\n debug: false,\n keySeparator: false,\n nsSeparator: ':::',\n interpolation: {\n skipOnVariables: true,\n escapeValue: false,\n format: (value, format) => {\n if (format === 'formatNumber') {\n return formatNumberWithSeparators(value);\n }\n\n return value;\n }\n },\n react: {\n useSuspense: false // loading from file currently breaks if this is true\n },\n ...missingKeyLoggingConfig\n});\n\n/**\n * This function helps you make sure that i18next init has completed before continuing\n */\nexport const whenInitialized = () => {\n if (!i18nInitialized) {\n throw new Error(\n \"Can't call boot-languages whenInitialized before init!\"\n );\n }\n return i18nInitialized.then((t) => ({\n t,\n toLocalizedUrl: (url) => toLocalizedUrl(url, i18n.language)\n }));\n};\n\n/**\n * Only required for Storybook, do not use.\n */\nexport const changeLanguage = (language) => i18n.changeLanguage(language);\n\nexport const getCurrentLanguage = () => i18n.language;\n","/* eslint-disable better-mutation/no-mutation */\n\nimport { createSlice } from '@reduxjs/toolkit';\n\ntype EnvironmentSlice = {\n isSpaNavigationEnabled?: boolean;\n featureSwitches: unknown;\n splitTestGroups: object;\n variables: object;\n environmentHash?: string;\n experiments?: unknown[];\n gaTrackingSessionId?: string;\n isHybridAppContextForAndroid?: boolean;\n isHybridAppContextForIos?: boolean;\n isNativeAppWithApplyPaySupport?: boolean;\n isNativeAppWithSwishCallbackSupport?: boolean;\n isNativeAppWithKlarnaSupport?: boolean;\n isHybridAppContext?: boolean;\n appInstanceId?: boolean;\n isIOS?: boolean;\n isNativeAppContext?: boolean;\n isMobileDevice?: boolean;\n isMobileSafari?: boolean;\n version?: string;\n};\n\nexport const initialState: EnvironmentSlice = {\n featureSwitches: {},\n splitTestGroups: {},\n variables: {}\n};\n\nconst slice = createSlice({\n name: 'environment',\n initialState,\n reducers: {\n initialize: (_state, { payload }) => {\n return { ...payload };\n },\n setEnvironmentHash: (state, { payload }) => {\n state.environmentHash = payload;\n },\n setIsSpaNavigationEnabled: (state, { payload }) => {\n state.isSpaNavigationEnabled = payload;\n },\n setExperiments: (state, { payload }) => {\n state.experiments = [...(state.experiments ?? []), payload];\n },\n setGATrackingData: (state, { payload }) => {\n state.gaTrackingSessionId = payload.sessionId;\n }\n }\n});\n\nexport const {\n initialize,\n setEnvironmentHash,\n setIsSpaNavigationEnabled,\n setExperiments,\n setGATrackingData\n} = slice.actions;\nexport const reducer = slice.reducer;\n","import ENDPOINTS from 'tradera/constants/endpoints';\nimport {\n axiosWithTokenRefresh,\n checkResponseVersion,\n finalizeResponse,\n handleError,\n utilizeCancelToken,\n axiosConfigs\n} from 'tradera/utils/api';\nimport initData from 'tradera/legacy/static/packages/init-data';\nimport { toLocalizedUrl } from 'tradera/utils/url';\nimport { getLanguage } from 'tradera/utils/language';\nimport { isServer } from 'tradera/utils/nextjs';\nimport type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\n\ntype HttpClientConfig = AxiosRequestConfig & { cancelTokenId?: string };\n\nconst ensureClientOnly = () => {\n // Cancel tokens would be shared per server instance so ensure we are not on server.\n if (isServer) {\n throw new Error('This HTTP client is only safe to use on frontend');\n }\n};\n\n// Prevents URL:s that begins with // when that was not intended.\nconst getSafeUrl = (baseUrl: string, url?: string) => {\n if (baseUrl.endsWith('/') && url?.startsWith('/')) {\n return baseUrl + url.substring(1);\n }\n return baseUrl + url;\n};\n\nconst httpClient = (baseUrl: string, shouldLocalizeUrl?: boolean) => {\n const axiosWrapper = (\n url: string | undefined,\n httpClientConfig: HttpClientConfig,\n axiosCaller: (\n axios: AxiosInstance,\n url: string,\n config: AxiosRequestConfig\n ) => Promise>\n ) => {\n const { cancelTokenId, ...axiosConfig } = httpClientConfig;\n const version = initData.version;\n if (cancelTokenId) {\n const { cancel, cancelToken } = utilizeCancelToken(cancelTokenId);\n // eslint-disable-next-line better-mutation/no-mutation\n axiosConfig.cancelToken = cancelToken;\n if (cancel) {\n cancel();\n }\n }\n const safeUrl = getSafeUrl(baseUrl, url);\n const localizedUrl = shouldLocalizeUrl\n ? toLocalizedUrl(safeUrl, getLanguage())\n : safeUrl;\n return axiosCaller(axiosWithTokenRefresh(), localizedUrl, axiosConfig)\n .then(\n version ? checkResponseVersion(version) : (response) => response\n )\n .then(finalizeResponse())\n .catch(handleError());\n };\n\n return {\n get: (\n url: string,\n httpClientConfig: HttpClientConfig = axiosConfigs.authenticated\n ) => {\n ensureClientOnly();\n return axiosWrapper(url, httpClientConfig, (axios, url, config) =>\n axios.get(url, config)\n );\n },\n post: (\n url: string,\n payload: TRequest,\n httpClientConfig: HttpClientConfig = axiosConfigs.authenticated\n ) => {\n ensureClientOnly();\n return axiosWrapper(url, httpClientConfig, (axios, url, config) =>\n axios.post, TRequest>(\n url,\n payload,\n config\n )\n );\n },\n put: (\n url: string,\n payload: TRequest,\n httpClientConfig: HttpClientConfig = axiosConfigs.authenticated\n ) => {\n ensureClientOnly();\n return axiosWrapper(url, httpClientConfig, (axios, url, config) =>\n axios.put, TRequest>(\n url,\n payload,\n config\n )\n );\n },\n delete: (\n url: string,\n httpClientConfig: HttpClientConfig = axiosConfigs.authenticated\n ) => {\n ensureClientOnly();\n return axiosWrapper(url, httpClientConfig, (axios, url, config) =>\n axios.delete(url, config)\n );\n },\n request: (\n config: AxiosRequestConfig,\n httpClientConfig: HttpClientConfig = axiosConfigs.authenticated\n ) => {\n ensureClientOnly();\n return axiosWrapper(\n config.url,\n httpClientConfig,\n (axios, url, enhancedConfig) => {\n return axios.request({ ...config, ...enhancedConfig, url });\n }\n );\n }\n };\n};\n\ntype UnpackResponse = (\n value: { data: unknown; status: number } | Error\n) => unknown;\n\nconst trpcClient = (endpoint: string) => {\n const client = httpClient(`/api/${endpoint}`, false);\n const unpackResponse: UnpackResponse = (response) => {\n if (typeof response === 'object' && 'data' in response) {\n return response.data;\n }\n };\n return {\n command: (\n commandName: string,\n payload: unknown,\n httpClientConfig: HttpClientConfig\n ) =>\n client\n .post(`/commands/${commandName}`, payload, httpClientConfig)\n .then(unpackResponse),\n query: (queryName: string, httpClientConfig: HttpClientConfig) =>\n client\n .get(`/queries/${queryName}`, httpClientConfig)\n .then(unpackResponse)\n };\n};\n\nexport const defaultClient = httpClient('');\nexport const touchWebClient = httpClient('/', true);\nexport const webApiClient = httpClient(ENDPOINTS.WEB_API, false);\nexport const cmsApiClient = httpClient('/api/cms');\nexport const marketingApiClient = httpClient(ENDPOINTS.MARKETING_PUBLIC_API);\nexport const memberIdentificationClient = trpcClient('member-identification');\nexport const translationDynamicApiClient = trpcClient(\n 'translation-dynamic-api'\n);\nexport const shippingRecommendationsClient = trpcClient(\n 'shipping-recommendations'\n);\n","export function isDev() {\n return process?.env?.NODE_ENV !== 'production';\n}\n","import { DEFAULT_LANGUAGE } from 'tradera/lang/constants.mjs';\nimport type { RootState } from '../configure-store';\n\nexport const selectAvailableLanguages = (state: RootState) =>\n state.language.available;\n\nexport const selectAvailableLanguageCodesIso2 = (state: RootState) =>\n state.language.available?.map((x) => x.languageCodeIso2);\n\nexport const selectPreferredLanguage = (state: RootState) =>\n state.language.preferred;\n\nexport const selectPreferredLanguageCode = (state: RootState) =>\n state.language.preferred?.languageCodeIso2 || DEFAULT_LANGUAGE;\n\nexport const selectLocale = (state: RootState) => {\n const language = selectPreferredLanguageCode(state);\n const country = state.language.memberCountryCodeIso2 || 'SE';\n\n return `${language}-${country}`;\n};\n\nexport const selectIsForeignLanguageActivated = (state: RootState) =>\n selectPreferredLanguage(state)?.languageCodeIso2 !== DEFAULT_LANGUAGE;\n\nexport const selectAutomaticTranslationPreference = (\n state: RootState\n): boolean => state.language.automaticTranslationPreference ?? true;\n","export const isSwedishOrUndefined = (languageCodeIso2) =>\n languageCodeIso2 === undefined || languageCodeIso2.toLowerCase() === 'sv';\n\nexport const getLanguageFromCountryCode = (\n countryCodeIso2,\n isFrenchDutchSelectable = false\n) => {\n const key = countryCodeIso2?.toLowerCase() || 'se';\n const languageMap = {\n se: 'sv',\n dk: 'da',\n de: 'de',\n fr: isFrenchDutchSelectable && 'fr',\n nl: isFrenchDutchSelectable && 'nl'\n };\n return languageMap[key] || 'en';\n};\n\nexport const getCountryCodeForFlagFromLanguage = (languageCode) => {\n const key = languageCode?.toLowerCase() || 'sv';\n const countryMap = {\n en: 'gb', // We default to GB which isn't strictly correct\n da: 'dk',\n de: 'de',\n fr: 'fr',\n nl: 'nl'\n };\n return countryMap[key] || 'se';\n};\n\nexport const getCountryCodeFromLanguage = (languageCode) => {\n const key = languageCode?.toLowerCase() || 'sv';\n const countryMap = {\n da: 'dk',\n de: 'de',\n fr: 'fr',\n nl: 'nl'\n };\n return countryMap[key] || 'se';\n};\n\nexport const areLanguageCodesIso2Equal = (first, second) =>\n (first || 'SV').toUpperCase() === (second || 'SV').toUpperCase();\n","import { useCallback } from 'react';\nimport { useCurrentLanguage } from 'tradera/lang/translate';\nimport { useSelector } from 'react-redux';\nimport { selectPreferredCurrency } from 'tradera/state/multi-currency/selectors';\nimport type {\n OverrideFormatPriceOptions,\n Price\n} from 'tradera/localization/format-price';\nimport { formatPrice } from 'tradera/localization/format-price';\n\nexport type Currency = {\n code: string;\n decimals: number;\n rate: number;\n};\n\n/**\n * Formats a price in the current language and currency.\n */\nexport const useLocalizedPriceFormatter = () => _useLocalizedPriceFormatter();\n\n/**\n * Same as useLocalizedPriceFormatter but it always rounds up. Needed for fixed prices,\n * so we never display a price that is lower than what the user will pay in the end.\n */\nexport const useLocalizedPriceFormatterRoundingUp = () =>\n _useLocalizedPriceFormatter({ roundUp: true });\n\n/**\n * Does not convert anything. If you for some reason are working with the local currency\n * it could be used but avoid it. Example of usage: in the bid-modal we want to display\n * the exact amount that was input\n */\nexport const useLocalizedPriceFormatterNoConversion = () =>\n _useLocalizedPriceFormatter({ conversion: false });\n\n/**\n * Makes the conversion but leaves the symbol. Used to compare local amounts to make a\n * decision in the code.\n */\nexport const useLocalizedPriceFormatterNoSymbol = () =>\n _useLocalizedPriceFormatter({ style: 'decimal' });\n\n/**\n * Formats a price in the current language and currency but forces the value to be\n * rendered using up to two decimals, even for currencies which are normally without\n * decimals.\n */\nexport const useLocalizedPriceFormatterAllowFractions = () =>\n _useLocalizedPriceFormatter({ allowFractions: true });\n\ntype LocalizedPriceFormatterOptions = {\n allowFractions?: boolean;\n conversion?: boolean;\n roundUp?: OverrideFormatPriceOptions['roundUp'];\n style?: OverrideFormatPriceOptions['style'];\n};\n\n/**\n * Internal to this module, needed to limit the scope of the API.\n */\nconst _useLocalizedPriceFormatter = ({\n conversion = true,\n style,\n roundUp,\n allowFractions\n}: LocalizedPriceFormatterOptions = {}) => {\n const { language } = useCurrentLanguage();\n const preferredCurrency: Currency = useSelector(selectPreferredCurrency);\n\n return useCallback(\n (price: Price) =>\n formatPrice(\n conversion ? preferredCurrency.rate * Number(price) : price,\n language,\n {\n currency: preferredCurrency.code,\n minimumFractionDigits: preferredCurrency.decimals,\n maximumFractionDigits: allowFractions\n ? 2\n : preferredCurrency.decimals,\n ...(style ? { style } : {}),\n ...(roundUp ? { roundUp } : {})\n }\n ),\n [\n conversion,\n language,\n preferredCurrency,\n roundUp,\n style,\n allowFractions\n ]\n );\n};\n","import { selectShippingRegionCountryCodeIso2 } from 'tradera/state/shipping-region/selectors';\nimport { areCountryCodesIso2Equal } from 'tradera/localization/countrycode';\nimport type { RootState } from '../configure-store';\n\nexport const selectMember = (state: RootState) => state.member;\n\nexport const selectIsLoggedIn = (state: RootState) => state.member?.isLoggedIn;\n\nexport const selectGeolocation = (state: RootState) =>\n state.member?.geolocation;\n\nexport const selectMemberId = (state: RootState) => state.member?.memberId;\n\nexport const selectMemberAlias = (state: RootState) =>\n state.member?.memberAlias;\n\nexport const selectMemberEmail = (state: RootState) =>\n state.member?.memberEmail;\n\nexport const selectMemberFirstName = (state: RootState) =>\n state.member?.memberFirstName;\n\nexport const selectMemberLastName = (state: RootState) =>\n state.member?.memberLastName;\n\nexport const selectCurrencyCode = (state: RootState) =>\n state.member?.currencyCode;\n\nexport const selectMemberCountryCodeIso2 = (state: RootState) =>\n state.member?.memberCountryCodeIso2;\n\nexport const selectIsOutsideSweden = (state: RootState) =>\n state.member?.geolocation?.isoCode &&\n state.member?.geolocation?.isoCode.toLowerCase() !== 'se';\n\nexport const showDanishFromCountry = (state: RootState) => {\n const fromCountry =\n selectShippingRegionCountryCodeIso2(state) ||\n selectMemberCountryCodeIso2(state);\n return areCountryCodesIso2Equal(fromCountry, 'DK');\n};\n\nexport const selectMemberTown = (state: RootState) => state.member?.memberTown;\n","import {\n CATEGORIZED_COOKIES,\n COOKIE_DEFAULT_CATEGORY\n} from 'tradera/constants/cookies';\nimport { GdprSettings } from 'tradera/utils/gdpr-settings';\nimport { logger } from 'packages/logger';\nimport { isServer } from 'tradera/utils/nextjs';\nimport { getCookieFromBrowser, setCookieToBrowser } from './cookie-helpers';\n\nexport class CookieUtil {\n constructor(getCookie, setCookie) {\n if (!getCookie || !setCookie) {\n throw new Error('You must provide getCookie and setCookie');\n }\n this.getCookie = getCookie;\n this.setCookie = setCookie;\n this.gdpr = new GdprSettings(getCookie, setCookie);\n }\n\n segment(name, value) {\n return value ? '; ' + name + '=' + value : '';\n }\n\n convertToExpiresStr(expires) {\n let expiresStr = '';\n\n switch (expires.constructor) {\n case Number:\n expiresStr =\n expires === Infinity\n ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT'\n : '; max-age=' + expires * 24 * 60 * 60;\n break;\n case String:\n expiresStr = '; expires=' + expires;\n break;\n case Date:\n expiresStr = '; expires=' + expires.toUTCString();\n break;\n }\n\n return expiresStr;\n }\n\n createCookie(cookieKey, cookieValue, expires, path, domain, secure) {\n let expiresStr = '';\n\n if (\n !cookieKey ||\n /^(?:expires|max-age|path|domain|secure)$/i.test(cookieKey)\n ) {\n return false;\n }\n\n // check gdpr for cookie category\n let category = CATEGORIZED_COOKIES[cookieKey];\n if (typeof category === 'undefined') {\n logger(`No category set for cookie ${cookieKey}`);\n category = COOKIE_DEFAULT_CATEGORY;\n }\n if (!this.gdpr.isCategoryEnabled(category)) {\n // console.info(\n // `Cookie category not enabled: ${cookieKey}, category: ${category}`\n // );\n return false;\n }\n\n // if expired set prepare date string\n if (expires) {\n expiresStr = this.convertToExpiresStr(expires);\n }\n\n if (isServer) {\n throw new Error('Setting cookie is not supported on the server');\n }\n\n this.setCookie(\n encodeURIComponent(cookieKey) +\n '=' +\n encodeURIComponent(cookieValue) +\n expiresStr +\n this.segment('domain', domain) +\n this.segment('path', path || '/') +\n (location.protocol == 'https:' || secure ? '; secure' : '')\n );\n\n return true;\n }\n\n readCookie(key) {\n return this.getCookie(key);\n }\n\n hasCookie(key) {\n return typeof this.readCookie(key) === 'string';\n }\n\n eraseCookie(key, path, domain) {\n if (!key || !this.hasCookie(key)) {\n return false;\n }\n\n if (isServer) {\n throw new Error('Setting cookie is not supported on the server');\n }\n\n this.setCookie(\n encodeURIComponent(key) +\n '=; expires=Thu, 01 Jan 1970 00:00:01 GMT' +\n this.segment('domain', domain) +\n this.segment('path', path || '/')\n );\n\n return true;\n }\n}\n\nexport default new CookieUtil(getCookieFromBrowser, setCookieToBrowser);\n","export const parseAppVersion = (version) => {\n const [major = 0, minor = 0, patch = 0] = String(version)\n .split('.')\n .map(Number)\n .filter((number) => !Number.isNaN(number));\n return { major, minor, patch };\n};\n\nexport const isSupportedMinimumVersion = (\n appVersionString,\n minimumVersionString\n) => {\n const appVersion = parseAppVersion(appVersionString);\n const minimumVersion = parseAppVersion(minimumVersionString);\n if (appVersion.major > minimumVersion.major) {\n return true;\n }\n if (appVersion.major === minimumVersion.major) {\n if (appVersion.minor > minimumVersion.minor) {\n return true;\n }\n if (appVersion.minor === minimumVersion.minor) {\n if (appVersion.patch >= minimumVersion.patch) {\n return true;\n }\n }\n }\n\n return false;\n};\n","import { isSupportedMinimumVersion } from 'tradera/utils/versions';\n\nexport const getNativeAppSupport = ({\n isNativeAppContext,\n isHybridAppContext,\n hybridAppDevice,\n hybridAppVersion,\n appOsVersion,\n isIOS,\n isAndroid\n}) => {\n const isHybridAppContextForAndroid = Boolean(\n isHybridAppContext &&\n (hybridAppDevice?.toLowerCase().includes('android') || isAndroid)\n );\n const isHybridAppContextForIos = Boolean(\n isHybridAppContext &&\n (hybridAppDevice?.toLowerCase().includes('iphone') ||\n hybridAppDevice?.toLowerCase().includes('ipad') ||\n isIOS)\n );\n const isIos13 =\n isNativeAppContext &&\n isHybridAppContextForIos &&\n isSupportedMinimumVersion(appOsVersion, '13');\n return {\n isHybridAppContextForAndroid,\n isHybridAppContextForIos,\n isNativeAppWithApplyPaySupport:\n isIos13 && isSupportedMinimumVersion(hybridAppVersion, '3.51'),\n isNativeAppWithSwishCallbackSupport:\n isIos13 && isSupportedMinimumVersion(hybridAppVersion, '3.57'),\n isNativeAppWithKlarnaSupport:\n isNativeAppContext &&\n ((isIOS && isSupportedMinimumVersion(hybridAppVersion, '3.68')) ||\n (isAndroid &&\n isSupportedMinimumVersion(hybridAppVersion, '3.58')))\n };\n};\n","import { getSelectorsByUserAgent } from 'react-device-detect';\nimport { BREAKPOINTS, BREAKPOINT_SIZES } from 'tradera/constants/breakpoints';\n\nexport const DEFAULT_USER_AGENT =\n 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1';\n\n// We have more Google bot mainly uses mobile\nconst FALLBACK_DEVICE_TYPE = 'mobile';\n\nconst DEFAULT_BREAKPOINT_WIDTH = {\n [BREAKPOINTS.XS]: 375, // iPhone 6, 7, 8, X, 11 X/Xs/Pro\n [BREAKPOINTS.SM]: 600, // For most common Tablet width in range\n [BREAKPOINTS.MD]: BREAKPOINT_SIZES.MD.min, // Tablet\n [BREAKPOINTS.LG]: BREAKPOINT_SIZES.LG.min,\n [BREAKPOINTS.XL]: BREAKPOINT_SIZES.XL.min // For most common 1280px desktop\n};\n\nconst getDeviceTypeFromUserAgent = (userAgent) => {\n const selector = getSelectorsByUserAgent(userAgent || DEFAULT_USER_AGENT);\n\n if (selector?.deviceType) {\n return selector.deviceType;\n }\n\n return FALLBACK_DEVICE_TYPE;\n};\n\nconst getBreakpointFromUserAgent = (userAgent) => {\n const deviceType = getDeviceTypeFromUserAgent(userAgent);\n\n // For possible values, see: https://github.com/faisalman/ua-parser-js#methods\n switch (deviceType) {\n case 'wearable': // Smartwatch\n case 'mobile':\n return BREAKPOINTS.XS;\n case 'tablet':\n return BREAKPOINTS.MD;\n case 'smarttv':\n case 'console': // Xbox/Playstation\n case 'embedded': // Tesla\n default:\n // Desktop\n return BREAKPOINTS.XL;\n }\n};\n\nconst getViewportWidthFromUserAgent = (userAgent) => {\n const breakpoint = getBreakpointFromUserAgent(userAgent);\n return DEFAULT_BREAKPOINT_WIDTH[breakpoint];\n};\n\nexport const getViewportWidth = ({ cookies, headers }) => {\n if (cookies['viewport-width']) {\n return parseInt(cookies['viewport-width'], 10);\n }\n\n // Note: The viewport-width headers does not follow spec. The width is\n // usually in physical screen pixels instead of viewport CSS pixels.\n const headersViewport = parseInt(\n headers['viewport-width'] || headers['sec-ch-viewport-width'],\n 10\n );\n if (headersViewport) {\n return headersViewport;\n }\n\n const userAgentViewport = getViewportWidthFromUserAgent(\n headers['user-agent']\n );\n return userAgentViewport;\n};\n","import {\n isAndroid,\n isMobile,\n isMobileSafari,\n isIOS,\n getSelectorsByUserAgent\n} from 'react-device-detect';\nimport { nullifyUndefinedProperties } from 'tradera/utils/object';\nimport { isServer } from 'tradera/utils/nextjs';\nimport { getNativeAppSupport } from './native-app-support';\nimport { DEFAULT_USER_AGENT } from 'tradera/apps/nextweb/utils/viewport';\n\nexport const getInitialServerState = ({\n environmentHash,\n experiments = [],\n featureToggles = {},\n splitTestGroups = {},\n variables = {},\n version,\n userAgent,\n appOsVersion = '',\n hybridAppDevice = '',\n hybridAppVersion = '',\n isNativeAppContext = false,\n isHybridAppContext = false,\n appInstanceId = '',\n gaTrackingSessionId = ''\n} = {}) => {\n const { isMobile, isMobileSafari, isIOS, browserName } =\n getSelectorsByUserAgent(userAgent || DEFAULT_USER_AGENT);\n\n return {\n ...getNativeAppSupport({\n isNativeAppContext,\n isHybridAppContext,\n hybridAppDevice,\n hybridAppVersion,\n appOsVersion,\n isIOS,\n isAndroid\n }),\n browserName,\n isNativeAppContext,\n hybridAppVersion,\n environment: process.env.NODE_ENV,\n experiments,\n isHybridAppContext,\n isIOS,\n isMobileDevice: isMobile,\n isMobileSafari,\n isSpaNavigationEnabled: true,\n featureSwitches: featureToggles,\n splitTestGroups,\n variables,\n environmentHash,\n version,\n appInstanceId,\n gaTrackingSessionId\n // TODO: Fetch values for below\n // splitTests,\n };\n};\n\nexport const initEnvironment = () => {\n return nullifyUndefinedProperties({});\n};\n\nexport default ({\n appOsVersion,\n environment,\n environmentHash,\n experiments,\n featureSwitches,\n googleAnalyticsTrackingId,\n googleAnalyticsMeasurementId,\n geoPublicApiBaseUrl,\n hybridAppDevice,\n hybridAppVersion,\n isHybridAppContext,\n isNativeAppContext,\n isSinglePageApp,\n splitTests,\n splitTestGroups,\n version,\n webLiveUrl,\n appInstanceId,\n gaTrackingSessionId\n}) => {\n return nullifyUndefinedProperties({\n ...getNativeAppSupport({\n isNativeAppContext,\n isHybridAppContext,\n hybridAppDevice,\n hybridAppVersion,\n appOsVersion,\n isIOS,\n isAndroid\n }),\n environment,\n experiments,\n featureSwitches,\n environmentHash,\n isHybridAppContext,\n appInstanceId,\n isIOS,\n isNativeAppContext,\n isMobileDevice: isMobile,\n isMobileSafari,\n isSpaNavigationEnabled:\n !isServer &&\n isSinglePageApp &&\n !isHybridAppContext &&\n !window.frameElement\n ? true\n : false, // No SPA navigation in native apps or iFrame\n splitTests,\n splitTestGroups,\n variables: {\n // Names must be the same as NextWeb's .env variables\n PUBLIC_GOOGLE_ANALYTICS_TRACKING_ID: googleAnalyticsTrackingId,\n PUBLIC_GOOGLE_ANALYTICS_MEASUREMENT_ID:\n googleAnalyticsMeasurementId,\n PUBLIC_GEO_PUBLIC_API_BASE_URL: geoPublicApiBaseUrl,\n PUBLIC_WEB_LIVE_URL: webLiveUrl\n },\n version,\n gaTrackingSessionId\n });\n};\n","import cookie from 'cookie';\nimport { addCookie } from 'tradera-backend/utils/cookies';\nimport { NATIVE_APP_ENVIRONMENT } from 'tradera/constants/cookies';\n\nconst NATIVE_APP_COOKIE_AND_HEADER_CONFIG = {\n osVersion: {\n header: 'x-tradera-app-os-version',\n initDataName: 'nativeAppOsVersion'\n },\n appDevice: {\n header: 'x-tradera-app-device',\n initDataName: 'nativeAppDevice'\n },\n appVersion: {\n header: 'x-tradera-app-version',\n initDataName: 'nativeAppVersion'\n },\n appContext: { header: 'x-tradera-app', initDataName: 'nativeAppContext' },\n appLanguage: {\n header: 'x-language',\n initDataName: 'nativeAppLanguage'\n },\n appInstanceId: {\n header: 'X-Tradera-App-GA-App-Instance-Id',\n initDataName: 'nativeAppInstanceId'\n }\n};\n\nconst createCookie = (name, value) => {\n const options = {\n httpOnly: false,\n path: '/'\n };\n return cookie.serialize(name, String(value), options);\n};\n\nconst isString = (s) => typeof s === 'string';\n\nexport const createNativeAppCookieValue = (nativeAppInfo) => {\n const valueObject = Object.fromEntries(\n Object.entries(nativeAppInfo).filter(\n ([key, value]) =>\n key in NATIVE_APP_COOKIE_AND_HEADER_CONFIG && isString(value)\n )\n );\n return JSON.stringify(valueObject);\n};\n\nexport const createNativeAppCookie = (nativeAppInfo) => {\n return createCookie(\n NATIVE_APP_ENVIRONMENT,\n createNativeAppCookieValue(nativeAppInfo)\n );\n};\n\n/**\n * Gets info about the native app if in native app context.\n * The function also updates a cookie with the same information\n * to be used for later calls to this function if the headers are\n * not present.\n *\n * @param {*} req\n * @param {*} res\n * @returns An object with these properties: {\n osVersion,\n appDevice,\n appVersion,\n appContext\n }\n */\nexport const getAndUpdateNativeAppInfo = (req, res) => {\n const nativeAppInfoFromHeaders = extractNativeAppInfoFromHeaders(\n req.headers\n );\n\n const hasAppHeaders =\n Object.values(nativeAppInfoFromHeaders).filter(Boolean).length > 0;\n if (hasAppHeaders) {\n const cookie = createNativeAppCookie(nativeAppInfoFromHeaders);\n addCookie(res, cookie);\n return nativeAppInfoFromHeaders;\n }\n\n const nativeAppInfoFromCookie = extractNativeAppInfoFromCookie(\n req.cookies[NATIVE_APP_ENVIRONMENT]\n );\n return nativeAppInfoFromCookie;\n};\n\nexport const extractNativeAppInfoFromCookie = (nativeAppCookieString) =>\n nativeAppCookieString\n ? Object.fromEntries(\n Object.entries(\n JSON.parse(decodeURIComponent(nativeAppCookieString))\n ).filter(([key]) => key in NATIVE_APP_COOKIE_AND_HEADER_CONFIG)\n )\n : {};\nexport const extractNativeAppInfoFromHeaders = (headers) => {\n return Object.entries(NATIVE_APP_COOKIE_AND_HEADER_CONFIG).reduce(\n (obj, [key, config]) => {\n obj[key] = headers[config.header] || '';\n return obj;\n },\n {}\n );\n};\n\nexport const extractNativeAppInfoFromInitData = (initData) => {\n return Object.entries(NATIVE_APP_COOKIE_AND_HEADER_CONFIG).reduce(\n (obj, [key, config]) => {\n obj[key] = initData[config.initDataName] || '';\n return obj;\n },\n {}\n );\n};\n","import axios from 'axios';\nimport { selectPreferredLanguageCode } from 'tradera/state/language/selectors';\nimport { toLocalizedUrl } from 'tradera/utils/url';\nimport {\n initialize,\n setEnvironmentHash,\n setIsSpaNavigationEnabled,\n setExperiments,\n setGATrackingData\n} from './reducer';\nimport { isNextJs } from 'tradera/utils/nextjs';\nimport { selectMemberId } from 'tradera/state/member/selectors';\nimport getInitialState from './initial-state';\nimport {\n createNativeAppCookieValue,\n extractNativeAppInfoFromCookie,\n extractNativeAppInfoFromInitData\n} from './native-app-info-helper';\nimport cookie from 'tradera/utils/cookie';\nimport { NATIVE_APP_ENVIRONMENT } from 'tradera/constants/cookies';\nimport { GtmService as gtm } from 'tradera/services/google-tagmanager-service';\n\nconst getVersionUrl = (getState) => {\n if (isNextJs) {\n const queryParameters = new URLSearchParams({ next: 1 });\n const memberId = selectMemberId(getState());\n if (memberId) {\n queryParameters.set('memberId', memberId);\n }\n return `/api/version?${queryParameters}`;\n }\n\n const preferredLanguageCode = selectPreferredLanguageCode(getState());\n\n return toLocalizedUrl('/ping', preferredLanguageCode);\n};\n\nexport const updateEnvironmentHash = () => async (dispatch, getState) => {\n const url = getVersionUrl(getState);\n const response = await axios.get(url);\n const environmentHash = response.headers['x-tradera-environment'];\n const current = getState().environment.environmentHash;\n if (environmentHash !== current) {\n dispatch(setEnvironmentHash(environmentHash));\n dispatch(setIsSpaNavigationEnabled(false));\n }\n};\n\nconst getAndUpdateNativeAppInfo = (initData) => {\n const nativeAppInfoFromInitData =\n extractNativeAppInfoFromInitData(initData);\n const hasAnyValidProperties =\n Object.values(nativeAppInfoFromInitData).filter(Boolean).length > 0;\n if (hasAnyValidProperties) {\n const nativeAppCookieValue = createNativeAppCookieValue(\n nativeAppInfoFromInitData\n );\n cookie.createCookie(NATIVE_APP_ENVIRONMENT, nativeAppCookieValue);\n return nativeAppInfoFromInitData;\n }\n\n const cookieValue = cookie.readCookie(NATIVE_APP_ENVIRONMENT);\n const nativeAppInfo = extractNativeAppInfoFromCookie(cookieValue);\n return nativeAppInfo;\n};\n\nconst getFrontendExperiments = () => (dispatch) => {\n const optimizeCallback = (variant, id) => {\n const experiment = {\n id,\n variant: parseInt(variant)\n };\n dispatch(setExperiments(experiment));\n };\n\n gtm.pushArguments('event', 'optimize.callback', {\n callback: optimizeCallback\n });\n};\n\nexport const setupGATrackingData = () => (dispatch, getState) => {\n const {\n environment: { variables }\n } = getState();\n const { PUBLIC_GOOGLE_ANALYTICS_MEASUREMENT_ID } = variables;\n\n gtm.pushArguments(\n 'get',\n PUBLIC_GOOGLE_ANALYTICS_MEASUREMENT_ID,\n 'session_id',\n (sessionId) => {\n dispatch(setGATrackingData({ sessionId }));\n }\n );\n};\n\nexport const initEnvironment = (initData) => async (dispatch) => {\n const { osVersion, appDevice, appVersion, appContext, appInstanceId } =\n getAndUpdateNativeAppInfo(initData);\n\n const {\n environment,\n environmentHash,\n experiments = [],\n featureSwitches,\n googleAnalyticsTrackingId,\n googleAnalyticsMeasurementId,\n geoPublicApiBaseUrl,\n isSinglePageApp,\n splitTests,\n splitTestGroups,\n version,\n webLiveUrl\n } = initData;\n const initialState = getInitialState({\n appOsVersion: osVersion,\n experiments,\n environment,\n environmentHash,\n featureSwitches,\n googleAnalyticsTrackingId,\n googleAnalyticsMeasurementId,\n geoPublicApiBaseUrl,\n hybridAppDevice: appDevice,\n hybridAppVersion: appVersion,\n appInstanceId,\n isNativeAppContext: appContext === 'Native',\n isHybridAppContext: Boolean(appContext),\n isSinglePageApp,\n splitTests,\n splitTestGroups,\n version,\n webLiveUrl\n });\n dispatch(initialize(initialState));\n dispatch(getFrontendExperiments());\n dispatch(setupGATrackingData());\n};\n","export const selectPageType = (state) => state.page?.type;\n","'client';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n// This is a cleaned-up ES6 copy of the next/link component without prefetch from:\n// https://github.com/vercel/next.js/blob/v12.2.5/packages/next/client/link.tsx\n// This component was mainly copied to completely disable prefetch on link mouse-over\n// Update this component if needed when updating Next.js\n\nimport React from 'react';\nimport type { NextRouter } from 'next/dist/shared/lib/router/router';\nimport { isLocalURL, resolveHref } from 'next/dist/shared/lib/router/router';\nimport { addLocale } from 'next/dist/client/add-locale';\nimport { RouterContext } from 'next/dist/shared/lib/router-context';\nimport type { AppRouterInstance } from 'next/dist/shared/lib/app-router-context';\nimport { AppRouterContext } from 'next/dist/shared/lib/app-router-context';\nimport { getDomainLocale } from 'next/dist/client/get-domain-locale';\nimport { addBasePath } from 'next/dist/client/add-base-path';\n\nfunction isModifiedEvent(event: React.MouseEvent): boolean {\n const { target } = event.currentTarget as HTMLAnchorElement;\n return (\n (target && target !== '_self') ||\n event.metaKey || // open in new tab on macOS\n event.ctrlKey || // right-click on macOS, open in new tab on Windows\n event.shiftKey || // open in new window\n event.altKey || // triggers resource download\n (event.nativeEvent && event.nativeEvent.which === 2)\n );\n}\n\nfunction linkClicked(\n e: React.MouseEvent,\n router: NextRouter | AppRouterInstance,\n href: string,\n as: string,\n replace?: boolean,\n shallow?: boolean,\n scroll?: boolean,\n locale?: string | false,\n isAppRouter?: boolean\n) {\n const { nodeName } = e.currentTarget;\n // anchors inside an svg have a lowercase nodeName\n const isAnchorNodeName = nodeName.toUpperCase() === 'A';\n if (isAnchorNodeName && (isModifiedEvent(e) || !isLocalURL(href))) {\n // ignore click for browser’s default behavior\n return;\n }\n e.preventDefault();\n\n const navigate = () => {\n // If the router is an NextRouter instance it will have `beforePopState`\n if ('beforePopState' in router) {\n router[replace ? 'replace' : 'push'](href, as, {\n shallow,\n locale,\n scroll\n });\n } else {\n // If `beforePopState` doesn't exist on the router it's the AppRouter.\n const method: keyof AppRouterInstance = replace\n ? 'replace'\n : 'push';\n\n router[method](href, { forceOptimisticNavigation: false });\n }\n };\n\n if (isAppRouter) {\n React.startTransition(navigate);\n } else {\n navigate();\n }\n}\n\ntype InternalLinkProps = {\n href: string;\n as?: string;\n replace?: boolean;\n\n /**\n * TODO-APP\n */\n scroll?: boolean;\n shallow?: boolean;\n passHref?: boolean;\n prefetch?: boolean;\n locale?: string | false;\n legacyBehavior?: boolean;\n // e: any because as it would otherwise overlap with existing types\n /**\n * requires experimental.newNextLinkBehavior\n */\n onMouseEnter?: (e: any) => void;\n // e: any because as it would otherwise overlap with existing types\n /**\n * requires experimental.newNextLinkBehavior\n */\n onTouchStart?: (e: any) => void;\n // e: any because as it would otherwise overlap with existing types\n /**\n * requires experimental.newNextLinkBehavior\n */\n onClick?: (e: any) => void;\n children: React.ReactNode;\n};\n\nexport const NextLink = React.forwardRef(function LinkComponent(\n props: InternalLinkProps,\n forwardedRef\n) {\n const {\n href: hrefProp,\n as: asProp,\n children,\n passHref,\n replace,\n shallow,\n scroll,\n locale,\n onClick,\n onMouseEnter,\n onTouchStart,\n ...restProps\n } = props;\n let router = React.useContext(RouterContext);\n const appRouter = React.useContext(AppRouterContext) as any;\n if (appRouter) {\n router = appRouter;\n }\n const { href, as } = React.useMemo(() => {\n const [resolvedHref, resolvedAs] = resolveHref(\n router,\n hrefProp,\n true\n ) as unknown as [string, string];\n return {\n href: resolvedHref,\n as: asProp\n ? resolveHref(router, asProp)\n : resolvedAs || resolvedHref\n };\n }, [router, hrefProp, asProp]);\n\n const childProps: {\n onTouchStart: React.TouchEventHandler;\n onMouseEnter: React.MouseEventHandler;\n onClick: React.MouseEventHandler;\n href?: string;\n ref?: any;\n } = {\n ref: forwardedRef,\n onClick: (e) => {\n if (process.env.NODE_ENV !== 'production') {\n if (!e) {\n throw new Error(\n `Component rendered inside next/link has to pass click event to \"onClick\" prop.`\n );\n }\n }\n if (typeof onClick === 'function') {\n onClick(e);\n }\n if (!e.defaultPrevented) {\n linkClicked(\n e,\n router,\n href,\n as,\n replace,\n shallow,\n scroll,\n locale,\n Boolean(appRouter)\n );\n }\n },\n onMouseEnter: (e) => {\n if (typeof onMouseEnter === 'function') {\n onMouseEnter(e);\n }\n },\n onTouchStart: (e) => {\n if (typeof onTouchStart === 'function') {\n onTouchStart(e);\n }\n }\n };\n\n // If child is an tag and doesn't have a href attribute, or if the 'passHref' property is\n // defined, we specify the current 'href', so that repetition is not needed by the user\n if (passHref) {\n const curLocale =\n typeof locale !== 'undefined' ? locale : router && router.locale;\n // we only render domain locales if we are currently on a domain locale\n // so that locale links are still visitable in development/preview envs\n const localeDomain =\n router &&\n router.isLocaleDomain &&\n getDomainLocale(\n as,\n curLocale,\n router.locales,\n router.domainLocales\n );\n childProps.href =\n localeDomain ||\n addBasePath(\n addLocale(as, curLocale, router && router.defaultLocale)\n );\n }\n\n return React.createElement(\n 'a',\n Object.assign({}, restProps, childProps),\n children\n );\n});\n","import { useSelector } from 'react-redux';\nimport { URL_LANGUAGES } from 'tradera/lang/constants.mjs';\nimport { type RootState } from 'tradera/state/configure-store';\nimport { selectFeatureSwitches } from 'tradera/state/environment/selectors';\n\nexport const NEXTWEB_PATHS = [\n '/brands',\n '/how-to-buy',\n '/how-to-sell',\n '/verify/kyc-questionnaire'\n];\n\nconst PATH_PREFIX = `(/(${URL_LANGUAGES.join('|')}))?`;\nconst vipPathRegex = new RegExp(`${PATH_PREFIX}/item/[0-9]+/([0-9]+)/`);\nconst isVipLink = (pathname: string) => vipPathRegex.test(pathname);\n\nconst categoryPathRegex = new RegExp(`${PATH_PREFIX}/category/([0-9]+)`);\nconst isCategoryLink = (pathname: string) => categoryPathRegex.test(pathname);\n\nconst searchPathRegex = new RegExp(`${PATH_PREFIX}/search\\\\?q=.*`);\nconst isSearchLink = (pathname: string) => searchPathRegex.test(pathname);\n\nconst startPagePathRegex = new RegExp(`^${PATH_PREFIX}/?$`);\nconst isStartPageLink = (pathname: string) => startPagePathRegex.test(pathname);\n\nconst isLinkToNextWebPage = (url: URL) =>\n url.searchParams.get('next') === '1' ||\n NEXTWEB_PATHS.some((nextwebPath) => url.pathname.endsWith(nextwebPath));\n\nconst isLastDigitEnabled = (digits: string, enabledDigits: Array) =>\n enabledDigits.includes(digits.slice(-1));\n\nconst isIn99Percent = (itemId: string) => {\n const lastTwoNumbers = itemId.slice(-2);\n const percent = parseInt(lastTwoNumbers);\n return percent > 0;\n};\n\nexport const useNextWebSpaLink = (absoluteUrl: URL) => {\n const toggles = useSelector(selectFeatureSwitches) || {};\n const cookies = useSelector | null>(\n (state) => state.request?.cookies\n );\n const pathname = absoluteUrl?.pathname;\n\n if (isStartPageLink(pathname)) {\n if (toggles['next-web-start-page-100-percent']) {\n return true;\n }\n const bucket = cookies?.['experiment_bucket'];\n return (\n toggles['next-web-start-page-10-percent'] &&\n bucket &&\n isLastDigitEnabled(bucket, ['1'])\n );\n }\n\n if (isVipLink(pathname)) {\n if (toggles['next-web-vip-100-percent']) {\n return true;\n }\n const itemId = pathname.match(vipPathRegex)?.[3] || '';\n if (toggles['next-web-vip-99-percent']) {\n return isIn99Percent(itemId);\n }\n if (toggles['next-web-vip-30-percent']) {\n return isLastDigitEnabled(itemId, ['1', '2', '3']);\n }\n if (toggles['next-web-vip-10-percent']) {\n return isLastDigitEnabled(itemId, ['1']);\n }\n }\n\n if (isCategoryLink(pathname)) {\n if (toggles['next-web-category-100-percent']) {\n return true;\n }\n const categoryId = pathname.match(categoryPathRegex)?.[3] || '';\n if (toggles['next-web-category-99-percent']) {\n return isIn99Percent(categoryId);\n }\n if (toggles['next-web-category-10-percent']) {\n return isLastDigitEnabled(categoryId, ['1']);\n }\n }\n\n if (isSearchLink(absoluteUrl.href)) {\n return true;\n }\n\n return isLinkToNextWebPage(absoluteUrl);\n};\n","import React, { useCallback } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { Link } from 'react-router-dom';\nimport { NextLink } from 'tradera/apps/nextweb/components/next-link';\nimport { updateEnvironmentHash } from 'tradera/state/environment/actions';\nimport { useIsFeatureEnabled } from 'tradera/hooks/use-is-feature-enabled';\nimport { useLocation } from 'tradera/hooks/use-location';\nimport { isNextJs } from 'tradera/utils/nextjs';\nimport { useAppSelector } from 'tradera/state/hooks';\nimport { useNextWebSpaLink } from './use-next-web-spa-link';\n\nconst PRODUCTION_ORIGIN = 'https://www.tradera.com';\nconst getRelativeUrl = (url: URL) => `${url.pathname}${url.search}`;\n\ntype ALinkProps = React.ComponentPropsWithRef<'a'> & {\n useLink?: boolean;\n};\n\nconst ALink = React.forwardRef(function ALink(\n {\n useLink: isTouchwebSpaLink,\n href,\n children,\n onClick: givenOnClick,\n ...otherProps\n }: ALinkProps,\n forwardedRef\n) {\n const dispatch = useDispatch();\n const location = useLocation();\n const isSpaNavigationEnabled = useAppSelector(\n (state) => state.environment.isSpaNavigationEnabled\n );\n const isNextWebAddUrlParamEnabled = useIsFeatureEnabled(\n 'next-web-add-url-param'\n );\n const isTouchWebAddUrlParamEnabled = useIsFeatureEnabled(\n 'touch-web-add-url-param'\n );\n const absoluteUrl = new URL(href ?? '', PRODUCTION_ORIGIN);\n\n if (isTouchWebAddUrlParamEnabled) {\n absoluteUrl.searchParams.set('next', '0');\n } else if (isNextWebAddUrlParamEnabled) {\n absoluteUrl.searchParams.set('next', '1');\n }\n\n const isNextWebSpaLink = useNextWebSpaLink(absoluteUrl);\n const handleSpaNavigationClick = useCallback(\n (evt: React.MouseEvent) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n dispatch(updateEnvironmentHash());\n if (givenOnClick) givenOnClick(evt);\n },\n [dispatch, givenOnClick]\n );\n\n const spaNavigationOrigins = [PRODUCTION_ORIGIN, location?.origin];\n const isRelativeUrl = spaNavigationOrigins.includes(absoluteUrl.origin);\n\n // Strip away origin for SPA links\n const relativeUrl = getRelativeUrl(absoluteUrl);\n\n if (isSpaNavigationEnabled && isRelativeUrl) {\n if (isNextJs && isNextWebSpaLink) {\n // NextJS routing\n return (\n \n {children}\n \n );\n } else if (!isNextJs && !isNextWebSpaLink && isTouchwebSpaLink) {\n // react-router-dom\n return (\n \n {/* @ts-ignore: TS2322 because types from react-router relies on some other React version. */}\n {children}\n \n );\n }\n }\n\n const url = isRelativeUrl ? relativeUrl : absoluteUrl.toString();\n return (\n \n {children}\n \n );\n});\n\n// Deprecated, please use the named export instead\nexport default ALink;\n","import cookie from 'cookie';\n\nexport const getCookieFromString = (cookieString, key) =>\n cookie.parse(cookieString)[key] || null;\n\n/**\n * Helper function for cookie and GDPR utilities do NOT use this directly. Use the cookie\n * utility instead as that is GDPR compliant.\n * @param {*} key\n * @returns\n */\nexport const getCookieFromBrowser = (key) =>\n getCookieFromString(window.document.cookie, key);\n\n/**\n * Helper function for cookie and GDPR utilities do NOT use this directly. Use the cookie\n * utility instead as that is GDPR compliant.\n * @param {*} key\n * @returns\n */\nexport const setCookieToBrowser = (s) => {\n window.document.cookie = s;\n};\n","import { I18N_FRONTEND_NAMESPACES } from 'tradera/lang/constants.mjs';\n\nconst usedKeyPageTypes = new Map();\n\nconst createNamespaces = () =>\n new Map(\n I18N_FRONTEND_NAMESPACES.map((namespace) => [namespace, new Set()])\n );\n\nconst getOrCreatePageTypeNamespaces = (pageType) => {\n if (!usedKeyPageTypes.has(pageType)) {\n usedKeyPageTypes.set(pageType, createNamespaces());\n }\n return usedKeyPageTypes.get(pageType);\n};\n\nexport const addKey = (pageType, namespace, key) => {\n const usedKeys = getOrCreatePageTypeNamespaces(pageType).get(namespace);\n if (!usedKeys.has(key)) {\n usedKeys.add(key);\n }\n};\n\nexport const getUsedKeys = (pageType) =>\n getOrCreatePageTypeNamespaces(pageType);\n","import React, { useRef } from 'react';\nimport { useTranslation, Trans as TransComponent } from 'react-i18next';\nimport { toLocalizedUrl } from 'tradera/utils/url';\nimport {\n NS_TOUCHWEB,\n I18N_FRONTEND_NAMESPACES,\n TRANS_SUFFIX\n} from './constants.mjs';\nimport { addKey } from 'tradera/apps/nextweb/i18n/translation-keys';\nimport { isServer } from 'tradera/utils/nextjs';\nimport { useAppSelector as useSelector } from 'tradera/state/hooks';\nimport { selectPageType } from 'tradera/state/page/selectors';\n\nimport type { TFunction } from 'react-i18next';\nimport type { i18n } from 'i18next';\n\nexport type TranslationFunction = TFunction;\n\nconst createWrappedT =\n (\n i18nObject: i18n,\n pathType: string,\n t: TranslationFunction,\n hasLoadedAllTranslations: boolean,\n throwOnTransSuffix?: boolean\n ) =>\n (i18nKey: string, options?: object | string, ...args: object[]) => {\n if (\n typeof i18nKey === 'string' &&\n i18nKey.endsWith(TRANS_SUFFIX) &&\n throwOnTransSuffix\n ) {\n throw new Error(\n `t function keys should not have \"Trans\" suffix, got key \"${i18nKey}\". Use Trans component instead.`\n );\n }\n if (isServer) {\n addKeyToServerCache(i18nKey, pathType, options, i18nObject);\n }\n return t(\n i18nKey,\n // @ts-ignore: TS2698 because I have no idea how these types from/using i18n work\n { ...options, hasLoadedAllTranslations },\n // @ts-ignore: TS2345 because I have no idea how these types from/using i18n work\n ...args\n );\n };\n\n/**\n * i18next translation wrappers for translating static text in react components\n * When to use what?\n * -----\n * 1. For functional components use `useTranslator()` hook\n * 2. For class components use `withTranslator()` HOC\n */\n\n/**\n * Translation hook, wrapper for react-i18next\n * @return {{t: Function}}\n */\n\nexport const useTranslator = () => {\n const pathType = useSelector(selectPageType);\n const hasLoadedAllTranslations = useSelector(\n (state) => state.status?.hasLoadedAllTranslations\n );\n const { t, ready, i18n } = useTranslation(I18N_FRONTEND_NAMESPACES);\n const wrappedT: TranslationFunction = React.useMemo(\n () => createWrappedT(i18n, pathType, t, hasLoadedAllTranslations, true),\n [hasLoadedAllTranslations, i18n, pathType, t]\n );\n return { t: ready ? wrappedT : () => '...' };\n};\n\nconst addKeyToServerCache = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n i18nKey: any,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pathType: any,\n options = {},\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n i18n: any\n) => {\n const { key, namespaces } = i18n.translator.extractFromKey(\n i18nKey,\n options\n );\n const namespace = namespaces[0];\n const { exactUsedKey } = i18n.translator.resolve(key, options);\n const pluralizedKey = exactUsedKey || i18nKey;\n addKey(pathType, namespace, pluralizedKey);\n};\n\ntype WithTranslatorProps = ReturnType['t'];\n\n/**\n * Translation HOC, wrapper for react-i18next\n * @param {Component} WrappedComponent\n * @return {Component} The wrapped component.\n */\nexport function withTranslator<\n TComponent extends WithTranslatorProps = WithTranslatorProps\n>(WrappedComponent: React.ComponentType) {\n function WithTranslator(\n props: Omit\n ) {\n const { t } = useTranslator();\n return ;\n }\n\n WithTranslator.displayName = `withTranslator(${\n WrappedComponent.displayName || WrappedComponent.name\n }`;\n return WithTranslator;\n}\n\ntype WithUrlLocalizerProps = ReturnType<\n typeof useUrlLocalizer\n>['toLocalizedUrl'];\n\n/**\n * Localization HOC, wrapper for URL-localizer\n * @param {Component} WrappedComponent\n */\nexport function withUrlLocalizer<\n TComponent extends WithUrlLocalizerProps = WithUrlLocalizerProps\n>(WrappedComponent: React.ComponentType) {\n function WithUrlLocalizer(\n props: Omit\n ) {\n const { toLocalizedUrl } = useUrlLocalizer();\n return ;\n }\n\n WithUrlLocalizer.displayName = `withUrlLocalizer(${\n WrappedComponent.displayName || WrappedComponent.name\n }`;\n\n return WithUrlLocalizer;\n}\n\n/**\n * Current language hook, wrapper for react-i18next\n * @return {{language: string}}\n */\nexport const useCurrentLanguage = () => {\n const { i18n, ready } = useTranslation();\n return {\n language: ready ? i18n.language : null\n };\n};\n\n/**\n * Returns function to append language prefix to link\n * @return {{toLocalizedUrl: function}}\n */\nexport const useUrlLocalizer = () => {\n const { i18n, ready } = useTranslation();\n const urlLocalizer = useRef((url: unknown) =>\n toLocalizedUrl(url, i18n.language)\n );\n return {\n toLocalizedUrl: ready ? urlLocalizer.current : (url: unknown) => url\n };\n};\n\ntype TransProps = Omit<\n React.ComponentProps,\n 'i18nKey'\n> & {\n i18nKey: string;\n};\n\nexport const Trans = (props: TransProps) => {\n const pathType = useSelector(selectPageType);\n const hasLoadedAllTranslations = useSelector(\n (state) => state.status?.hasLoadedAllTranslations\n );\n const { t, ready, i18n } = useTranslation(I18N_FRONTEND_NAMESPACES);\n const { i18nKey, children, defaults } = props;\n const wrappedT = React.useMemo(\n () =>\n createWrappedT(i18n, pathType, t, hasLoadedAllTranslations, false),\n [hasLoadedAllTranslations, i18n, pathType, t]\n );\n\n // TODO: since we don't have TS everywhere we still need to check these things, when we have TS we can use TS to enforce most of it instead instead\n\n if (!i18nKey) {\n throw new Error('Trans component key must have a i18nKey property');\n }\n if (!i18nKey.endsWith(TRANS_SUFFIX)) {\n throw new Error(\n `Trans component key must have the \"Trans\" suffix, got key \"${i18nKey}\"`\n );\n }\n if (children) {\n throw new Error(\n `Trans component must not have children, use components or t('${i18nKey}') function instead`\n );\n }\n if (defaults) {\n throw new Error(\n 'Trans components must not have defaults, use lokalise instead.'\n );\n }\n if (!ready) {\n return <>...;\n }\n return ;\n};\n","import { useSelector } from 'react-redux';\nimport { isServer } from 'tradera/utils/nextjs';\n\nexport const useLocation = () => {\n const request = useSelector((state) => state.request);\n const location = isServer ? request.location : window.location;\n return new URL(location);\n};\n","import { PAGE_LIST_TYPES } from 'tradera/apps/my-tradera/app/constants/list-types';\n\n/**\n * @returns {object} list of default cookies that could be set in Touchweb\n * @desc\n * key: Cookie Name\n * default: Default Value if not set\n * length: Time to be stored (months)\n */\nexport const DEFAULT_COOKIES = {\n ITEM_LAYOUT: {\n key: 'Srp_Item_Layout',\n default: 'layout-grid',\n length: 365\n },\n SITE_LAYOUT: {\n key: 'Srp_Site_Layout',\n default: 'site-width-default',\n length: 365\n }\n};\n\nexport const MYTRADERA_DEFAULT_COOKIES = {\n LIST_VIEW_TYPE: {\n key: 'MyTradera_ListViewType',\n default: 'Basic',\n length: 14\n },\n ITEMS_PER_PAGE: {\n key: 'MyTradera_ItemsPerPage',\n default: '25',\n length: 14\n },\n SHOW_FILTERS: {\n key: 'MyTradera_ShowFiltersToolbar',\n default: 'hidden',\n length: 14\n },\n LIST_VIEW_TYPE_BUYER_ACTIVE_ITEMS: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.BUYER_ACTIVE_ITEMS,\n default: 'Basic',\n length: 14\n },\n LIST_VIEW_TYPE_BUYER_PURCHASES: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.BUYER_PURCHASES,\n default: 'Normal',\n length: 14\n },\n LIST_VIEW_TYPE_BUYER_ITEMS_LOST: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.BUYER_ITEMS_LOST,\n default: 'Basic',\n length: 14\n },\n LIST_VIEW_TYPE_SELLER_ACTIVE: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.SELLER_ACTIVE,\n default: 'Basic',\n length: 14\n },\n LIST_VIEW_TYPE_SELLER_SOLD: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.SELLER_SOLD,\n default: 'Normal',\n length: 14\n },\n LIST_VIEW_TYPE_SELLER_NOT_SOLD: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.SELLER_NOT_SOLD,\n default: 'Basic',\n length: 14\n }\n};\n\nexport const CURRENCY_SELECTED_BY_USER = 'currency_selected_by_user';\nexport const GDPR_CONSENT_COOKIE = 'gdpr_consent_v1';\nexport const FORCE_GEO_DEV = 'force-geo-dev';\nexport const ITEMS_PER_PAGE = 'ITEMS_PER_PAGE';\nexport const LIST_VIEW_TYPE = 'LIST_VIEW_TYPE';\nexport const MOBILE_OPT_IN_TAGS = 'mobile-opt-in-tags';\nexport const NATIVE_APP_ENVIRONMENT = 'native-app-environment';\nexport const PREFERRED_CURRENCY = 'preferred_currency';\nexport const REGION_PICKER_DISMISSED = 'region_picker_dismissed_session';\nexport const S = 's';\nexport const SHIPPING_COUNTRY = 'shipping_country';\nexport const SHOW_FILTERS = 'SHOW_FILTERS';\nexport const SIGNUP_REFERRAL_PATH = 'signup_referral_path';\nexport const SOLD_VIEW_PICKLIST = 'sold_view_picklist';\nexport const TEST = 'test';\nexport const SAVE_SEARCH_MODAL_DISMISSED = 'save_search_modal_dismissed';\nexport const USERPREFERENCES = 'UserPreferences';\nexport const CART_ID = 'cartId';\nexport const VIEWPORT_WIDTH = 'viewport-width';\nexport const SHIP_TO_SWEDEN_DISCLAIMER_DISMISSED =\n 'ship-to-sweden-disclaimer-dismissed';\nexport const EXPERIMENTS = 'experiments';\nexport const EXPERIMENT_BUCKET = 'experiment_bucket';\nexport const PRODUCT_COMMUNICATION_DISMISSED =\n 'product_communication_dismissed';\nexport const WISH_LIST_NOTIFICATION_DISPLAY_COUNT =\n 'wish-list-nudge-notification-display-count';\nexport const WISH_LIST_NOTIFICATION_HIDDEN =\n 'wish-list-nudge-notification-hidden';\nexport const RECENTLY_VIEWED_ITEM_IDS = 'recently-viewed-items';\n\nexport const COOKIE_CATEGORIES = {\n Essential: 1,\n Performance: 2,\n Functional: 3,\n Marketing: 4\n};\n\nexport const COLLECT_SSN_MODAL_DISMISSED = 'collect-ssn-modal-dismissed';\n\n/**\n * all cookies that are used by tradera must be categorized in the array below.\n */\nexport const CATEGORIZED_COOKIES = {\n [GDPR_CONSENT_COOKIE]: COOKIE_CATEGORIES.Essential,\n [NATIVE_APP_ENVIRONMENT]: COOKIE_CATEGORIES.Essential,\n [TEST]: COOKIE_CATEGORIES.Essential, // Unit test cookie\n\n [EXPERIMENTS]: COOKIE_CATEGORIES.Performance,\n [EXPERIMENT_BUCKET]: COOKIE_CATEGORIES.Performance,\n\n [CURRENCY_SELECTED_BY_USER]: COOKIE_CATEGORIES.Functional,\n [DEFAULT_COOKIES.ITEM_LAYOUT.key]: COOKIE_CATEGORIES.Functional,\n [DEFAULT_COOKIES.SITE_LAYOUT.key]: COOKIE_CATEGORIES.Functional,\n [FORCE_GEO_DEV]: COOKIE_CATEGORIES.Functional,\n [ITEMS_PER_PAGE]: COOKIE_CATEGORIES.Functional,\n [LIST_VIEW_TYPE]: COOKIE_CATEGORIES.Functional,\n [MOBILE_OPT_IN_TAGS]: COOKIE_CATEGORIES.Functional,\n [MYTRADERA_DEFAULT_COOKIES.ITEMS_PER_PAGE.key]:\n COOKIE_CATEGORIES.Functional,\n [MYTRADERA_DEFAULT_COOKIES.LIST_VIEW_TYPE.key]:\n COOKIE_CATEGORIES.Functional,\n [MYTRADERA_DEFAULT_COOKIES.SHOW_FILTERS.key]: COOKIE_CATEGORIES.Functional,\n [PREFERRED_CURRENCY]: COOKIE_CATEGORIES.Functional,\n [REGION_PICKER_DISMISSED]: COOKIE_CATEGORIES.Functional,\n [S]: COOKIE_CATEGORIES.Functional, // saved search\n [SHIPPING_COUNTRY]: COOKIE_CATEGORIES.Functional,\n [SHOW_FILTERS]: COOKIE_CATEGORIES.Functional,\n [SIGNUP_REFERRAL_PATH]: COOKIE_CATEGORIES.Functional,\n [SOLD_VIEW_PICKLIST]: COOKIE_CATEGORIES.Functional,\n [USERPREFERENCES]: COOKIE_CATEGORIES.Functional,\n [SAVE_SEARCH_MODAL_DISMISSED]: COOKIE_CATEGORIES.Functional,\n [CART_ID]: COOKIE_CATEGORIES.Functional,\n [VIEWPORT_WIDTH]: COOKIE_CATEGORIES.Functional,\n [SHIP_TO_SWEDEN_DISCLAIMER_DISMISSED]: COOKIE_CATEGORIES.Functional,\n [MYTRADERA_DEFAULT_COOKIES.LIST_VIEW_TYPE_BUYER_ACTIVE_ITEMS.key]:\n COOKIE_CATEGORIES.Functional,\n [MYTRADERA_DEFAULT_COOKIES.LIST_VIEW_TYPE_BUYER_ITEMS_LOST.key]:\n COOKIE_CATEGORIES.Functional,\n [MYTRADERA_DEFAULT_COOKIES.LIST_VIEW_TYPE_BUYER_PURCHASES.key]:\n COOKIE_CATEGORIES.Functional,\n [MYTRADERA_DEFAULT_COOKIES.LIST_VIEW_TYPE_SELLER_ACTIVE.key]:\n COOKIE_CATEGORIES.Functional,\n [MYTRADERA_DEFAULT_COOKIES.LIST_VIEW_TYPE_SELLER_NOT_SOLD.key]:\n COOKIE_CATEGORIES.Functional,\n [MYTRADERA_DEFAULT_COOKIES.LIST_VIEW_TYPE_SELLER_SOLD.key]:\n COOKIE_CATEGORIES.Functional,\n [PRODUCT_COMMUNICATION_DISMISSED]: COOKIE_CATEGORIES.Functional,\n [WISH_LIST_NOTIFICATION_DISPLAY_COUNT]: COOKIE_CATEGORIES.Functional,\n [WISH_LIST_NOTIFICATION_HIDDEN]: COOKIE_CATEGORIES.Functional,\n [COLLECT_SSN_MODAL_DISMISSED]: COOKIE_CATEGORIES.Functional,\n [RECENTLY_VIEWED_ITEM_IDS]: COOKIE_CATEGORIES.Functional\n};\n\nexport const COOKIE_DEFAULT_CATEGORY = COOKIE_CATEGORIES.Functional;\n\n/**\n * List of cookies which are OK for any JavaScript to access. Never add cookies\n * that would be a security risk if exposed to third party scripts.\n */\nexport const COOKIES_REQUIRED_FOR_SSR_EXPOSED_TO_JS_IN_BROWSER = [\n CART_ID,\n EXPERIMENTS,\n EXPERIMENT_BUCKET,\n GDPR_CONSENT_COOKIE,\n REGION_PICKER_DISMISSED,\n PRODUCT_COMMUNICATION_DISMISSED,\n SHIPPING_COUNTRY,\n RECENTLY_VIEWED_ITEM_IDS\n];\n","import { toLocalizedUrl } from 'tradera/utils/url';\nimport { isServer } from 'tradera/utils/nextjs';\n\nexport const toLocalizedRiotUrl = (url) => toLocalizedUrl(url, getLanguage());\n\nlet language;\nexport const getLanguage = () => {\n if (isServer) {\n return;\n }\n if (language === '' || language === null || language === undefined) {\n // If we did this on the server in NextWeb all requests to the\n // same server would get the same language. This code is only\n // OK to run in the browser.\n // eslint-disable-next-line better-mutation/no-mutation\n language = document.querySelector('html').getAttribute('lang');\n }\n\n return language;\n};\n","import { useSelector, useDispatch } from 'react-redux';\nimport type { TypedUseSelectorHook } from 'react-redux';\nimport type { RootState, AppDispatch } from './configure-store';\n\n// Use throughout our app instead of plain `useSelector` since this gets us typed state\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\n// Use throughout our app instead of plain `useDispatch` since it includes the thunk middleware types etc\nexport const useAppDispatch: () => AppDispatch = useDispatch;\n","export default {\n TRADERA: 'https://www.tradera.com'\n};\n","import qs from 'qs';\nimport HOSTS from 'tradera/constants/hosts';\nimport initData from 'init-data';\nimport { logger } from 'packages/logger';\nimport { URL_LANGUAGES } from 'tradera/lang/constants.mjs';\nimport { removePropertiesWithoutValue } from 'tradera/utils/object';\n\n// List of SPA paths for the regex match, without initial slash\nconst SPA_REGEX_PATHS = [\n 'search',\n 'campaign',\n 'charity',\n 'kategorier',\n 'profile\\\\/items',\n 'brand\\\\/.+',\n // Category\n '[a-z]+[\\\\w\\\\-]+[\\\\-|_]\\\\d+'\n];\nconst SPA_PATH_REGEX = new RegExp(\n `^(/(${URL_LANGUAGES.join('|')}))?/(${SPA_REGEX_PATHS.join('|')})`\n);\n\n/**\n * Returns language parameter from url\n * @param {*} url\n */\nconst getLanguagePrefixFromUrl = (url) => {\n const matches = url.match(/\\/([a-z][a-z])((\\/.*$)|$)/);\n\n if (matches === null) {\n return null;\n }\n\n const firstMatch = matches.find((match, index) => index > 0 && match);\n\n if (URL_LANGUAGES.indexOf(firstMatch) !== -1) {\n return firstMatch;\n }\n\n return null;\n};\n\n/**\n * Removes priceRange from query params if fromPrice or toPrice is present.\n * @param {*} queryParams\n * @returns\n */\nconst prunePriceRange = (queryParams) => {\n if (queryParams.fromPrice || queryParams.toPrice) {\n const { priceRange, ...result } = queryParams;\n return result;\n }\n return queryParams;\n};\n\n/**\n * Format query params parsed from query string\n *\n * @param {object} queryParams\n * @returns {object}\n */\nconst formatQueryParams = (queryParams) => {\n const { categoryId, ...rest } = removePropertiesWithoutValue(queryParams);\n const formattedQueryParams = prunePriceRange(rest);\n if (categoryId !== undefined) {\n formattedQueryParams.categoryId = parseInt(categoryId, 10);\n }\n return formattedQueryParams;\n};\n\n/**\n * Check if url is absolute\n *\n * @param {string} url\n * @returns {boolean}\n */\nconst isAbsoluteUrl = (url) => new RegExp('^(?:[a-z]+:)?//', 'i').test(url);\n\n/**\n * Tests if a given url or path is an SPA link or not\n *\n * @param {string} urlOrPath\n * @returns {boolean}\n */\nfunction isSpaLink(urlOrPath) {\n let pathname;\n if (/(^http)s?:\\/\\//i.test(urlOrPath)) {\n try {\n pathname = new URL(urlOrPath).pathname;\n } catch {\n return false;\n }\n } else {\n pathname = urlOrPath;\n }\n return SPA_PATH_REGEX.test(pathname);\n}\n\n/**\n * Takes an object and returns a new object without attribute properties\n * @param {object} queryParams\n * @returns {object}\n */\nconst stripAttributesFromQueryParameters = (queryParams) => {\n // Using object spread to exclude listed variables from 'rest'\n const { attributes, ...rest } = queryParams;\n return rest;\n};\n\n/**\n * Takes an object and returns a new object without pagination properties\n * @param {object} queryParams\n * @returns {object}\n */\nconst stripCategoryIdFromQueryParameters = (queryParams) => {\n // Using object spread to exclude listed variables from 'rest'\n const { categoryId, ...rest } = queryParams;\n return rest;\n};\n\n/**\n * Removes tradera base from a url, leaving path and query\n *\n * @param {string} url\n * @returns {string}\n */\nconst stripHost = (url) =>\n typeof url === 'string' && url.startsWith('http')\n ? url.replace(HOSTS.TRADERA, '')\n : url;\n\n/**\n * Takes an object and returns a new object without itm properties\n * Itm tags should no longer be used, so this method will then be obsolete\n * @param {object} queryParams\n * @returns {object}\n */\nconst stripItmFromQueryParameters = (queryParams) => {\n // Using object spread to exclude listed variables from 'rest'\n const { itm_source, itm_medium, ...rest } = queryParams;\n return rest;\n};\n\n/**\n * Takes an object and returns a new object without pagination properties\n * @param {object} queryParams\n * @returns {object}\n */\nconst stripPaginationFromQueryParameters = (queryParams) => {\n // Using object spread to exclude listed variables from 'rest'\n // The parameters \"spage\", \"page\" and possible \"fe\" are deprecated and should no longer be used.\n // However, it may still be useful to remove them from the query parameters here,\n // in case they are used in old links.\n const { spage, paging, page, fe, ...rest } = queryParams;\n return rest;\n};\n\n/**\n * Takes an object and returns a new object without savedQueryName properties\n * @param {object} queryParams\n * @returns {object}\n */\nconst stripSavedQueryNameFromQueryParameters = (queryParams) => {\n // Using object spread to exclude listed variables from 'rest'\n const { savedQueryName, ...rest } = queryParams;\n return rest;\n};\n\n/**\n * Takes an object and returns a new object without saveSearch properties\n * @param {object} queryParams\n * @returns {object}\n */\nconst stripSaveSearchNameFromQueryParameters = (queryParams) => {\n // Using object spread to exclude listed variables from 'rest'\n const { saveSearch, ...rest } = queryParams;\n return rest;\n};\n\n/**\n * Takes an url and adds tradera base url if it is not already an absolute url\n *\n * @param {string} relativeUrl\n * @returns {string}\n */\nconst toAbsoluteUrl = (relativeUrl) =>\n relativeUrl.startsWith('http')\n ? relativeUrl\n : `${HOSTS.TRADERA}${\n relativeUrl.startsWith('/') ? relativeUrl : '/' + relativeUrl\n }`;\n\n/**\n * From URL to URL with language prefix\n * @param {*} url\n * @param {*} languageCodeIso2\n */\nconst toLocalizedUrl = (url, languageCodeIso2) => {\n if (url === null || url === undefined || url === '' || url === false) {\n return url;\n }\n\n const ignoredUrls = [initData.webApiUrl, '/api/webapi/'];\n const isIgnoredUrl = ignoredUrls.find(\n (domain) => url.indexOf(domain) !== -1\n );\n if (isIgnoredUrl) {\n return url;\n }\n\n if (!languageCodeIso2) {\n logger(`Missing language code for URL ${url}`);\n return url;\n }\n\n if (url[0] === '/') {\n if (url.length > 1 && url[1] === '/') {\n throw new Error(\n `Attempt to localize protocol relative url: ${url}. This is not supported at the moment`\n );\n }\n // Root relative url, just prepend language prefix\n return setLanguagePrefix(url, languageCodeIso2);\n }\n\n const absoluteUrlMatch = url.match(/(^[a-z]+:\\/\\/)([^/]+)(.*)/);\n\n if (!absoluteUrlMatch) {\n // Relative url with no starting /, treat as root relative after prepending /\n return setLanguagePrefix('/' + url, languageCodeIso2);\n }\n\n const [, protocol, host, pathAndQuery] = absoluteUrlMatch;\n\n const localizedPathAndQuery = setLanguagePrefix(\n pathAndQuery,\n languageCodeIso2\n );\n\n return `${protocol}${host}${localizedPathAndQuery}`;\n};\n\n/**\n * Creates query parameters object from search string\n * @param {string} search\n */\nconst toQueryParameters = (search) =>\n qs.parse(search, { ignoreQueryPrefix: true });\n\n/**\n * Removes the Tradera host from a url, making it relative\n * @param {string} url\n * @returns {string}\n */\nconst toRelativeTraderaUrl = (url) => {\n if (url.startsWith(HOSTS.TRADERA)) {\n return url.replace(HOSTS.TRADERA, '');\n } else {\n return url;\n }\n};\n\n/**\n * Creates search string from all properties in object\n * @param {object} queryParams\n * @param {{[addQueryPrefix]: bool, [encode]: bool, [skipNulls]: bool }}\n * @returns {string}\n */\nconst toSearchString = (\n queryParams,\n {\n addQueryPrefix = true,\n encode = true,\n skipNulls = true,\n arrayFormat = 'repeat' //qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }) ==> 'a=b&a=c'\n } = {}\n) =>\n qs.stringify(queryParams, {\n addQueryPrefix: addQueryPrefix,\n encode: encode,\n skipNulls: skipNulls,\n arrayFormat: arrayFormat\n });\n\nconst setLanguagePrefix = (path, languageCodeIso2) => {\n const languagePrefix = getLanguagePrefixFromUrl(path);\n const defaultLanguage = 'sv';\n\n if (languagePrefix) {\n if (languageCodeIso2 === defaultLanguage) {\n return path.replace(`/${languagePrefix}`, '');\n } else {\n return path.replace(languagePrefix, languageCodeIso2);\n }\n } else {\n if (languageCodeIso2 === defaultLanguage) {\n return path;\n } else {\n return `/${languageCodeIso2}${path}`;\n }\n }\n};\n\nconst getBackToHereRedirectUrl = () => {\n // Add random query parameter to force reload when redirecting to this url\n // and only the hash differs\n const queryParams = {\n ...qs.parse(location.search, { ignoreQueryPrefix: true }),\n forceRedirect: Math.round(Math.random() * 100000)\n };\n return (\n location.protocol +\n '//' +\n location.host +\n location.pathname +\n qs.stringify(queryParams, { addQueryPrefix: true })\n );\n};\n\nconst replacePartInPath = (path, oldPart, newPart) => {\n if (path.indexOf('?') > -1) {\n throw new Error('? is not valid in argument.');\n }\n return path\n .split('/')\n .map((part) => (part === oldPart ? newPart : part))\n .join('/');\n};\n\nexport {\n getLanguagePrefixFromUrl,\n formatQueryParams,\n getBackToHereRedirectUrl,\n isAbsoluteUrl,\n isSpaLink,\n replacePartInPath,\n stripAttributesFromQueryParameters,\n stripCategoryIdFromQueryParameters,\n stripHost,\n stripItmFromQueryParameters,\n stripPaginationFromQueryParameters,\n stripSavedQueryNameFromQueryParameters,\n stripSaveSearchNameFromQueryParameters,\n toAbsoluteUrl,\n toLocalizedUrl,\n toQueryParameters,\n toRelativeTraderaUrl,\n toSearchString\n};\n","export const isServer = typeof window === 'undefined';\n\nexport const isTest = process.env.NODE_ENV === 'test';\n\nexport const isClientApiRequest = (req) =>\n Boolean(req?.url?.startsWith('/_next/data'));\n\nexport const isNextJs = isServer || document.getElementById('__next') !== null;\n","export const NS_TOUCHWEB = 'touchWeb';\nexport const NS_ATTRIBUTES = 'attributes';\nexport const NS_CATEGORIES = 'categories';\nexport const NS_BACKEND = 'backend';\n\nexport const DEFAULT_LANGUAGE = 'sv';\nexport const URL_LANGUAGES = ['en', 'de', 'da', 'fr', 'nl'];\n\nexport const DEFAULT_LOCALE = 'sv-SE';\nexport const LANGUAGE_LOCALE = {\n sv: 'sv-SE',\n en: 'en-US',\n da: 'da-DK',\n de: 'de-DE',\n fr: 'fr-FR',\n nl: 'nl-NL'\n};\n\nexport const I18N_FRONTEND_NAMESPACES = [NS_TOUCHWEB, NS_ATTRIBUTES];\nexport const I18N_BACKEND_NAMESPACES = [NS_CATEGORIES, NS_BACKEND];\nexport const I18N_NAMESPACES = [\n ...I18N_FRONTEND_NAMESPACES,\n ...I18N_BACKEND_NAMESPACES\n];\nexport const NAMESPACE_PROJECTID = {\n [NS_TOUCHWEB]: '414441505e1db31fcaa776.55234720',\n [NS_ATTRIBUTES]: '9959867960be20fdc7d187.66761514',\n [NS_CATEGORIES]: '894792985d6665b8f079e1.31726015',\n [NS_BACKEND]: '916557165cc061c54ae7c8.44409330'\n};\n\nexport const SUPPORTED_LANGUAGES = [DEFAULT_LANGUAGE, ...URL_LANGUAGES];\nexport const SUPPORTED_CURRENCIES = [\n 'DKK',\n 'GBP',\n 'JPY',\n 'NOK',\n 'SEK',\n 'USD',\n 'EUR'\n];\n\nexport const TRANS_SUFFIX = 'Trans';\n\nexport const I18N_CACHE_MS = 60 * 1000;\n","import { formatNumberWithSeparators } from 'tradera/utils/format';\n\nexport type Price = string | number;\n\ntype FormatPriceOptions = {\n currency: string;\n preferredCurrency: string;\n style: string;\n currencyDisplay: string;\n useGrouping: boolean;\n roundUp: boolean;\n minimumFractionDigits: number;\n maximumFractionDigits: number;\n};\n\nexport type OverrideFormatPriceOptions = Partial;\n\nexport const formatPrice = (\n price: Price,\n inputLocale: string | null,\n overrideOptions: OverrideFormatPriceOptions = {}\n) => {\n const locale = inputLocale || 'sv-SE';\n const defaultOptions: FormatPriceOptions = {\n style: 'currency',\n currency: 'SEK',\n preferredCurrency: 'SEK',\n currencyDisplay:\n locale.startsWith('sv') &&\n (overrideOptions.currency || 'SEK') === 'SEK' &&\n (overrideOptions.preferredCurrency || 'SEK') === 'SEK'\n ? 'symbol'\n : 'code',\n useGrouping: false,\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n roundUp: false\n };\n const options = {\n ...defaultOptions,\n ...overrideOptions\n };\n let priceAsNumber = typeof price !== 'number' ? parseInt(price) : price;\n\n if (options.roundUp) {\n const decimalFactorForRounding = Math.pow(\n 10,\n options.maximumFractionDigits\n );\n priceAsNumber =\n Math.ceil(priceAsNumber * decimalFactorForRounding) /\n decimalFactorForRounding;\n }\n\n if (!isLocaleFormattingSupportedInBrowser) {\n const suffix =\n options.currencyDisplay === 'code' && options.currency === 'SEK'\n ? 'kr'\n : options.currency;\n return `${priceAsNumber} ${suffix}`;\n }\n\n const formattedPrice = priceAsNumber.toLocaleString(locale, options);\n return formatNumberWithSeparators(formattedPrice);\n};\n\n// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\nfunction toLocaleStringSupportsLocales() {\n try {\n Number(0).toLocaleString('i');\n } catch (e: unknown) {\n return (\n e !== null &&\n typeof e === 'object' &&\n 'name' in e &&\n e.name === 'RangeError'\n );\n }\n return false;\n}\n\n// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\nfunction toLocaleStringSupportsOptions() {\n return !!(\n typeof Intl === 'object' &&\n Intl &&\n typeof Intl.NumberFormat === 'function'\n );\n}\n\nconst isLocaleFormattingSupportedInBrowser =\n toLocaleStringSupportsLocales() && toLocaleStringSupportsOptions();\n","import { swedishTimeZoneDate } from 'tradera/utils/date';\n\nexport const formatEndDate = (endDateInput, t, nowDateInput, dayjs) => {\n if (!endDateInput || !nowDateInput) return '';\n\n const endDate = swedishTimeZoneDate(endDateInput, dayjs);\n const now = swedishTimeZoneDate(nowDateInput, dayjs);\n if (endDate.isSameOrAfter(now.add(1, 'week'), 'day')) {\n return endDate.format('D MMM HH:mm');\n }\n if (endDate.isSameOrAfter(now.add(2, 'day'), 'day')) {\n return endDate.format('ddd HH:mm');\n }\n if (endDate.isSameOrAfter(now.add(1, 'day'))) {\n return `${t('vip_tomorrow')} ${endDate.format('HH:mm')}`;\n }\n if (endDate.isSameOrAfter(now.add(1, 'minute'))) {\n const hours = endDate.diff(now, 'hour');\n const minutes = endDate.diff(now, 'minute') % 60;\n const timeParts = [];\n if (hours > 0) {\n timeParts.push(t('vip_hours', { count: hours }));\n }\n if (minutes > 0) {\n timeParts.push(t('vip_minutes', { count: minutes }));\n }\n return timeParts.join(' ');\n }\n if (endDate.isAfter(now)) {\n return t('vip_less_than_1_min_left');\n }\n return t('vip_ended');\n};\n\nexport const formatNumberWithSeparators = (number, separator = '\\u2006') => {\n return number\n .toString()\n .replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1' + separator);\n};\n\n// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\nfunction toLocaleStringSupportsLocales() {\n try {\n Number(0).toLocaleString('i');\n } catch (e) {\n return e.name === 'RangeError';\n }\n return false;\n}\n\n// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\nfunction toLocaleStringSupportsOptions() {\n return !!(\n typeof Intl === 'object' &&\n Intl &&\n typeof Intl.NumberFormat === 'function'\n );\n}\n\nconst isLocaleFormattingSupportedInBrowser =\n toLocaleStringSupportsLocales() && toLocaleStringSupportsOptions();\n\nexport const formatSellerDsrAverage = (value, locale = 'sv-SE') => {\n return value?.toLocaleString(locale, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1\n });\n};\n\nexport const getCurrencySymbol = (locale, overrideOptions = {}) => {\n const defaultOptions = {\n style: 'currency',\n currency: 'SEK',\n currencyDisplay:\n locale.startsWith('sv') &&\n (overrideOptions.currency || 'SEK') === 'SEK' &&\n (overrideOptions.preferredCurrency || 'SEK') === 'SEK'\n ? 'symbol'\n : 'code',\n useGrouping: false,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0\n };\n return (0)\n .toLocaleString(locale, {\n ...defaultOptions,\n ...overrideOptions\n })\n .replace(/\\d/g, '')\n .trim();\n};\n\nexport const formatDateWithDayOfWeek = (dateString, locale) => {\n if (!isLocaleFormattingSupportedInBrowser) {\n return dateString;\n }\n\n const options = {\n weekday: 'long',\n year: undefined,\n month: 'long',\n day: 'numeric'\n };\n return new Intl.DateTimeFormat(locale, options).format(\n Date.parse(dateString)\n );\n};\n","/**\n * @returns initData as JSON;\n * Default\n */\nconst initData = function () {\n if (typeof window === 'undefined') {\n return {};\n } else if (!window.initData) {\n const initDataEL = document.getElementById('init-data');\n if (initDataEL) {\n const data = initDataEL.getAttribute('data-init-data');\n const parsed = JSON.parse(data);\n return parsed;\n } else {\n return null;\n }\n } else {\n return window.initData;\n }\n};\n\nexport const getInitData = initData;\nexport default new initData();\n","import omitBy from 'lodash/omitBy';\nimport mapObject from 'lodash/mapValues';\n\nexport const nullifyUndefinedProperties = (obj) =>\n mapObject(obj, (value) => (typeof value === 'undefined' ? null : value));\n\nexport const removePropertiesWithoutValue = (obj) =>\n omitBy(obj, (value) => value === null || value === undefined);\n","export const isDevHost = (host) => /\\.tradera\\.(dev|service)$/.test(host);\n\nexport const isLocalHost = (host) =>\n [\n /webpack-internal:\\/\\//,\n /^local(host)?(:[0-9]+)*$/,\n /127\\.0\\.0\\.1:\\d+/,\n /10\\.\\d+\\.\\d+\\.\\d+:\\d+/,\n /192\\.168.\\.\\d+\\.\\d+:\\d+/\n ].some((regex) => regex.test(host));\n\nexport const isProductionHost = (host) =>\n !isLocalHost(host) && !isDevHost(host);\n","import { Buffer } from 'buffer';\nimport { isProductionHost } from './host';\n\nexport const mightBeLoggedIn = (req) =>\n Boolean(req.cookies[getRefreshTokenCookieName(req)]) ||\n getMemberIdFromAuthCookie(req);\n\nexport const getAccessTokenCookieDomain = (req) => {\n if (isProductionHost(req.headers.host)) {\n return '.tradera.com';\n }\n return req.headers['host'].split(':')[0];\n};\n\nexport const getRefreshTokenCookieDomain = () => undefined;\n\nexport const getAccessTokenCookieName = (req) =>\n isProductionHost(req.headers.host) ? 'trd_at' : 'trd_at_test';\n\nexport const getRefreshTokenCookieName = (req) =>\n isProductionHost(req.headers.host) ? 'trd_rt' : 'trd_rt_test';\n\nexport const getPersistTokenCookieName = (req) =>\n isProductionHost(req.headers.host) ? 'trd_rk' : 'trd_rk_test';\n\nexport const getMemberIdFromAuthCookie = (req) =>\n getJwtPayload(req.cookies?.[getAccessTokenCookieName(req)])?.mbr;\n\nexport const getExpiryFromAuthCookie = (req) =>\n getJwtPayload(req.cookies?.[getAccessTokenCookieName(req)])?.exp;\n\nconst getJwtPayload = (jwtToken) => {\n const [, payload] = (jwtToken || '').split('.');\n if (!payload) {\n return {};\n }\n try {\n return JSON.parse(Buffer.from(payload, 'base64').toString());\n } catch (error) {\n return {};\n }\n};\n\nexport const isTokenExpiringSoon = (token) => {\n const { exp: expiry } = getJwtPayload(token);\n if (!expiry) {\n return true;\n }\n const now = new Date();\n const expiryDate = new Date(expiry);\n const expiresSoonDate = new Date(expiryDate.getTime() - 60 * 1000);\n const isExpired = expiresSoonDate <= now;\n return isExpired;\n};\n\nexport const addCookie = (res, cookie) => {\n const previouslySetCookies = res.getHeader('Set-Cookie');\n if (Array.isArray(previouslySetCookies)) {\n res.setHeader('Set-Cookie', [...previouslySetCookies, cookie]);\n } else if (previouslySetCookies) {\n res.setHeader('Set-Cookie', [previouslySetCookies, cookie]);\n } else {\n res.setHeader('Set-Cookie', cookie);\n }\n};\n","import axios, {\n type AxiosError,\n type AxiosInstance,\n type AxiosResponse,\n type CancelTokenSource\n} from 'axios';\n\nimport { logger } from 'packages/logger';\nimport { isServer } from 'tradera/utils/nextjs';\nimport { getLanguage } from 'tradera/utils/language';\nimport { toLocalizedUrl } from 'tradera/utils/url';\n\n/**\n * Standardized api error codes\n */\nconst API_ERRORS = {\n IGNORE_ME: 'IGNORE_ME',\n ABORTED: 'ABORTED',\n CANCELLED: 'CANCELLED',\n NETWORK: 'NETWORK',\n TIMEOUT: 'TIMEOUT',\n VERSION_MISMATCH: 'VERSION_MISMATCH',\n LOGGED_OUT: 'LOGGED_OUT'\n};\n\nconst defaultJsonRequestHeaders = {\n // Force json response\n Accept: 'application/json',\n // For WebAPI and RequiresAuthorization to handle ajax request\n 'X-Requested-With': 'XMLHttpRequest'\n};\n\n/**\n * Standard Axios configs\n */\nconst axiosConfigs = {\n // Requests to endpoints with authentication\n authenticated: {\n // Send auth cookies\n withCredentials: true,\n headers: defaultJsonRequestHeaders\n },\n notAuthenticated: {\n // Dont send auth cookies\n withCredentials: false,\n headers: defaultJsonRequestHeaders\n }\n};\n\nconst isMissingAuthToken = (responseString: string) => {\n try {\n const responseObject = JSON.parse(responseString);\n const isMissing =\n responseObject.responseStatus.errorCode === 'MissingAuthToken';\n return isMissing;\n } catch {\n return false;\n }\n};\n\nconst isUnauthorized = (statusCode: number) => statusCode === 401;\n\nconst addAntiCacheParam = (url?: string) => {\n const antiCacheRegExp = /([?&]_=)[^&]*/;\n return antiCacheRegExp.test(url || '')\n ? url?.replace(antiCacheRegExp, '$1' + new Date().getTime())\n : url +\n (/\\?/.test(url || '') ? '&' : '?') +\n '_=' +\n new Date().getTime();\n};\n\nconst submitOriginalRequest = async (error: AxiosError) =>\n axios({\n ...error.config,\n url: addAntiCacheParam(error.config.url)\n });\n\nconst handleMissingAuthToken = async (error: AxiosError) => {\n const refreshAccessToken = async () =>\n axios.get(toLocalizedUrl('/login/state', getLanguage()));\n const handleErrorAfterRefresh = async (\n errorAfterRefreshToken: AxiosError\n ) => {\n if (isUnauthorized(errorAfterRefreshToken.request?.status)) {\n // eslint-disable-next-line better-mutation/no-mutation\n error.message = API_ERRORS.LOGGED_OUT;\n }\n return Promise.reject(error);\n };\n return refreshAccessToken()\n .then(() => submitOriginalRequest(error))\n .catch(handleErrorAfterRefresh);\n};\n\nconst handleUnauthorized = async (error: AxiosError) => {\n const checkLoginState = async () =>\n axios.get(toLocalizedUrl('/login/state', getLanguage()));\n return checkLoginState().then((response) => {\n const isLoggedIn = response.data?.isLoggedIn;\n if (isLoggedIn) {\n return submitOriginalRequest(error);\n }\n // eslint-disable-next-line better-mutation/no-mutation\n error.message = API_ERRORS.LOGGED_OUT;\n // eslint-disable-next-line promise/no-return-wrap\n return Promise.reject(error);\n });\n};\n\nconst errorResponseInterceptor = (error: AxiosError) => {\n if (isMissingAuthToken(error.request?.response)) {\n return handleMissingAuthToken(error);\n } else if (isUnauthorized(error.request?.status)) {\n return handleUnauthorized(error);\n }\n return Promise.reject(error);\n};\n\n/**\n * Create Axios instance or decorate existing instance with interceptor for expired token responses\n *\n */\nfunction axiosWithTokenRefresh(axiosInstance?: AxiosInstance) {\n let instance;\n if (axiosInstance === undefined) {\n instance = axios.create();\n } else {\n instance = axiosInstance;\n }\n instance.interceptors.response.use(\n (response) => response,\n errorResponseInterceptor\n );\n return instance;\n}\n\nconst cancelTokens: Record = {};\n\n/**\n * Create new or return existing cancellation function\n *\n * Usage:\n * const { cancel, cancelToken } = utilizeCancelToken('tokenId')\n * if (cancel) cancel();\n * axios.get('http://api.com/...', { cancelToken });\n *\n * @param {string} tokenId - A string ID shared between requests that cancel together\n */\nfunction utilizeCancelToken(tokenId: string) {\n if (isServer) {\n throw new Error(\n 'This implementation is not compatible with SSR as global properties like cancelTokens here are shared between server instances'\n );\n }\n let cancel;\n if (tokenId in cancelTokens) {\n cancel = cancelTokens[tokenId].cancel;\n }\n // eslint-disable-next-line better-mutation/no-mutation\n cancelTokens[tokenId] = axios.CancelToken.source();\n return {\n cancel,\n cancelToken: cancelTokens[tokenId].token\n };\n}\n\n/**\n * Check response version and throw error if different from current\n *\n */\nfunction checkResponseVersion(version = '12.0.0') {\n return (response: AxiosResponse) => {\n if (\n response.headers &&\n response.headers['X-Tradera-Version'] &&\n response.headers['X-Tradera-Version'] !== version\n ) {\n throw new Error(API_ERRORS.VERSION_MISMATCH);\n } else {\n return response;\n }\n };\n}\n\n/**\n * Checks redirect response for logged out user\n * This is an old solution. New solutions return a 401 response instead (see handleError).\n * Requires Axios config to include { withCredentials: true }\n *\n */\nfunction checkResponseLoggedOut() {\n return (response: AxiosResponse) => {\n if (\n response.data &&\n typeof response.data === 'string' &&\n response.data.includes('Logga in')\n ) {\n throw new Error(API_ERRORS.LOGGED_OUT);\n } else {\n return response;\n }\n };\n}\n\n/**\n * Final standardized formatting of an api response\n *\n */\nfunction finalizeResponse() {\n return (response: AxiosResponse) => {\n const { data, status } = response;\n return {\n data,\n status\n };\n };\n}\n\ntype StatusHandlers = Record;\n\n/**\n * Common network request error handling\n */\nfunction handleError(statusHandlers: StatusHandlers = {}) {\n return (error: AxiosError) => {\n const status = error.response && error.response.status;\n const message = error.message ? error.message : error.toString();\n /* eslint-disable better-mutation/no-mutation */\n if (axios.isCancel(error)) {\n error.message = API_ERRORS.CANCELLED;\n } else if (message.includes('timeout') || status === 408) {\n error.message = API_ERRORS.TIMEOUT;\n } else if (message.includes('Network')) {\n error.message = API_ERRORS.NETWORK;\n } else if (message.includes('Request aborted')) {\n error.message = API_ERRORS.ABORTED;\n } else if (status === 401) {\n error.message = API_ERRORS.LOGGED_OUT;\n } else if (status && status in statusHandlers) {\n error.message = statusHandlers[status];\n }\n throw error;\n };\n}\n\nfunction reloadOnUnauthorized(error: AxiosError) {\n switch (error.message) {\n case API_ERRORS.LOGGED_OUT:\n window.location.reload();\n break;\n default:\n throw error;\n }\n}\n\nfunction logError(error: AxiosError, scope: object) {\n switch (error.message) {\n case API_ERRORS.IGNORE_ME:\n case API_ERRORS.CANCELLED:\n case API_ERRORS.NETWORK:\n case API_ERRORS.TIMEOUT:\n break;\n default:\n logger(error, scope);\n break;\n }\n}\n\nexport {\n addAntiCacheParam,\n API_ERRORS,\n axiosConfigs,\n axiosWithTokenRefresh,\n checkResponseVersion,\n checkResponseLoggedOut,\n defaultJsonRequestHeaders,\n errorResponseInterceptor,\n finalizeResponse,\n handleError,\n logError,\n reloadOnUnauthorized,\n utilizeCancelToken\n};\n","export const LIST_VIEW_TYPES = {\n BASIC: 'Basic',\n NORMAL: 'Normal'\n} as const;\n\nexport const PAGE_LIST_TYPES = {\n BUYER_ACTIVE_ITEMS: 'BUYER_ACTIVE_ITEMS',\n BUYER_PURCHASES: 'BUYER_PURCHASES',\n BUYER_ITEMS_LOST: 'BUYER_ITEMS_LOST',\n SELLER_ACTIVE: 'SELLER_ACTIVE',\n SELLER_SOLD: 'SELLER_SOLD',\n SELLER_NOT_SOLD: 'SELLER_NOT_SOLD'\n} as const;\n\nexport const PAGE_BULK_ACTIONS = {\n ACTIVE_CANCEL: 'ActiveItems_Cancel',\n UNSOLD_RESTART: 'UnsoldItems_Restart',\n BUYER_MARK_PAID: 'Buyer_MarkPaid',\n BUYER_SHOW_ACTIVE: 'ShowActive',\n BUYER_HIDE_ACTIVE: 'HideActive',\n PURCHASES_SHOW: 'PurchasesShow'\n} as const;\n","import {\n selectGeolocation,\n selectIsLoggedIn,\n selectIsOutsideSweden\n} from 'tradera/state/member/selectors';\nimport { selectPreferredLanguage } from 'tradera/state/language/selectors';\nimport { getLanguageFromCountryCode } from 'tradera/localization/languagecode';\nimport {\n isSwedenCountryCodeOrUndefined,\n isDenmarkCountryCode\n} from 'tradera/localization/countrycode';\nimport { selectIsFeatureEnabled } from '../environment/selectors';\n\nexport const selectShowRegionSelection = (state) =>\n !selectIsLoggedIn(state) && selectIsOutsideSweden(state);\nexport const selectAvailableShippingCountryCodes = (state) =>\n state.shippingRegion.availableShippingCountryCodes;\nexport const selectAvailableShippingCountries = (state) =>\n state.shippingRegion.availableShippingCountries;\nexport const selectShippingCountry = (state) =>\n state.shippingRegion.shippingCountry;\nexport const selectIsLoadingAvailableShippingCountries = (state) =>\n state.shippingRegion.isLoadingAvailableShippingCountries;\nexport const selectHasLoadedAvailableShippingCountries = (state) =>\n state.shippingRegion.hasLoadedAvailableShippingCountries;\nexport const selectShippingRegionCountryCodeIso2 = (state) =>\n state.shippingRegion.shippingCountry?.countryCodeIso2;\nexport const selectIsSwedishVisitor = (state) =>\n isSwedenCountryCodeOrUndefined(selectShippingRegionCountryCodeIso2(state));\nexport const selectIsDanishVisitor = (state) =>\n isDenmarkCountryCode(selectShippingRegionCountryCodeIso2(state));\n\nconst gpsMatchesLanguage = (state) => {\n const geoLocation = selectGeolocation(state);\n if (!geoLocation) {\n return true;\n }\n const country = geoLocation?.isoCode?.toLowerCase();\n const expectedLang = getLanguageFromCountryCode(\n country,\n selectIsFeatureEnabled('french-dutch-selectable')(state)\n );\n const language =\n selectPreferredLanguage(state)?.languageCodeIso2?.toLowerCase() || 'sv';\n return expectedLang === language;\n};\n\nexport const selectShowLocalizationRegionPicker = (state) =>\n !selectIsLoggedIn(state) &&\n !state.shippingRegion.regionPickerDismissed &&\n !state.shippingRegion.shippingCountryCookieValue &&\n !gpsMatchesLanguage(state);\n","import * as Sentry from '@sentry/react';\nimport type { CaptureContext } from '@sentry/types';\n\ntype SomeError = Error | string | object | unknown;\n\n/**\n * @param {object} error - takes an exception and logs to Sentry or the console in development\n * @param {object} [scope] - Sentry CaptureContext created with new Sentry.Scope() or plain object\n * @desc logger is designed for logging errors. It will accept an argument of any type and create a stacktrace containing a reference to the callee.\n * @TODO Migrate this functionality to a logging module that handles different levels of logs\n */\nexport const logger = (error: SomeError, scope?: CaptureContext) => {\n let sentryException;\n if (error instanceof Error) {\n sentryException = error;\n } else if (typeof error === 'string') {\n sentryException = new Error(error);\n } else {\n sentryException = new Error(JSON.stringify(error));\n }\n if (scope) {\n Sentry.captureException(sentryException, scope);\n } else {\n Sentry.captureException(sentryException);\n }\n};\n","/* eslint-disable better-mutation/no-mutation */\n\n/**\n *\n * # track events:\n * import { GtmService } from 'tradera/services/google-tagmanager-service';\n * GtmService.trackGtmEvent(\"zorro\", { marvel: false, black: true })\n *\n *\n *\n */\n\nimport * as Sentry from '@sentry/react';\nimport initData from 'init-data';\nimport { isServer, isNextJs } from 'tradera/utils/nextjs';\nimport { buildInitialGtmDataLayerFromInitData } from 'tradera/utils/google-tagmanager';\n\n/**\n * SPA page view tracking becomes enabled after first\n * page view tracking which happens after the first\n * page is loaded from server.\n * This prevents reset of data layer after a SPA route has\n * changed (happens late after full page load) and prevents\n * duplicated trackPageView events.\n */\nlet spaPageViewTrackingEnabled = false;\n\nclass GoogleTagManagerService {\n constructor() {\n this.isScriptLoaded = false;\n\n if (!isNextJs) this._setWebViewHelperFunctionsToWindow();\n }\n\n loadGtmScript() {\n if (!isNextJs) {\n this._newPageFromServer();\n }\n const accountId =\n process?.env.NEXT_PUBLIC_GOOGLE_TAG_MANAGER_ACCOUNT_ID ||\n 'GTM-5TMB2D';\n (function (w, d, s, l, i) {\n w[l] = w[l] || [];\n w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });\n var f = d.getElementsByTagName(s)[0],\n j = d.createElement(s),\n dl = l != 'dataLayer' ? '&l=' + l : '';\n j.async = true;\n j.src = '//www.googletagmanager.com/gtm.js?id=' + i + dl;\n f.parentNode.insertBefore(j, f);\n })(window, document, 'script', 'dataLayer', accountId);\n this.isScriptLoaded = true;\n }\n\n push(payload) {\n if (isServer) {\n return;\n }\n\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(payload);\n }\n\n pushArguments() {\n if (isServer) {\n return;\n }\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(arguments);\n }\n\n _getDatalayerObject() {\n let output = {};\n if (window.dataLayer) {\n for (const entry of window.dataLayer) {\n output = { ...output, ...entry };\n }\n }\n return output;\n }\n\n /**\n * destroy datalayer from previous loading. this is really only useful in spa pages, it's backwards compatible so it doesnt do any harm on old pages\n */\n _reset() {\n if (!window.dataLayer) {\n return;\n }\n\n const data = this._getDatalayerObject();\n for (const key of Object.keys(data)) {\n data[key] = undefined;\n }\n window.dataLayer.push({ ...data, event: 'reset' });\n }\n\n _hasPreviouslyTrackedPage = () =>\n !!window.dataLayer?.find((item) => item.event === 'trackPageview');\n\n newPage(pageType, initialDataLayer) {\n if (this._hasPreviouslyTrackedPage()) {\n this._reset();\n }\n this._pushInitialDataLayer(initialDataLayer);\n // It is important that the \"Container loaded\" triggered by dataLayer.push({event: \"gtm.js\", ...})\n // happens after \"initialDataLayer\" otherwise variables for the GDPR banner may have the wrong\n // values in Tagmanager. For that reason the GTM script is loaded here after initialDatalayer is set.\n if (!this.isScriptLoaded) {\n this.loadGtmScript();\n }\n this.push({ event: 'pageType', 'page.pageType': pageType });\n }\n\n /**\n * Same as newPage but with logic for case in Touchweb where initial\n * datalayer was set on server and already tracked on landing page.\n * This function does nothing until after first call to trackPageView\n * (e.g. after a SPA-navigation away from the landing page).\n * @param {*} pageType\n * @param {*} initialDataLayer\n * @returns\n */\n newSpaPage(pageType, initialDataLayer) {\n if (!spaPageViewTrackingEnabled) {\n return;\n }\n this.newPage(pageType, initialDataLayer);\n }\n\n _newPageFromServer() {\n const initialDataLayer = buildInitialGtmDataLayerFromInitData(initData);\n this._pushInitialDataLayer(initialDataLayer);\n // ------------------------------------------------\n // backwards compatibility\n // get old datalayer info and push it in\n if (window.legacyDataLayer) {\n for (const entry of window.legacyDataLayer) {\n window.dataLayer.push({\n event: 'tradera/legacyDataLayer',\n ...entry\n });\n }\n }\n }\n\n _pushInitialDataLayer(initialDataLayer) {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({\n ...initialDataLayer,\n event: 'initialDataLayer'\n });\n }\n\n /**\n * tracks a google analytics event\n * @param {string} category ga category\n * @param {string} action ga action what happens, ie: \"Filter box - open/close\"\n * @param {string} label ga label what the value of the action was, ie \"close\"\n * @param {integer} [value] ga interger value of the action.\n */\n trackAction(category, action, label, value = 0, nonInteractive = false) {\n this.push({\n event: 'trackEvent',\n eventCategory: category || '',\n eventAction: action || '',\n eventLabel: label || '',\n eventValue: value || '0',\n eventNonInteractive: nonInteractive\n });\n\n Sentry.addBreadcrumb({\n type: 'default',\n level: 'info',\n category: nonInteractive ? 'tracking' : 'ui-action',\n message: 'Analytics Event',\n data: {\n category,\n action,\n label,\n value\n }\n });\n }\n\n /**\n * google tag manager event. Note: if you want to send google analytics events use trackAction instead\n * @param {string} eventName\n * @param {object} [event] data\n */\n trackGtmEvent(eventName, data = {}) {\n this.push({\n event: eventName,\n ...data\n });\n }\n\n /**\n * Track a pageview. Use this script in SPA's to make sure that analytics gets pageview information.\n * This creates a virtual page view since google analytics by default doesn't track changes to url via\n * push state.\n */\n trackPageView() {\n this.trackGtmEvent('trackPageview');\n spaPageViewTrackingEnabled = true;\n }\n\n /**\n *\n * @param {string} category\n * @param {string} action\n * @param {string} label\n * @param {string} callback\n * @param {} value\n */\n trackLinkClickAndCallback(category, action, label, callback, value = 0) {\n this.push({\n event: 'trackEvent',\n eventCategory: category || '',\n eventAction: action || '',\n eventLabel: label || '',\n eventValue: value || '0',\n eventNonInteractive: false,\n eventCallback: callback // part of google tag manager api to execute code after all tags in datalayer have been executed\n });\n }\n\n trackLinkClickAndGotoUrl(category, action, label, url, value = 0) {\n const callback = () => {\n location.href = url;\n };\n this.trackLinkClickAndCallback(\n category,\n action,\n label,\n callback,\n value\n );\n }\n\n /**\n * Set up helper functions which purpose is to post data to\n * either Android or iOS\n * These are accessed by Google Tag Manager\n *\n * https://firebase.google.com/docs/analytics/webview?platform=ios\n */\n _setWebViewHelperFunctionsToWindow() {\n window.logGaWebViewEvent = (name, params) => {\n if (!name) {\n return;\n }\n\n if (window.AnalyticsWebInterface) {\n // Call Android interface\n window.AnalyticsWebInterface.logEvent(\n name,\n JSON.stringify(params)\n );\n } else if (\n window.webkit &&\n window.webkit.messageHandlers &&\n window.webkit.messageHandlers.firebase\n ) {\n // Call iOS interface\n var message = {\n command: 'logEvent',\n name: name,\n parameters: params\n };\n window.webkit.messageHandlers.firebase.postMessage(message);\n }\n };\n\n window.setGaWebViewUserProperty = (name, value) => {\n if (!name || !value) {\n return;\n }\n\n if (window.AnalyticsWebInterface) {\n // Call Android interface\n window.AnalyticsWebInterface.setUserProperty(name, value);\n } else if (\n window.webkit &&\n window.webkit.messageHandlers &&\n window.webkit.messageHandlers.firebase\n ) {\n // Call iOS interface\n var message = {\n command: 'setUserProperty',\n name: name,\n value: value\n };\n window.webkit.messageHandlers.firebase.postMessage(message);\n }\n };\n }\n}\n\nexport const GtmService = new GoogleTagManagerService();\n","import initData from 'init-data';\nimport { isNextJs, isServer } from 'tradera/utils/nextjs';\n\nconst getSiteBaseUrl = () =>\n isServer\n ? process.env.PUBLIC_TOUCHWEB_WINDOW_LOCATION_ORIGIN\n : window.location.origin;\n\nconst webApiUrl = isNextJs\n ? `${getSiteBaseUrl()}/api/webapi`\n : initData.webApiUrl;\n\nexport default {\n AVAILABLE_SHIPPING_COUNTRIES:\n webApiUrl + '/member/getavailablecountriesforshipping',\n CART_OVERVIEW_VIEW: webApiUrl + '/shopping/checkout/cartoverview',\n CART_ADD_ITEM: webApiUrl + '/shopping/cart/item',\n CART_REMOVE_ITEMS: webApiUrl + '/shopping/cart/removeitems',\n CART_SET_ITEM_QUANTITY: webApiUrl + '/shopping/cart/setitemquantity',\n FAVOURITE_SELLERS: webApiUrl + `/discover/favouritesellers-and-items2`,\n HYPERWALLET_PAYOUT_COMPLETE:\n webApiUrl + '/member/paymentprovider/completehyperwallettransfermethod',\n HYPERWALLET_PAYOUT_TOKEN:\n webApiUrl + '/member/paymentprovider/hyperwalletauthenticationtoken',\n HYPERWALLET_PAYOUT:\n webApiUrl +\n '/member/paymentprovider/hyperwallettransfermethodviewmodel',\n INTERNATIONAL_SHIPPING_CALCULATOR:\n webApiUrl + '/browse/internationalshippingcalculator',\n MEMBER_PAYOUT_SETTINGS_REMOVE:\n webApiUrl + '/member/profile/removetraderapaypayoutdestination',\n MEMBER_PAYOUT_SETTINGS:\n webApiUrl + '/member/paymentprovider/memberpayoutsettingsviewmodel',\n ORDER_CHECKOUT_CONFIRMATION:\n webApiUrl +\n '/shopping/ordercheckout/purchaseordercheckoutconfirmationviewmodel',\n ORDER_CHECKOUT_PAYMENT: initData.orderCheckoutPaymentUrl,\n ORDER_CHECKOUT_REQUEST_COMBINED_PRICE:\n webApiUrl + '/shopping/ordercheckout/requestcombinedshippingprice',\n ORDER_CHECKOUT_CREATE_UNCOMMITTED_PURCHASE_ORDER:\n webApiUrl + '/shopping/ordercheckout/createuncommittedpurchaseorder',\n ORDER_PURCHASE_SHOP_ITEMS:\n webApiUrl + '/shopping/ordercheckout/purchaseshopitems',\n PERSONALISED_SUGGESTIONS: '/api/personalised-suggestions',\n SEARCH: '/search',\n\n SWISH_APP2APP_CALLBACK: 'shopping/payment/swish',\n SWISH_APP2APP_CALLBACK_MARK_AS_PAID:\n webApiUrl + '/shopping/payment/swish-app2app-paymentcallback',\n WEB_API: webApiUrl,\n UPI: (purchaseOrderId) =>\n webApiUrl + '/member/uppo-strike/?PurchaseOrderId=' + purchaseOrderId,\n MCP: (purchaseOrderId) =>\n webApiUrl + '/member/mcp-strike/?PurchaseOrderId=' + purchaseOrderId,\n MCP_CONFIRM: (purchaseOrderId) =>\n webApiUrl +\n '/member/mcp-strike-confirm/?PurchaseOrderId=' +\n purchaseOrderId,\n PURCHASE_ORDER: (purchaseOrderId) =>\n webApiUrl + '/member/purchaseorder/?PurchaseOrderId=' + purchaseOrderId,\n MARKETING_PUBLIC_API: '/api/marketing',\n SHIPPING_CHECKOUT_DELETE: '/my/shipping/checkout/delete'\n};\n","import BPOINT from '@tradera/blueprint/theme/scss/export/breakpoints.module.scss';\n\n// Explicit list of breakpoints for code completion\nexport const BREAKPOINTS = {\n XS: 'XS',\n SM: 'SM',\n MD: 'MD',\n LG: 'LG',\n XL: 'XL'\n} as const;\n\nexport const BREAKPOINT_SIZES: Record<\n string,\n { name: string; min: number; max: number }\n> = Object.fromEntries(\n Object.entries(BPOINT)\n .filter(([bp]) => BREAKPOINTS[bp as keyof typeof BREAKPOINTS])\n .map(([name, size], index, entries) => {\n const min = parseInt(size, 10);\n // Look ahead to next breakpoint entry and get its size minus one as current breakpoint's max size\n const max =\n index + 1 in entries\n ? parseInt(entries[index + 1][1], 10) - 1\n : 99999;\n return [\n name as keyof typeof BREAKPOINTS,\n {\n min,\n max,\n name\n }\n ];\n })\n);\n","// extracted by mini-css-extract-plugin\nexport default {\"XS\":\"0\",\"xs\":\"0\",\"SM\":\"450px\",\"sm\":\"450px\",\"MD\":\"768px\",\"md\":\"768px\",\"LG\":\"1024px\",\"lg\":\"1024px\",\"XL\":\"1250px\",\"xl\":\"1250px\"};","/***\n *\n * Keep track of users' GDPR settings.\n *\n */\nimport dayjs from 'dayjs';\nimport cookie from 'cookie';\n\nimport {\n GDPR_CONSENT_COOKIE,\n COOKIE_CATEGORIES\n} from 'tradera/constants/cookies';\nimport { getCookieFromBrowser, setCookieToBrowser } from './cookie-helpers';\n\nconst createCookie = (name, value, expires) => {\n const options = {\n expires,\n httpOnly: false,\n path: '/'\n };\n return cookie.serialize(name, String(value), options);\n};\n\nexport class GdprSettings {\n constructor(getCookie, setCookie) {\n if (!getCookie || !setCookie) {\n throw new Error('You must provide getCookie and setCookie');\n }\n this.getCookie = getCookie;\n this.setCookie = setCookie;\n }\n /**\n *\n * @param {int} cookieCategory use the constant COOKIE_CATEGORIES to get different values.\n */\n isCategoryEnabled(cookieCategory) {\n if (cookieCategory === COOKIE_CATEGORIES.Essential) {\n return true;\n }\n\n const encodedConsentCookie = this.getCookie(GDPR_CONSENT_COOKIE);\n const consentCookie = decodeURI(encodedConsentCookie);\n\n if (!consentCookie || consentCookie.length === 0) {\n return true;\n }\n\n const categoryPattern = new RegExp(`,${cookieCategory}:1`);\n return categoryPattern.test(consentCookie);\n }\n\n isPerformanceEnabled() {\n return this.isCategoryEnabled(COOKIE_CATEGORIES.Performance);\n }\n\n isFunctionalEnabled() {\n return this.isCategoryEnabled(COOKIE_CATEGORIES.Functional);\n }\n\n isMarketingEnabled() {\n return this.isCategoryEnabled(COOKIE_CATEGORIES.Marketing);\n }\n\n set(performance, functional, marketing) {\n const cookieValue = [\n `${COOKIE_CATEGORIES.Essential}:1`,\n `${COOKIE_CATEGORIES.Performance}:${performance ? '1' : '0'}`,\n `${COOKIE_CATEGORIES.Functional}:${functional ? '1' : '0'}`,\n `${COOKIE_CATEGORIES.Marketing}:${marketing ? '1' : '0'}`\n ];\n const cookieString = createCookie(\n GDPR_CONSENT_COOKIE,\n cookieValue.join(','),\n dayjs().add(1, 'years').toDate()\n );\n this.setCookie(cookieString);\n }\n}\n\nexport default new GdprSettings(getCookieFromBrowser, setCookieToBrowser);\n","export const selectCurrencies = (state) => state.multiCurrency.currencies;\n\nexport const selectPreferredCurrency = (state) =>\n state.multiCurrency.preferredCurrency ||\n state.multiCurrency.currencies.find((c) => c.code === 'SEK');\n\nexport const selectIsPreferredCurrencySEK = (state) =>\n selectPreferredCurrency(state)?.code === 'SEK';\n\nexport const selectShowCurrencySelection = (state) =>\n !!(\n state.multiCurrency.enabled &&\n state.multiCurrency.preferredCurrency &&\n state.multiCurrency.currencies &&\n state.multiCurrency.currencies.length > 0\n );\n","export const selectEnvironment = (state) => state.environment;\n\nexport const selectFeatureSwitches = (state) =>\n state.environment.featureSwitches;\nexport const selectIsFeatureEnabled = (featureName) => (state) =>\n selectFeatureSwitches(state)?.[featureName] === true;\n\nexport const selectEnvVariables = (state) => state.environment.variables;\n\nexport const selectExperiments = (state) => state.environment.experiments;\n\nexport const selectSingleExperiment = (experimentName) => (state) =>\n selectExperiments(state)?.find((e) => e.id === experimentName.id) || {};\n\nexport const selectWebLiveUrl = (state) =>\n state.environment.variables.PUBLIC_WEB_LIVE_URL;\n\nexport const selectBrowserName = (state) => state.environment.browserName;\n","// extracted by mini-css-extract-plugin\nexport default {\"item-toast\":\"item-toast--ri8Es\",\"itemToast\":\"item-toast--ri8Es\",\"item-toast-image\":\"item-toast-image--2bQGy\",\"itemToastImage\":\"item-toast-image--2bQGy\"};","import React from 'react';\nimport ALink from 'tradera/components/alink/alink';\nimport { useTranslator, useUrlLocalizer } from 'tradera/lang/translate';\nimport styles from './item-toast.module.scss';\nimport { useLocalizedPriceFormatter } from 'tradera/localization/use-localized-price-formatter';\n\nexport const ItemToast = ({\n imageUrl,\n itemUrl,\n shortDescription,\n type,\n eventData\n}) => {\n const { toLocalizedUrl } = useUrlLocalizer();\n\n return (\n \n
\n \n \n
\n
\n );\n};\n\nconst ToastMessage = ({ type, shortDescription, eventData }) => {\n const { t } = useTranslator();\n const localizedPriceFormatter = useLocalizedPriceFormatter();\n let message;\n switch (type) {\n case 'ItemOutbidded':\n message = t('siteWideNotifications_itemOutbidded_localized', {\n newLeadingBid: localizedPriceFormatter(\n eventData.newLeadingBidAmount\n ),\n shortDescription\n });\n break;\n case 'ItemFirstBid':\n message = t('siteWideNotifications_itemFirstBid', {\n shortDescription\n });\n break;\n case 'ItemSold':\n message = t('siteWideNotifications_itemSold_localized', {\n price: localizedPriceFormatter(eventData.price),\n shortDescription\n });\n break;\n case 'ItemWon':\n message = t('siteWideNotifications_itemWon_localized', {\n price: localizedPriceFormatter(eventData.price),\n shortDescription\n });\n break;\n case 'ItemPaid':\n message = t('siteWideNotifications_itemPaid', {\n shortDescription\n });\n break;\n case 'ItemWishListReminder':\n message = t('siteWideNotifications_itemWishListReminder', {\n shortDescription,\n timeLeftMinutes: eventData.timeLeftMinutes\n });\n }\n return
{message}
;\n};\n","import React from 'react';\nimport { useTranslator } from 'tradera/lang/translate';\n\ntype Props = {\n message: string;\n header?: string;\n messageData?: Record;\n};\n\nexport const MessageToast = ({ message, header, messageData }: Props) => {\n const { t } = useTranslator();\n\n return (\n
\n {header &&

{t(header)}

}\n {message && (\n \n {t(message, messageData)}\n \n )}\n
\n );\n};\n","import React from 'react';\nimport { toast } from 'react-toastify';\n\nimport { ItemToast } from 'tradera/components/toasts/item-toast';\nimport { MessageToast } from 'tradera/components/toasts/message-toast';\nimport { isServer } from 'tradera/utils/nextjs';\nimport { webApiClient } from '../utils/http';\nimport { createQueue } from './toast-queue';\nimport type { ItemBasicInfoApiResponse } from 'tradera/state/services/types/webapi-browse-generated';\n\nconst queuedToasts = createQueue();\n\nconst openNextToast = async () => {\n if (isServer) {\n return;\n }\n if (queuedToasts.isInProgress()) {\n return;\n }\n const nextItem = queuedToasts.next();\n if (nextItem) {\n try {\n const queueLength = queuedToasts.getLength();\n const toastOptions = {\n autoClose: Math.max(2, 5 - queueLength) * 1000,\n onClose: () => {\n queuedToasts.notifyDone();\n openNextToast();\n }\n };\n if (nextItem.eventData.itemId) {\n const response =\n await webApiClient.get(\n `/browse/item-basic-info/${nextItem.eventData.itemId}`\n );\n const { imageUrl, itemUrl, shortDescription } =\n response.data.item || {};\n toast(\n // TODO: convert to JSX when we have a proper story for this\n React.createElement(ItemToast, {\n imageUrl,\n itemUrl,\n shortDescription,\n type: nextItem.type,\n eventData: nextItem.eventData\n }),\n toastOptions\n );\n } else if (nextItem.eventData.message) {\n const { message, header, messageData } = nextItem.eventData;\n toast(\n ,\n { ...toastOptions, type: nextItem.eventData.type }\n );\n }\n } catch (e) {\n queuedToasts.notifyDone();\n openNextToast();\n throw e;\n }\n }\n};\n\nconst handleNotification = async (\n type: string,\n eventData: unknown,\n ttlInMinutes = 10\n) => {\n if (document.visibilityState !== 'visible') {\n // We don't want to show messages if page is not visible. If we do they will queue up!\n return;\n }\n\n queuedToasts.add({ type, eventData }, ttlInMinutes);\n openNextToast();\n};\n\nexport const showItemOutbiddedToast = (\n itemId: number,\n newLeadingBidAmount: number\n) =>\n handleNotification('ItemOutbidded', {\n itemId,\n newLeadingBidAmount\n });\n\nexport const showItemFirstBidToast = (itemId: number) =>\n handleNotification('ItemFirstBid', { itemId });\n\nexport const showItemSoldToast = (itemId: number, price: number) =>\n handleNotification('ItemSold', { itemId, price });\n\nexport const showItemWonToast = (itemId: number, price: number) =>\n handleNotification('ItemWon', { itemId, price });\n\nexport const showItemPaidToast = (itemId: number) =>\n handleNotification('ItemPaid', { itemId });\n\nexport const showItemWishListReminderToast = (\n itemId: number,\n timeLeftMinutes: number\n) =>\n handleNotification(\n 'ItemWishListReminder',\n { itemId, timeLeftMinutes },\n timeLeftMinutes > 10 ? 10 : 2\n );\n\nexport const showHotToast = (\n message: string,\n header: string,\n messageData = null\n) => {\n handleNotification('Message', {\n message,\n header,\n messageData,\n type: 'hot'\n });\n};\n\nexport const showSuccessToast = (\n message: string,\n header?: string,\n messageData = null\n) => {\n handleNotification('Message', {\n message,\n header,\n messageData,\n type: toast.TYPE.SUCCESS\n });\n};\n\nexport const showErrorToast = (\n message: string,\n header?: string | null,\n messageData: unknown = null\n) => {\n handleNotification('Message', {\n header,\n message,\n messageData,\n type: toast.TYPE.ERROR\n });\n};\n\nexport const showInfoToast = (\n message: string,\n header?: string,\n messageData = null\n) => {\n handleNotification('Message', {\n message,\n header,\n messageData,\n type: toast.TYPE.INFO\n });\n};\n\n// export const ToastTestButton = () => (\n// {\n// e.preventDefault();\n// showItemWishListReminderToast(85391643, 3);\n// showItemOutbiddedToast(85391639, 99);\n// showItemFirstBidToast(85391639);\n// showItemSoldToast(85391639, 1234);\n// showItemWonToast(85391639, 1234);\n// showItemPaidToast(85391639);\n// }}>\n// Test\n// \n// );\n","/**\n * A queue with a that handled max age (ttl) for messages.\n * @returns\n */\nexport const createQueue = () => {\n const items = [];\n const dayInMinutes = 60 * 24;\n const add = (item, ttlInMinutes = dayInMinutes) => {\n const timeStamp = Date.now();\n items.push({ item, ttlInMinutes, timeStamp });\n };\n const isAlive = ({ ttlInMinutes, timeStamp }) => {\n return timeStamp + ttlInMinutes * 60 * 1000 >= Date.now();\n };\n let inProgress = null;\n return {\n add,\n next: () => {\n let itemData = items.shift();\n while (itemData && !isAlive(itemData)) {\n itemData = items.shift();\n }\n // eslint-disable-next-line better-mutation/no-mutation\n inProgress = itemData?.item || null;\n return inProgress;\n },\n notifyDone: () => {\n // eslint-disable-next-line better-mutation/no-mutation\n inProgress = null;\n },\n isInProgress: () => inProgress !== null,\n getLength: () => items.length\n };\n};\n","import { useSelector } from 'react-redux';\nimport { selectIsFeatureEnabled } from 'tradera/state/environment/selectors';\n\nexport const useIsFeatureEnabled = (featureName) =>\n useSelector(selectIsFeatureEnabled(featureName));\n","export const isSwedenCountryCodeOrUndefined = (countryCodeIso2) =>\n countryCodeIso2 === undefined ||\n countryCodeIso2 === null ||\n countryCodeIso2.toLowerCase() === 'se';\n\nexport const isSwedenCountryNameOrUndefined = (countryName) =>\n countryName === undefined ||\n countryName === null ||\n countryName.toLowerCase() === 'sweden';\n\nexport const isDenmarkCountryCode = (countryCodeIso2) =>\n !isSwedenCountryCodeOrUndefined(countryCodeIso2) &&\n countryCodeIso2.toLowerCase() === 'dk';\n\nexport const areCountryCodesIso2Equal = (first, second) =>\n (first || 'SE').toUpperCase() === (second || 'SE').toUpperCase();\n","import plainDayjs from 'dayjs';\nimport isBetween from 'dayjs/plugin/isBetween';\nimport isSameOrAfter from 'dayjs/plugin/isSameOrAfter';\nimport utc from 'dayjs/plugin/utc';\nimport timezone from 'dayjs/plugin/timezone';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\nimport 'dayjs/locale/sv';\nimport 'dayjs/locale/da';\nimport 'dayjs/locale/de';\nimport 'dayjs/locale/fr';\nimport 'dayjs/locale/nl';\n\nplainDayjs.extend(isBetween);\nplainDayjs.extend(isSameOrAfter);\nplainDayjs.extend(utc);\nplainDayjs.extend(timezone);\nplainDayjs.extend(localizedFormat);\n\nexport const dayjs = plainDayjs;\n\nexport const localizedDayjs =\n (locale) =>\n (...args) =>\n dayjs(...args).locale(locale);\n\nexport const swedishTimeZoneDate = (date, localizedDayjsFn) => {\n // This is a workaround for locale being lost when using .tz() in Nextweb\n const locale = localizedDayjsFn().locale();\n return localizedDayjsFn(date).tz('Europe/Stockholm').locale(locale);\n};\n\nexport const formatUtcDateAsSwedishTimeZoneDate = (date, localizedDayjsFn) =>\n swedishTimeZoneDate(date, localizedDayjsFn).format('D MMM HH:mm');\n\n/**\n * Format a number of seconds to an object of time units\n *\n * @param {number} seconds\n * @param {object} [options]\n * @param {string} [options.startUnit] - Time part to start counting from, empty for all parts\n * @param {string} [options.endUnit] - Time part to stop counting on, empty for all parts\n * @returns {{string: integer}}\n */\nexport const getTimeSpanParts = (seconds, options = {}) => {\n const optionsWithDefaults = {\n startUnit: '',\n endUnit: '',\n ...options\n };\n const parts = {};\n let remaining = seconds;\n let started = !optionsWithDefaults.startUnit;\n for (const [part, length] of Object.entries(TIME_SPAN_UNIT_LENGTHS)) {\n if (!started && part === optionsWithDefaults.startUnit) started = true;\n if (started) {\n if (remaining >= length) {\n parts[part] = Math.floor(remaining / length);\n }\n // eslint-disable-next-line better-mutation/no-mutation\n remaining %= length;\n if (remaining === 0 || optionsWithDefaults.endUnit === part) break;\n }\n }\n return parts;\n};\n\nexport const TIME_SPAN_UNITS = {\n DAYS: 'days',\n HOURS: 'hours',\n MINUTES: 'minutes',\n SECONDS: 'seconds'\n};\n\nconst TIME_SPAN_UNIT_LENGTHS = {\n [TIME_SPAN_UNITS.DAYS]: 24 * 60 * 60,\n [TIME_SPAN_UNITS.HOURS]: 60 * 60,\n [TIME_SPAN_UNITS.MINUTES]: 60,\n [TIME_SPAN_UNITS.SECONDS]: 1\n};\n"],"sourceRoot":""}