{"version":3,"sources":["webpack:///./src/frontend/localization/use-localized-price-formatter.js","webpack:///./src/frontend/state/language/selectors.js","webpack:///./src/frontend/utils/http.js","webpack:///./src/EbaySweden.TouchWeb/static/script/app/ui/google-tagmanager-service.js","webpack:///./src/frontend/lang/constants.mjs","webpack:///./src/frontend/utils/gdpr-settings.js","webpack:///./src/frontend/state/multi-currency/actions.js","webpack:///./src/frontend/state/environment/selectors.js","webpack:///./src/frontend/lang/boot-languages.js","webpack:///./src/EbaySweden.TouchWeb/static/script/packages/logger.js","webpack:///./src/frontend/utils/object.js","webpack:///./src/frontend/utils/nextjs.js","webpack:///./src/backend/i18n/translation-keys.js","webpack:///./src/frontend/state/page/selectors.js","webpack:///./src/frontend/lang/translate.jsx","webpack:///./src/frontend/state/member/reducer.js","webpack:///./src/frontend/localization/countries.js","webpack:///./src/frontend/apps/my-tradera/app/constants/list-types.js","webpack:///./src/EbaySweden.TouchWeb/static/script/packages/analytics.js","webpack:///./src/frontend/state/member/selectors.js","webpack:///./src/frontend/utils/cookie.js","webpack:///./src/frontend/state/multi-currency/selectors.js","webpack:///./src/frontend/hooks/use-location.js","webpack:///./src/frontend/localization/countrycode.js","webpack:///./src/frontend/utils/versions.js","webpack:///./src/frontend/state/environment/native-app-support.js","webpack:///./src/frontend/state/environment/initial-state.js","webpack:///./src/backend/utils/cookies.js","webpack:///./src/frontend/state/environment/native-app-info-helper.js","webpack:///./src/frontend/state/environment/actions.js","webpack:///./src/frontend/state/environment/reducer.js","webpack:///./src/frontend/utils/api.js","webpack:///./src/frontend/constants/hosts.js","webpack:///./src/frontend/utils/url.js","webpack:///./src/frontend/utils/prop-types.js","webpack:///./src/frontend/components/alink/alink.jsx","webpack:///./src/frontend/hooks/use-is-feature-enabled.js","webpack:///./src/frontend/apps/syi/script/app_react/utils/language.js","webpack:///./src/EbaySweden.TouchWeb/static/script/app/ui/google-tagmanager-helper.js","webpack:///./src/frontend/utils/format.js","webpack:///./src/frontend/utils/date.js","webpack:///./src/frontend/utils/cookie-helpers.js","webpack:///./src/frontend/state/shipping-region/selectors.js","webpack:///./src/frontend/state/member/api.js","webpack:///./src/frontend/state/member/initial-state.js","webpack:///./src/frontend/state/member/actions.js","webpack:///./src/frontend/constants/endpoints.js","webpack:///./src/frontend/constants/cookies.js","webpack:///./src/frontend/state/language/initial-state.js","webpack:///./src/frontend/state/language/reducer.js","webpack:///./src/frontend/state/shipping-region/initial-state.js","webpack:///./src/frontend/state/shipping-region/actions.js","webpack:///./src/frontend/state/shipping-region/api.js","webpack:///./src/frontend/state/member/index.js","webpack:///./src/EbaySweden.TouchWeb/static/script/utils/environment.js","webpack:///./src/frontend/state/multi-currency/reducer.js","webpack:///./src/frontend/components/toasts/item-toast.module.scss","webpack:///./src/frontend/components/toasts/item-toast.jsx","webpack:///./src/frontend/components/toasts/message-toast.jsx","webpack:///./src/frontend/services/toasts.js","webpack:///./src/frontend/services/toast-queue.js","webpack:///./src/frontend/utils/is-prerender.js","webpack:///./src/frontend/utils/string.js","webpack:///./src/EbaySweden.TouchWeb/static/script/packages/debounce.js","webpack:///./src/EbaySweden.TouchWeb/static/script/packages/format.js","webpack:///./src/frontend/state/language/api.js","webpack:///./src/frontend/state/language/actions.js","webpack:///./src/EbaySweden.TouchWeb/static/script/packages/init-data.js","webpack:///./src/frontend/utils/location.js","webpack:///./src/frontend/localization/languagecode.js","webpack:///./src/frontend/state/member/action-types.js","webpack:///./src/frontend/state/shipping-region/reducer.js"],"names":["getOptions","preferredCurrency","overrides","currency","code","minimumFractionDigits","decimals","maximumFractionDigits","useLocalizedPriceFormatter","language","useCurrentLanguage","useSelector","selectPreferredCurrency","useCallback","price","formatPrice","rate","useLocalizedPriceFormatterNoConversion","useLocalizedPriceFormatterNoSymbol","style","selectAvailableLanguages","state","available","selectAvailableLanguageCodesIso2","map","x","languageCodeIso2","selectPreferredLanguage","preferred","selectPreferredLanguageCode","DEFAULT_LANGUAGE","selectLocale","country","memberCountryCodeIso2","selectIsForeignLanguageActivated","selectAutomaticTranslationPreference","automaticTranslationPreference","ensureClientOnly","isServer","Error","httpClient","baseUrl","shouldLocalizeUrl","isWebApiClient","axiosWrapper","url","httpClientConfig","axiosCaller","cancelTokenId","axiosConfig","version","initData","utilizeCancelToken","cancel","cancelToken","isWebApiNet5FromFrontendEnabled","featureSwitches","net5Url","matches","match","length","endpointName","replace","getNet5UrlIfEnabled","safeUrl","substring","getSafeUrl","localizedUrl","toLocalizedUrl","getLanguage","axiosWithTokenRefresh","then","checkResponseVersion","response","finalizeResponse","catch","handleError","error","logError","tags","webapiNet5","get","axiosConfigs","authenticated","axios","config","post","payload","put","trpcClient","endpoint","client","unpackResponse","data","command","commandName","query","queryName","defaultClient","touchWebClient","webApiClient","ENDPOINTS","WEB_API","marketingApiClient","CMS_API","MARKETING_PUBLIC_API","searchSuggestionsClient","SEARCH_SUGGESTIONS","memberIdentificationClient","translationDynamicApiClient","shippingRecommendationsClient","spaPageViewTrackingEnabled","constructor","_hasPreviouslyTrackedPage","window","dataLayer","find","item","event","this","isScriptLoaded","loadGtmScript","isNextJs","_newPageFromServer","accountId","process","NEXT_PUBLIC_GOOGLE_TAG_MANAGER_ACCOUNT_ID","w","d","s","l","i","push","Date","getTime","f","getElementsByTagName","j","createElement","async","src","parentNode","insertBefore","document","_getDatalayerObject","output","entry","_reset","Object","keys","undefined","newPage","pageType","initialDataLayer","_pushInitialDataLayer","newSpaPage","buildInitialGtmDataLayerFromInitData","legacyDataLayer","trackAction","category","action","label","value","nonInteractive","eventCategory","eventAction","eventLabel","eventValue","eventNonInteractive","Sentry","type","level","message","trackGtmEvent","eventName","trackPageView","trackLinkClickAndCallback","callback","eventCallback","trackLinkClickAndGotoUrl","location","href","NS_TOUCHWEB","NS_ATTRIBUTES","NS_CATEGORIES","NS_BACKEND","URL_LANGUAGES","I18N_FRONTEND_NAMESPACES","I18N_BACKEND_NAMESPACES","SUPPORTED_LANGUAGES","TRANS_SUFFIX","GdprSettings","getCookie","setCookie","isCategoryEnabled","cookieCategory","COOKIE_CATEGORIES","Essential","encodedConsentCookie","GDPR_CONSENT_COOKIE","consentCookie","decodeURI","RegExp","test","isPerformanceEnabled","Performance","isFunctionalEnabled","Functional","isMarketingEnabled","Marketing","set","performance","functional","marketing","name","expires","options","cookieValue","cookieString","join","dayjs","add","toDate","httpOnly","path","cookie","serialize","String","getCookieFromBrowser","setCookieToBrowser","setPreferredCurrencyThunk","currencyCode","triggerGa","dispatch","getState","a","Analytics","trackEvent","selectIsLoggedIn","createPreferredCurrencyCookie","setPreferredCurrency","setCurrencyIfNotChosen","cookieUtil","readCookie","sv","da","de","includes","createCookie","selectFeatureSwitches","environment","selectIsFeatureEnabled","featureName","i18nInitialized","bootLanguages","translations","touchwebTranslations","attributeTranslations","translationResources","key","namespace","attributeResources","resources","concat","prev","i18n","use","initReactI18next","LanguageDetector","init","initOptions","err","logger","detection","order","htmlTag","html","defaultNS","ns","fallbackLng","debug","keySeparator","nsSeparator","interpolation","escape","str","format","formatNumberWithSeparators","react","useSuspense","missingKeyLoggingConfig","saveMissing","saveMissingTo","missingKeyHandler","missingInterpolationHandler","text","JSON","stringify","whenInitialized","t","scope","sentryException","nullifyUndefinedProperties","obj","mapObject","isUndefined","getElementById","usedKeyPageTypes","getOrCreatePageTypeNamespaces","has","addKey","usedKeys","selectPageType","page","useTranslator","pathType","useTranslation","wait","ready","wrappedT","i18nKey","withTranslator","WrappedComponent","WithTranslator","props","displayName","withUrlLocalizer","WithUrlLocalizer","useUrlLocalizer","urlLocalizer","useRef","current","Trans","children","defaults","isLoggedIn","actionTypes","INITIALIZE","DEFAULT_ACTION","default","SET_IS_FETCHING_GEOLOCATION","isFetchingGeolocation","SET_GEOLOCATION","geolocation","FAILED_LOADING_GEOLOCATION","SET_MEMBER_HERO_IMAGE","memberHeroImage","max","med","min","bannedCountries","removeBannedCountries","countryCodeIso2","toLowerCase","getAvailableCountries","countries","filter","mapCountryCodeToCountryKey","b","countryCode","lokaliseKey","ad","ae","af","ag","ai","al","am","an","ao","aq","ar","as","at","au","aw","az","ba","bb","bd","be","bf","bg","bh","bi","bj","bm","bn","bo","br","bs","bt","bv","bw","by","bz","ca","cc","cd","cf","cg","ch","ci","ck","cl","cm","cn","co","cr","cu","cv","cx","cy","cz","dj","dk","dm","do","dz","ec","ee","eg","eh","er","es","et","fi","fj","fk","fm","fo","fr","fx","ga","gb","gd","ge","gf","gh","gi","gl","gm","gn","gp","gq","gr","gs","gt","gu","gw","gy","hk","hm","hn","hr","ht","hu","id","ie","il","in","io","iq","ir","is","it","jm","jo","jp","ke","kg","kh","ki","km","kn","kp","kr","kw","ky","kz","la","lb","lc","li","lk","lr","ls","lt","lu","lv","ly","ma","mc","md","mg","mh","mk","ml","mm","mn","mo","mp","mq","mr","ms","mt","mu","mv","mw","mx","my","mz","na","nc","ne","nf","ng","ni","nl","no","np","nr","nu","nz","om","pa","pe","pf","pg","ph","pk","pl","pm","pn","pr","ps","pt","pw","py","qa","re","ro","ru","rs","rw","sa","sb","sc","sd","se","sg","sh","si","sj","sk","sl","sm","sn","so","sr","st","sy","sz","tc","td","tf","tg","th","tj","tk","tl","tm","tn","to","tr","tt","tv","tw","tz","ua","ug","um","us","uy","uz","va","vc","ve","vg","vi","vn","vu","wf","ws","ye","yt","yu","za","zm","zw","LIST_VIEW_TYPES","BASIC","NORMAL","PICK_LIST","PAGE_LIST_TYPES","BUYER_ACTIVE_ITEMS","BUYER_PURCHASES","BUYER_ITEMS_LOST","SELLER_ACTIVE","SELLER_SOLD","SELLER_NOT_SOLD","PAGE_BULK_ACTIONS","ACTIVE_CANCEL","UNSOLD_RESTART","BUYER_MARK_PAID","BUYER_SHOW_ACTIVE","BUYER_HIDE_ACTIVE","PURCHASES_SHOW","pushToDataLayer","pathname","isNonInteractive","analyticsData","userTriggered","trackTiming","variable","hitCallback","member","selectGeolocation","selectMemberId","memberId","selectMemberEmail","memberEmail","selectMemberFirstName","memberFirstName","selectMemberLastName","memberLastName","selectMemberCountryCodeIso2","selectIsOutsideSweden","isoCode","showDanishFromCountry","fromCountry","selectShippingRegionCountryCodeIso2","areCountryCodesIso2Equal","selectMemberTown","memberTown","CookieUtil","gdpr","segment","convertToExpiresStr","expiresStr","Number","Infinity","toUTCString","cookieKey","domain","secure","CATEGORIZED_COOKIES","COOKIE_DEFAULT_CATEGORY","encodeURIComponent","protocol","hasCookie","eraseCookie","selectCurrencies","multiCurrency","currencies","c","selectIsPreferredCurrencySEK","selectShowCurrencySelection","enabled","useLocation","request","isSwedenCountryCodeOrUndefined","isSwedenCountryNameOrUndefined","countryName","isDenmarkCountryCode","first","second","toUpperCase","parseAppVersion","split","number","isNaN","major","minor","patch","isSupportedMinimumVersion","appVersionString","minimumVersionString","appVersion","minimumVersion","getNativeAppSupport","isNativeAppContext","isHybridAppContext","hybridAppDevice","hybridAppVersion","appOsVersion","isIOS","isAndroid","isHybridAppContextForAndroid","Boolean","isHybridAppContextForIos","isIos13","isNativeAppWithApplyPaySupport","isNativeAppWithSwishCallbackSupport","getCookieNameForEnvironment","isDev","NATIVE_APP_COOKIE_AND_HEADER_CONFIG","osVersion","header","initDataName","appDevice","appContext","appLanguage","createNativeAppCookieValue","nativeAppInfo","valueObject","extractNativeAppInfoFromCookie","nativeAppCookieString","parse","decodeURIComponent","getVersionUrl","queryParameters","next","preferredLanguageCode","updateEnvironmentHash","environmentHash","headers","setEnvironmentHash","setIsSpaNavigationEnabled","getAndUpdateNativeAppInfo","nativeAppInfoFromInitData","extractNativeAppInfoFromInitData","nativeAppCookieValue","NATIVE_APP_ENVIRONMENT","initEnvironment","geoPublicApiBaseUrl","isSinglePageApp","splitTests","splitTestGroups","webLiveUrl","initialState","isMobileDevice","isMobile","isMobileSafari","isSpaNavigationEnabled","frameElement","variables","PUBLIC_GEO_PUBLIC_API_BASE_URL","PUBLIC_WEB_LIVE_URL","getInitialState","initialize","slice","createSlice","reducers","_state","actions","reducer","API_ERRORS","IGNORE_ME","ABORTED","CANCELLED","NETWORK","TIMEOUT","VERSION_MISMATCH","LOGGED_OUT","defaultJsonRequestHeaders","Accept","withCredentials","notAuthenticated","isUnauthorized","statusCode","submitOriginalRequest","antiCacheRegExp","handleMissingAuthToken","refreshAccessToken","TOUCHWEB_URL","handleErrorAfterRefresh","errorAfterRefreshToken","status","reject","handleUnauthorized","checkLoginState","errorResponseInterceptor","responseString","responseStatus","errorCode","isMissingAuthToken","axiosInstance","instance","create","interceptors","cancelTokens","tokenId","CancelToken","source","token","checkResponseLoggedOut","statusHandlers","toString","isCancel","reloadOnUnauthorized","reload","SPA_PATH_REGEX","formatQueryParams","queryParams","categoryId","formattedQueryParams","isSpaLink","urlOrPath","stripCategoryIdFromQueryParameters","stripHost","HOSTS","stripItmFromQueryParameters","itm_source","itm_medium","stripPaginationFromQueryParameters","spage","paging","fe","stripSavedQueryNameFromQueryParameters","savedQueryName","toAbsoluteUrl","relativeUrl","toAbsoluteUrlFromObject","search","webApiUrl","indexOf","isAbsolute","isAbsoluteUrl","urlObject","origin","localisedPathname","setLanguagePrefix","toQueryParameters","qs","ignoreQueryPrefix","toRelativeTraderaUrl","toSearchString","addQueryPrefix","encode","skipNulls","arrayFormat","languagePrefix","firstMatch","index","getLanguagePrefixFromUrl","getBackToHereRedirectUrl","forceRedirect","Math","round","random","host","PropTypes","relativeOrAbsoluteUrlString","propName","TypeError","URIError","PRODUCTION_ORIGIN","NEXTWEB_PATHS","vipPathRegex","isLinkToNextWebPage","searchParams","some","nextwebPath","ALink","useLink","givenOnClick","onClick","otherProps","useDispatch","isNextWebVipSpaNavigationEnabled","useIsFeatureEnabled","handleSpaNavigationClick","evt","absoluteUrl","isRelativeUrl","getRelativeUrl","prefetch","onMouseEnter","e","stopPropagation","propTypes","defaultProps","toLocalizedRiotUrl","querySelector","getAttribute","userLanguage","memberHashedEmail","memberEmailSha256","memberEmailMd5","memberCountry","loginState","isNotInIframe","self","top","blueshiftEventApiKey","isQuantcastConsentEnabled","isTikTokPixelEnabled","isDigitalAudienceTrackingEnabled","quantcastSite","formatEndDate","endDateInput","nowDateInput","endDate","swedishTimeZoneDate","now","isSameOrAfter","hours","diff","minutes","timeParts","count","isAfter","separator","isLocaleFormattingSupportedInBrowser","toLocaleString","toLocaleStringSupportsLocales","Intl","NumberFormat","formatSellerDsrAverage","locale","overrideOptions","defaultOptions","currencyDisplay","useGrouping","priceAsNumber","suffix","formattedPrice","getCurrencySymbol","formatDateWithDayOfWeek","dateString","weekday","year","month","day","DateTimeFormat","plainDayjs","extend","isBetween","utc","timezone","localizedFormat","localizedDayjs","date","localizedDayjsFn","formatUtcDateAsSwedishTimeZoneDate","getTimeSpanParts","seconds","optionsWithDefaults","startUnit","endUnit","parts","remaining","started","TIME_SPAN_UNIT_LENGTHS","part","floor","TIME_SPAN_UNITS","DAYS","HOURS","MINUTES","SECONDS","getCookieFromString","selectShowRegionSelection","selectAvailableShippingCountries","shippingRegion","availableShippingCountries","selectShippingCountry","shippingCountry","selectIsLoadingAvailableShippingCountries","isLoadingAvailableShippingCountries","selectHasLoadedAvailableShippingCountries","hasLoadedAvailableShippingCountries","selectIsSwedishVisitor","selectIsDanishVisitor","selectShowLocalizationRegionPicker","localizationRegionPickerEnabled","regionPickerDismissed","geoLocation","getLanguageFromCountryCode","gpsMatchesLanguage","getGeoPublicApiLocationUrl","geoPublicBaseUrl","originalUrl","forceGeoDevMatch","FORCE_GEO_DEV","forceGeoDevCookie","cleanedMemberAlias","facebookId","memberAlias","memberDetailedSellerRatingAverage","memberBirthdate","hasTraderaPay","initializeServerMember","defaultAction","setIsFetchingGeolocation","setMemberHeroImage","getGeolocation","fetchGeolocation","removeShippingCountryCookieIfSwedish","getSiteBaseUrl","PUBLIC_TOUCHWEB_WINDOW_LOCATION_ORIGIN","touchWebUrl","AVAILABLE_SHIPPING_COUNTRIES","BANK_ID_AUTHENTICATE","BANK_ID_PROGRESS","BRAND_LIST_PAGE","BRAND_PAGE","CART_UPDATE_SUMMARY","CART_OVERVIEW_VIEW","CART_ADD_ITEM","CART_REMOVE_ITEMS","CART_SET_ITEM_QUANTITY","CHARITY_EARNINGS_TICKER","cmsApiUrl","COMBINED_SHIPPING_UPSELL","FAVORITE_SELLER_ADD","FAVORITE_SELLER_REMOVE","FAVOURITE_SELLERS","GET_PROFILE_FEEDBACK_ITEMS","HYPERWALLET_PAYOUT_COMPLETE","HYPERWALLET_PAYOUT_TOKEN","HYPERWALLET_PAYOUT","INTERNATIONAL_SHIPPING_CALCULATOR","ITEM_DESCRIPTION","itemId","ITEM_DISCOUNT_QUOTA","LAST_CHANCE","MEMBER_PAYOUT_SETTINGS_REMOVE","MEMBER_PAYOUT_SETTINGS","MEMBER_SYSTEM_MESSAGES","ORDER_CHECKOUT_CONFIRMATION","ORDER_CHECKOUT_PAYMENT","orderCheckoutPaymentUrl","ORDER_CHECKOUT_REQUEST_COMBINED_PRICE","ORDER_CHECKOUT_CREATE_UNCOMMITTED_PURCHASE_ORDER","ORDER_PURCHASE_SHOP_ITEMS","PAYMENT_SWISH_OPTOUT","PERSONALISED_SUGGESTIONS","SEARCH","SELLING_CAMPAING_CODE","SELLING_DRAFT_LOAD_FROM_TEMPLATE","SELLING_DRAFT_SAVE","SELLING_DRAFT","draftId","SELLING_DRAFTS_DELETE","SELLING_DRAFTS","SELLING_ITEM_PUBLISH","SELLING_ITEM_STATUS","SELLING_ITEM_UPDATE","SELLING_PREVIEW","SELLING_SCRIBE_DURATION","SELLING_SCRIBE_INCREMENT","SELLING_SCRIBE_SESSION_DURATION","SELLING_SCRIBE_SESSION_START","SELLING_SCRIBE_VALIDATION_ERRORS","SELLING_SHIPPING_CALCULATOR","SELLING_TEMPLATE_SAVE","SELLING_TEMPLATE","templateId","SELLING_TEMPLATES_COUNT","SELLING_TEMPLATES_DELETE","SELLING_TEMPLATES","SETTINGS","SHIPPING_PROVIDERS","SWISH_APP2APP_CALLBACK","SWISH_APP2APP_CALLBACK_MARK_AS_PAID","TRANSLATE_PROFILE_FEEDBACKITEMS","WISHLIST","WISHLIST_ADD","WISHLIST_REMOVE","UPI","purchaseOrderId","INR","PURCHASE_ORDER","SHIPPING_CHECKOUT_DELETE","DEFAULT_COOKIES","ITEM_LAYOUT","SITE_LAYOUT","MYTRADERA_DEFAULT_COOKIES","LIST_VIEW_TYPE","ITEMS_PER_PAGE","SHOW_FILTERS","LIST_VIEW_TYPE_BUYER_ACTIVE_ITEMS","LIST_VIEW_TYPE_BUYER_PURCHASES","LIST_VIEW_TYPE_BUYER_ITEMS_LOST","LIST_VIEW_TYPE_SELLER_ACTIVE","LIST_VIEW_TYPE_SELLER_SOLD","LIST_VIEW_TYPE_SELLER_NOT_SOLD","GDPR_CONSENT_ALERT_DISMISSED","REGION_PICKER_DISMISSED","SHIPPING_COUNTRY","CART_ID","SHIP_TO_SWEDEN_DISCLAIMER_DISMISSED","getInitialPreferredLanguage","availableLanguages","defaultLanguage","availableIsoCodes","lang","getLanguageDisplayName","capitalize","DisplayNames","of","languageSlice","initServerLanguage","preferredLanguage","setPreferred","setAutomaticTranslationPreference","isFunctionalCookiesEnabled","hasRegionPickerDismissedCookie","shippingCountryCookieValue","updateShippingRegion","expireDate","setShippingCountry","setDefaultShippingCountry","getAvailableShippingCountries","beginLoadingAvailableShippingOptions","shippingCountries","availableCountries","setAvailableShippingCountries","onLocalizationShippingRegionSelected","setPreferredLanguage","initializeFromInitData","warnIfDevBuild","moduleName","console","log","onModuleLoaded","isModuleLoaded","body","MutationObserver","mutationsList","attributeName","observe","attributes","resolveCurrency","preferredCurrencyCookieValue","multiCurrencySlice","ItemToast","imageUrl","itemUrl","shortDescription","eventData","className","styles","title","alt","ToastMessage","localizedPriceFormatter","newLeadingBid","newLeadingBidAmount","timeLeftMinutes","MessageToast","items","inProgress","queuedToasts","ttlInMinutes","timeStamp","itemData","shift","notifyDone","isInProgress","getLength","openNextToast","nextItem","queueLength","toastOptions","autoClose","onClose","toast","React","handleNotification","visibilityState","showItemOutbiddedToast","showItemFirstBidToast","showItemSoldToast","showItemWonToast","showItemPaidToast","showItemWishListReminderToast","showSuccessToast","TYPE","SUCCESS","showErrorToast","ERROR","showInfoToast","INFO","isPrerender","userAgent","debounce","func","immediate","timeout","context","args","arguments","later","apply","callNow","clearTimeout","setTimeout","formatNumber","formatMe","api","locationUtils","reloadLocalized","initDataEL","getInitData","force","isSwedishOrUndefined","getCountryCodeFromLanguage","languageCode","en","areLanguageCodesIso2Equal","shippingRegionSlice","dismissLocalizationRegionPicker","prepare"],"mappings":"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,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJC,GAAI,aACJ5T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","file":"script/chunks/chunk.default~resolution~swedish-company~swedish-private.02b102f6db.js","sourcesContent":["import { useCallback } from 'react';\nimport { useCurrentLanguage } from 'tradera-lang/translate';\nimport { formatPrice } from 'tradera-utils/format';\nimport { useSelector } from 'react-redux';\nimport { selectPreferredCurrency } from 'tradera-state/multi-currency/selectors';\n\nconst getOptions = (preferredCurrency, overrides = {}) => ({\n currency: preferredCurrency.code,\n minimumFractionDigits: preferredCurrency.decimals,\n maximumFractionDigits: preferredCurrency.decimals,\n ...overrides\n});\n\nexport const useLocalizedPriceFormatter = () => {\n const { language } = useCurrentLanguage();\n const preferredCurrency = useSelector(selectPreferredCurrency);\n return useCallback(\n price =>\n formatPrice(\n preferredCurrency.rate * price,\n language,\n getOptions(preferredCurrency)\n ),\n [language, preferredCurrency]\n );\n};\n\nexport const useLocalizedPriceFormatterNoConversion = () => {\n const { language } = useCurrentLanguage();\n const preferredCurrency = useSelector(selectPreferredCurrency);\n return useCallback(\n price => formatPrice(price, language, getOptions(preferredCurrency)),\n [language, preferredCurrency]\n );\n};\n\nexport const useLocalizedPriceFormatterNoSymbol = () => {\n const { language } = useCurrentLanguage();\n const preferredCurrency = useSelector(selectPreferredCurrency);\n return useCallback(\n price =>\n formatPrice(\n preferredCurrency.rate * price,\n language,\n getOptions(preferredCurrency, {\n style: 'decimal'\n })\n ),\n [language, preferredCurrency]\n );\n};\n","import { DEFAULT_LANGUAGE } from 'tradera-lang/constants.mjs';\n\nexport const selectAvailableLanguages = state => state.language.available;\n\nexport const selectAvailableLanguageCodesIso2 = state =>\n state.language.available.map(x => x.languageCodeIso2);\n\nexport const selectPreferredLanguage = state => state.language.preferred;\n\nexport const selectPreferredLanguageCode = state =>\n state.language.preferred?.languageCodeIso2 || DEFAULT_LANGUAGE;\n\nexport const selectLocale = state => {\n const language = selectPreferredLanguageCode(state);\n const country = state.language.memberCountryCodeIso2 || 'SE';\n\n return `${language}-${country}`;\n};\n\nexport const selectIsForeignLanguageActivated = state =>\n selectPreferredLanguage(state).languageCodeIso2 !== DEFAULT_LANGUAGE;\n\nexport const selectAutomaticTranslationPreference = state =>\n state.language.automaticTranslationPreference;\n","import ENDPOINTS from 'tradera-constants/endpoints';\nimport {\n axiosWithTokenRefresh,\n checkResponseVersion,\n finalizeResponse,\n handleError,\n utilizeCancelToken,\n axiosConfigs,\n logError\n} from 'tradera-utils/api';\nimport initData from 'init-data';\nimport { toLocalizedUrl } from 'tradera-utils/url';\nimport { getLanguage } from 'tradera-apps/syi/script/app_react/utils/language';\nimport { isServer } from 'tradera-utils/nextjs';\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, url) => {\n if (baseUrl.endsWith('/') && url.startsWith('/')) {\n return baseUrl + url.substring(1);\n }\n return baseUrl + url;\n};\n\nconst getNet5UrlIfEnabled = url => {\n const matches = url.match(/^\\/(\\w+)\\//);\n if (matches.length == 2) {\n const endpointName = matches[1];\n\n if (initData?.featureSwitches?.[`webapi-${endpointName}-net5`]) {\n return url.replace(endpointName, `${endpointName}-net5`);\n }\n }\n\n return url;\n};\n\nconst httpClient = (baseUrl, shouldLocalizeUrl, isWebApiClient) => {\n const axiosWrapper = (url, httpClientConfig, axiosCaller) => {\n let { 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 isWebApiNet5FromFrontendEnabled =\n initData?.featureSwitches?.['webapi-net5-from-frontend'];\n const net5Url =\n isWebApiClient && isWebApiNet5FromFrontendEnabled\n ? getNet5UrlIfEnabled(url)\n : url;\n const safeUrl = getSafeUrl(baseUrl, net5Url);\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 .catch(error => {\n if (isWebApiClient && isWebApiNet5FromFrontendEnabled) {\n logError(error, {\n tags: {\n webapiNet5: net5Url !== url\n }\n });\n }\n throw error;\n });\n };\n\n return {\n get: (url, httpClientConfig = axiosConfigs.authenticated) => {\n ensureClientOnly();\n return axiosWrapper(url, httpClientConfig, (axios, url, config) =>\n axios.get(url, config)\n );\n },\n post: (url, payload, httpClientConfig = axiosConfigs.authenticated) => {\n ensureClientOnly();\n return axiosWrapper(url, httpClientConfig, (axios, url, config) =>\n axios.post(url, payload, config)\n );\n },\n put: (url, payload, httpClientConfig = axiosConfigs.authenticated) => {\n ensureClientOnly();\n return axiosWrapper(url, httpClientConfig, (axios, url, config) =>\n axios.put(url, payload, config)\n );\n }\n };\n};\n\nconst trpcClient = endpoint => {\n const client = httpClient(`/api/${endpoint}`, false);\n const unpackResponse = ({ data }) => data;\n return {\n command: (commandName, payload, httpClientConfig) =>\n client\n .post(`/commands/${commandName}`, payload, httpClientConfig)\n .then(unpackResponse),\n query: (queryName, 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, true);\nexport const cmsApiClient = httpClient(ENDPOINTS.CMS_API);\nexport const marketingApiClient = httpClient(ENDPOINTS.MARKETING_PUBLIC_API);\nexport const searchSuggestionsClient = httpClient(ENDPOINTS.SEARCH_SUGGESTIONS);\nexport const memberIdentificationClient = trpcClient('member-identification');\nexport const translationDynamicApiClient = trpcClient(\n 'translation-dynamic-api'\n);\nexport const shippingRecommendationsClient = trpcClient(\n 'shipping-recommendations'\n);\n","/* eslint-disable better-mutation/no-mutation */\n\n/**\n *\n * # track events:\n * import GtmService from 'static/script/app/ui/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 './google-tagmanager-helper';\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\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 window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(payload);\n }\n\n _getDatalayerObject() {\n let output = {};\n if (window.dataLayer) {\n for (let 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 let data = this._getDatalayerObject();\n for (let 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 (let entry of window.legacyDataLayer) {\n window.dataLayer.push({\n event: '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\nexport default new GoogleTagManagerService();\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'];\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 * 60 * 1000;\n","/***\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 let consentCookie = decodeURI(encodedConsentCookie);\n\n if (!consentCookie || consentCookie.length === 0) {\n return true;\n }\n\n let 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()\n .add(1, 'years')\n .toDate()\n );\n this.setCookie(cookieString);\n }\n}\n\nexport default new GdprSettings(getCookieFromBrowser, setCookieToBrowser);\n","import { Analytics } from 'packages';\nimport cookieUtil from 'tradera-utils/cookie';\nimport { setPreferredCurrency } from './reducer';\nimport { selectIsLoggedIn } from 'tradera-state/member/selectors';\nimport { touchWebClient } from 'tradera-utils/http';\nimport { selectPreferredLanguage } from 'tradera-state/language/selectors';\n\nexport const setPreferredCurrencyThunk = (\n currencyCode,\n triggerGa = true\n) => async (dispatch, getState) => {\n if (triggerGa) {\n Analytics.trackEvent({\n category: 'Settings',\n action: 'Currency',\n label: currencyCode\n });\n }\n\n if (selectIsLoggedIn(getState())) {\n await touchWebClient.post('my/profile/save-currency-setting', {\n currencyCode\n });\n }\n\n createPreferredCurrencyCookie(currencyCode);\n dispatch(setPreferredCurrency({ currencyCode }));\n};\n\nexport const setCurrencyIfNotChosen = currencyCode => (dispatch, getState) => {\n if (\n cookieUtil.readCookie('preferred_currency') ||\n selectIsLoggedIn(getState())\n ) {\n return;\n }\n\n const { languageCodeIso2 } = selectPreferredLanguage(getState());\n\n const map = {\n sv: 'SEK',\n da: 'DKK',\n de: 'EUR'\n };\n\n if (Object.keys(map).includes(languageCodeIso2)) {\n dispatch(setPreferredCurrencyThunk(map[languageCodeIso2], false));\n } else {\n dispatch(setPreferredCurrencyThunk(currencyCode, false));\n }\n};\n\nconst yearInMilliseconds = 1000 * 60 * 60 * 24 * 365;\nconst createPreferredCurrencyCookie = currencyCode => {\n cookieUtil.createCookie(\n 'preferred_currency',\n currencyCode,\n new Date(new Date().getTime() + yearInMilliseconds)\n );\n};\n","export const selectFeatureSwitches = state => state.environment.featureSwitches;\nexport const selectIsFeatureEnabled = featureName => state =>\n selectFeatureSwitches(state)?.[featureName] === true;\n\nexport const selectAppInfo = state => ({\n isHybridAppContextForAndroid:\n state.environment.isHybridAppContextForAndroid,\n isHybridAppContextForIos: state.environment.isHybridAppContextForIos,\n isHybridAppContext: state.environment.isHybridAppContext,\n isNativeAppContext: state.environment.isNativeAppContext,\n hybridAppVersion: state.environment.hybridAppVersion\n});\n\nexport const selectEnvVariables = state => state.environment.variables;\n","/* eslint-disable better-mutation/no-mutation */\n\nimport i18n from 'i18next';\nimport { logger } from 'packages';\nimport { initReactI18next } from 'react-i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { toLocalizedUrl } from 'tradera-utils/url';\nimport { formatNumberWithSeparators } from 'tradera-utils/format';\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(\n attributeTranslations\n ).map(([key, value]) => ({ key, value, namespace: 'attributes' }));\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 escape: str => str.replace(/{{/g, '').replace(/}}/g, ''),\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\nconst missingKeyLoggingConfig = {\n saveMissing: true,\n saveMissingTo: 'current',\n missingKeyHandler: (language, namespace, key) => {\n logger(\n `TranslationMissing (javascript) - Unable to find key ${key} (namespace ${namespace}) in language ${language}!`\n );\n },\n missingInterpolationHandler: (text, value) => {\n logger(\n `InterpolationFailure (javascript) - Unable to interpolate the text \"${text}\" fully. The following placeholder values were missing: ${JSON.stringify(\n value\n )}`\n );\n return undefined;\n }\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","import * as Sentry from '@sentry/react';\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 */\nconst logger = (error, scope) => {\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\nexport default logger;\n","import mapObject from 'underscore/modules/mapObject';\nimport isUndefined from 'underscore/modules/isUndefined';\n\nexport const nullifyUndefinedProperties = obj =>\n mapObject(obj, value => (isUndefined(value) ? null : value));\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","import { I18N_FRONTEND_NAMESPACES } from 'tradera-lang/constants.mjs';\n\nconst usedKeyPageTypes = new Map();\n\nconst createNamespaces = () =>\n new Map(I18N_FRONTEND_NAMESPACES.map(namespace => [namespace, new Set()]));\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 => getOrCreatePageTypeNamespaces(pageType);\n","export const selectPageType = state => state.page?.type;\n","import React, { useCallback, 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-backend/i18n/translation-keys.js';\nimport { isServer } from 'tradera-utils/nextjs.js';\nimport { useSelector } from 'react-redux';\nimport { selectPageType } from 'tradera-state/page/selectors';\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 { t, ready } = useTranslation(I18N_FRONTEND_NAMESPACES, {\n wait: true\n });\n const wrappedT = useCallback(\n (...args) => {\n const i18nKey = args[0];\n if (i18nKey.endsWith(TRANS_SUFFIX)) {\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 const options = args[1];\n const namespace = options?.ns || NS_TOUCHWEB;\n addKey(pathType, namespace, i18nKey);\n }\n return t(...args);\n },\n [t, pathType]\n );\n return { t: ready ? wrappedT : () => '...' };\n};\n\n/**\n * Translation HOC, wrapper for react-i18next\n * @param {Component} WrappedComponent\n * @return {Component} The wrapped component.\n */\nexport function withTranslator(WrappedComponent) {\n function WithTranslator(props) {\n const { t } = useTranslator();\n return ;\n }\n\n WithTranslator.displayName = `withTranslator(${WrappedComponent.displayName ||\n WrappedComponent.name}`;\n return WithTranslator;\n}\n\n/**\n * Localization HOC, wrapper for URL-localizer\n * @param {Component} WrappedComponent\n */\nexport function withUrlLocalizer(WrappedComponent) {\n function WithUrlLocalizer(props) {\n const { toLocalizedUrl } = useUrlLocalizer();\n return ;\n }\n\n WithUrlLocalizer.displayName = `withUrlLocalizer(${WrappedComponent.displayName ||\n WrappedComponent.name}`;\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(undefined, { wait: true });\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(undefined, { wait: true });\n const urlLocalizer = useRef(url => toLocalizedUrl(url, i18n.language));\n return { toLocalizedUrl: ready ? urlLocalizer.current : url => url };\n};\n\nexport const Trans = props => {\n const { t, ready } = useTranslation(I18N_FRONTEND_NAMESPACES, {\n wait: true\n });\n const { i18nKey, children, defaults } = props;\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 actionTypes from './action-types';\n\nexport default (state = { isLoggedIn: false }, action) => {\n switch (action.type) {\n case actionTypes.INITIALIZE:\n return {\n ...action.payload\n };\n case actionTypes.DEFAULT_ACTION:\n return {\n ...state,\n default: action.payload\n };\n case actionTypes.SET_IS_FETCHING_GEOLOCATION: {\n const { payload } = action;\n return {\n ...state,\n isFetchingGeolocation: payload.isFetchingGeolocation\n };\n }\n case actionTypes.SET_GEOLOCATION: {\n const { payload } = action;\n return {\n ...state,\n geolocation: payload\n };\n }\n case actionTypes.FAILED_LOADING_GEOLOCATION: {\n return {\n ...state,\n geolocation: null,\n isFetchingGeolocation: false\n };\n }\n case actionTypes.SET_MEMBER_HERO_IMAGE: {\n return {\n ...state,\n memberHeroImage: {\n max: action.payload,\n med: action.payload,\n min: action.payload\n }\n };\n }\n default:\n return state;\n }\n};\n","const bannedCountries = new Set([\n 'by',\n 'cu',\n 'fx',\n 'ir',\n 'kp',\n 'ru',\n 'sy',\n 'ua'\n]);\n\nexport const removeBannedCountries = countryCodeIso2 =>\n !bannedCountries.has(countryCodeIso2.toLowerCase());\n\nexport const getAvailableCountries = t => {\n return Object.keys(countries)\n .filter(removeBannedCountries)\n .map(code => ({\n code,\n name: t(mapCountryCodeToCountryKey(code))\n }))\n .sort((a, b) => (a.name > b.name ? 1 : -1));\n};\n\n// We map this way to ensure that each key in lokalise is present in code.\n// This allows us to clean up unnecessary codes in the future.\nexport const mapCountryCodeToCountryKey = countryCode => {\n const lokaliseKey = countries[countryCode.toLowerCase()];\n if (!lokaliseKey)\n throw `CountryCode ${countryCode} has no mapping to lokalise key`;\n return lokaliseKey;\n};\n\nexport const countries = {\n ad: 'country_ad',\n ae: 'country_ae',\n af: 'country_af',\n ag: 'country_ag',\n ai: 'country_ai',\n al: 'country_al',\n am: 'country_am',\n an: 'country_an',\n ao: 'country_ao',\n aq: 'country_aq',\n ar: 'country_ar',\n as: 'country_as',\n at: 'country_at',\n au: 'country_au',\n aw: 'country_aw',\n az: 'country_az',\n ba: 'country_ba',\n bb: 'country_bb',\n bd: 'country_bd',\n be: 'country_be',\n bf: 'country_bf',\n bg: 'country_bg',\n bh: 'country_bh',\n bi: 'country_bi',\n bj: 'country_bj',\n bm: 'country_bm',\n bn: 'country_bn',\n bo: 'country_bo',\n br: 'country_br',\n bs: 'country_bs',\n bt: 'country_bt',\n bv: 'country_bv',\n bw: 'country_bw',\n by: 'country_by',\n bz: 'country_bz',\n ca: 'country_ca',\n cc: 'country_cc',\n cd: 'country_cd',\n cf: 'country_cf',\n cg: 'country_cg',\n ch: 'country_ch',\n ci: 'country_ci',\n ck: 'country_ck',\n cl: 'country_cl',\n cm: 'country_cm',\n cn: 'country_cn',\n co: 'country_co',\n cr: 'country_cr',\n cu: 'country_cu',\n cv: 'country_cv',\n cx: 'country_cx',\n cy: 'country_cy',\n cz: 'country_cz',\n de: 'country_de',\n dj: 'country_dj',\n dk: 'country_dk',\n dm: 'country_dm',\n do: 'country_do',\n dz: 'country_dz',\n ec: 'country_ec',\n ee: 'country_ee',\n eg: 'country_eg',\n eh: 'country_eh',\n er: 'country_er',\n es: 'country_es',\n et: 'country_et',\n fi: 'country_fi',\n fj: 'country_fj',\n fk: 'country_fk',\n fm: 'country_fm',\n fo: 'country_fo',\n fr: 'country_fr',\n fx: 'country_fx',\n ga: 'country_ga',\n gb: 'country_gb',\n gd: 'country_gd',\n ge: 'country_ge',\n gf: 'country_gf',\n gh: 'country_gh',\n gi: 'country_gi',\n gl: 'country_gl',\n gm: 'country_gm',\n gn: 'country_gn',\n gp: 'country_gp',\n gq: 'country_gq',\n gr: 'country_gr',\n gs: 'country_gs',\n gt: 'country_gt',\n gu: 'country_gu',\n gw: 'country_gw',\n gy: 'country_gy',\n hk: 'country_hk',\n hm: 'country_hm',\n hn: 'country_hn',\n hr: 'country_hr',\n ht: 'country_ht',\n hu: 'country_hu',\n id: 'country_id',\n ie: 'country_ie',\n il: 'country_il',\n in: 'country_in',\n io: 'country_io',\n iq: 'country_iq',\n ir: 'country_ir',\n is: 'country_is',\n it: 'country_it',\n jm: 'country_jm',\n jo: 'country_jo',\n jp: 'country_jp',\n ke: 'country_ke',\n kg: 'country_kg',\n kh: 'country_kh',\n ki: 'country_ki',\n km: 'country_km',\n kn: 'country_kn',\n kp: 'country_kp',\n kr: 'country_kr',\n kw: 'country_kw',\n ky: 'country_ky',\n kz: 'country_kz',\n la: 'country_la',\n lb: 'country_lb',\n lc: 'country_lc',\n li: 'country_li',\n lk: 'country_lk',\n lr: 'country_lr',\n ls: 'country_ls',\n lt: 'country_lt',\n lu: 'country_lu',\n lv: 'country_lv',\n ly: 'country_ly',\n ma: 'country_ma',\n mc: 'country_mc',\n md: 'country_md',\n mg: 'country_mg',\n mh: 'country_mh',\n mk: 'country_mk',\n ml: 'country_ml',\n mm: 'country_mm',\n mn: 'country_mn',\n mo: 'country_mo',\n mp: 'country_mp',\n mq: 'country_mq',\n mr: 'country_mr',\n ms: 'country_ms',\n mt: 'country_mt',\n mu: 'country_mu',\n mv: 'country_mv',\n mw: 'country_mw',\n mx: 'country_mx',\n my: 'country_my',\n mz: 'country_mz',\n na: 'country_na',\n nc: 'country_nc',\n ne: 'country_ne',\n nf: 'country_nf',\n ng: 'country_ng',\n ni: 'country_ni',\n nl: 'country_nl',\n no: 'country_no',\n np: 'country_np',\n nr: 'country_nr',\n nu: 'country_nu',\n nz: 'country_nz',\n om: 'country_om',\n pa: 'country_pa',\n pe: 'country_pe',\n pf: 'country_pf',\n pg: 'country_pg',\n ph: 'country_ph',\n pk: 'country_pk',\n pl: 'country_pl',\n pm: 'country_pm',\n pn: 'country_pn',\n pr: 'country_pr',\n ps: 'country_ps',\n pt: 'country_pt',\n pw: 'country_pw',\n py: 'country_py',\n qa: 'country_qa',\n re: 'country_re',\n ro: 'country_ro',\n ru: 'country_ru',\n rs: 'country_rs',\n rw: 'country_rw',\n sa: 'country_sa',\n sb: 'country_sb',\n sc: 'country_sc',\n sd: 'country_sd',\n se: 'country_se',\n sg: 'country_sg',\n sh: 'country_sh',\n si: 'country_si',\n sj: 'country_sj',\n sk: 'country_sk',\n sl: 'country_sl',\n sm: 'country_sm',\n sn: 'country_sn',\n so: 'country_so',\n sr: 'country_sr',\n st: 'country_st',\n sv: 'country_sv',\n sy: 'country_sy',\n sz: 'country_sz',\n tc: 'country_tc',\n td: 'country_td',\n tf: 'country_tf',\n tg: 'country_tg',\n th: 'country_th',\n tj: 'country_tj',\n tk: 'country_tk',\n tl: 'country_tl',\n tm: 'country_tm',\n tn: 'country_tn',\n to: 'country_to',\n tr: 'country_tr',\n tt: 'country_tt',\n tv: 'country_tv',\n tw: 'country_tw',\n tz: 'country_tz',\n ua: 'country_ua',\n ug: 'country_ug',\n um: 'country_um',\n us: 'country_us',\n uy: 'country_uy',\n uz: 'country_uz',\n va: 'country_va',\n vc: 'country_vc',\n ve: 'country_ve',\n vg: 'country_vg',\n vi: 'country_vi',\n vn: 'country_vn',\n vu: 'country_vu',\n wf: 'country_wf',\n ws: 'country_ws',\n ye: 'country_ye',\n yt: 'country_yt',\n yu: 'country_yu',\n za: 'country_za',\n zm: 'country_zm',\n zw: 'country_zw'\n};\n","export const LIST_VIEW_TYPES = {\n BASIC: 'Basic',\n NORMAL: 'Normal',\n PICK_LIST: 'PickList'\n};\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};\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};\n","/**\n OBSOLETE - use google tag manager service instead:\n src\\EbaySweden.TouchWeb\\static\\script\\app\\ui\\google-tagmanager-service.js\n\n\n * Ported from Applications/TouchWeb/src/EbaySweden.TouchWeb/static/script/app/ui/layout/google-tagmanager.js\n * Best way to import this module is `import * as Analytics from 'analytics'`\n */\n\nimport * as Sentry from '@sentry/react';\n\nexport const pushToDataLayer = payload => {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(payload);\n};\nexport const trackPageView = () =>\n window.ga\n ? ga('send', 'pageview', location.pathname)\n : pushToDataLayer({ event: 'trackPageview' });\nexport const isNonInteractive = analyticsData =>\n analyticsData.userTriggered === undefined\n ? true\n : !analyticsData.userTriggered;\n/**\n * trackTiming\n * @param {*} category\n * @param {*} variable\n * @param {*} value\n * @param {*} label\n */\nexport const trackTiming = (category, variable, value, label = '') =>\n window.ga ? ga('send', 'timing', category, variable, value, label) : false;\n\n/**\n * Track Analytics Event\n */\nexport const trackEvent = analyticsData => {\n if (!analyticsData) {\n return;\n }\n pushToDataLayer({\n event: 'trackEvent',\n eventCategory: analyticsData.category || '',\n eventAction: analyticsData.action || '',\n eventLabel: analyticsData.label || '',\n eventValue: analyticsData.value || '0',\n eventNonInteractive: isNonInteractive(analyticsData),\n hitCallback: analyticsData.hitCallback || []\n });\n\n Sentry.addBreadcrumb({\n type: 'default',\n level: 'info',\n category: isNonInteractive(analyticsData) ? 'tracking' : 'ui-action',\n message: 'Analytics Event',\n data: analyticsData\n });\n};\n\n// Export object for Sinon stubbing\nexport default {\n pushToDataLayer,\n trackEvent,\n trackPageView,\n trackTiming\n};\n","import { selectFeatureSwitches } from 'tradera-state/environment/selectors';\nimport { selectShippingRegionCountryCodeIso2 } from 'tradera-state/shipping-region/selectors';\nimport { areCountryCodesIso2Equal } from 'tradera-localization/countrycode';\n\nexport const selectMember = state => state.member;\n\nexport const selectIsLoggedIn = state => state.member?.isLoggedIn;\n\nexport const selectGeolocation = state => state.member?.geolocation;\n\nexport const selectMemberId = state => state.member?.memberId;\n\nexport const selectMemberEmail = state => state.member?.memberEmail;\n\nexport const selectMemberFirstName = state => state.member?.memberFirstName;\n\nexport const selectMemberLastName = state => state.member?.memberLastName;\n\nexport const selectCurrencyCode = state => state.member?.currencyCode;\n\nexport const selectMemberCountryCodeIso2 = state =>\n state.member?.memberCountryCodeIso2;\n\nexport const selectIsOutsideSweden = state =>\n state.member?.geolocation?.isoCode &&\n state.member?.geolocation?.isoCode.toLowerCase() !== 'se';\n\nexport const showDanishFromCountry = state => {\n const fromCountry =\n selectShippingRegionCountryCodeIso2(state) ||\n selectMemberCountryCodeIso2(state);\n return (\n selectFeatureSwitches(state)['shipping-from-country'] &&\n areCountryCodesIso2Equal(fromCountry, 'DK')\n );\n};\n\nexport const selectMemberTown = state => 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 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","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","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","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 };\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';\n\nconst IPHONE_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\nexport const getInitialServerState = ({\n environmentHash,\n featureToggles = {},\n splitTestGroups = {},\n variables = {},\n version,\n userAgent = IPHONE_USER_AGENT,\n appOsVersion = '',\n hybridAppDevice = '',\n hybridAppVersion = '',\n isNativeAppContext = false,\n isHybridAppContext = false\n} = {}) => {\n const {\n isMobile,\n isMobileSafari,\n isIOS,\n isAndroid\n } = getSelectorsByUserAgent(userAgent);\n\n return {\n ...getNativeAppSupport({\n isNativeAppContext,\n isHybridAppContext,\n hybridAppDevice,\n hybridAppVersion,\n appOsVersion,\n isIOS,\n isAndroid\n }),\n isNativeAppContext,\n hybridAppVersion,\n environment: process.env.NODE_ENV,\n isHybridAppContext,\n isIOS,\n isMobileDevice: isMobile,\n isMobileSafari,\n isSpaNavigationEnabled: true,\n featureSwitches: featureToggles,\n splitTestGroups,\n variables,\n environmentHash,\n version\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 featureSwitches,\n geoPublicApiBaseUrl,\n hybridAppDevice,\n hybridAppVersion,\n isHybridAppContext,\n isNativeAppContext,\n isSinglePageApp,\n splitTests,\n splitTestGroups,\n version,\n webLiveUrl\n}) => {\n return nullifyUndefinedProperties({\n ...getNativeAppSupport({\n isNativeAppContext,\n isHybridAppContext,\n hybridAppDevice,\n hybridAppVersion,\n appOsVersion,\n isIOS,\n isAndroid\n }),\n environment,\n featureSwitches,\n environmentHash,\n isHybridAppContext,\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_GEO_PUBLIC_API_BASE_URL: geoPublicApiBaseUrl,\n PUBLIC_WEB_LIVE_URL: webLiveUrl\n },\n version\n });\n};\n","import { Buffer } from 'buffer';\nimport { isDev } from 'static/script/utils/environment';\n\nconst getCookieNameForEnvironment = name => (isDev() ? `${name}_test` : name);\n\nexport const AUTH_ACCESS_TOKEN_COOKIE_NAME = getCookieNameForEnvironment(\n 'trd_at'\n);\nexport const AUTH_REFRESH_TOKEN_COOKIE_NAME = getCookieNameForEnvironment(\n 'trd_rt'\n);\nexport const AUTH_PERSIST_COOKIE_NAME = getCookieNameForEnvironment('trd_rk');\n\nexport const mightBeLoggedIn = req =>\n Boolean(req.cookies[AUTH_REFRESH_TOKEN_COOKIE_NAME]);\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 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};\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} 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';\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 = extractNativeAppInfoFromInitData(\n initData\n );\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\nexport const initEnvironment = initData => dispatch => {\n const {\n osVersion,\n appDevice,\n appVersion,\n appContext\n } = getAndUpdateNativeAppInfo(initData);\n const {\n environment,\n environmentHash,\n featureSwitches,\n geoPublicApiBaseUrl,\n isSinglePageApp,\n splitTests,\n splitTestGroups,\n version,\n webLiveUrl\n } = initData;\n const initialState = getInitialState({\n appOsVersion: osVersion,\n environment,\n environmentHash,\n featureSwitches,\n geoPublicApiBaseUrl,\n hybridAppDevice: appDevice,\n hybridAppVersion: appVersion,\n isNativeAppContext: appContext === 'Native',\n isHybridAppContext: Boolean(appContext),\n isSinglePageApp,\n splitTests,\n splitTestGroups,\n version,\n webLiveUrl\n });\n dispatch(initialize(initialState));\n};\n","/* eslint-disable better-mutation/no-mutation */\n\nimport { createSlice } from '@reduxjs/toolkit';\nexport const initialState = {\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 }\n});\n\nexport const {\n initialize,\n setEnvironmentHash,\n setIsSpaNavigationEnabled\n} = slice.actions;\nexport const reducer = slice.reducer;\n","import axios from 'axios';\n\nimport { logger } from 'packages/index';\nimport ENDPOINTS from 'tradera-constants/endpoints';\nimport { isServer } from 'tradera-utils/nextjs';\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 => {\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 => statusCode === 401;\n\nconst addAntiCacheParam = url => {\n const antiCacheRegExp = /([?&]_=)[^&]*/;\n return antiCacheRegExp.test(url)\n ? url.replace(antiCacheRegExp, '$1' + new Date().getTime())\n : url + (/\\?/.test(url) ? '&' : '?') + '_=' + new Date().getTime();\n};\n\nconst submitOriginalRequest = async error =>\n axios({\n ...error.config,\n url: addAntiCacheParam(error.config.url)\n });\n\nconst handleMissingAuthToken = async error => {\n const refreshAccessToken = async () =>\n axios.get(ENDPOINTS.TOUCHWEB_URL + 'login/state');\n const handleErrorAfterRefresh = async errorAfterRefreshToken => {\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 => {\n const checkLoginState = async () =>\n axios.get(ENDPOINTS.TOUCHWEB_URL + 'login/state');\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 => {\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 * @param {AxiosInstance} [axiosInstance]\n * @returns {AxiosInstance}\n */\nfunction axiosWithTokenRefresh(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 = {};\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 * @returns {{ cancel: function, cancelToken: function }}\n */\nfunction utilizeCancelToken(tokenId) {\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 * @param {string} version\n * @return {function(*): object|void}\n */\nfunction checkResponseVersion(version = '12.0.0') {\n return response => {\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 * @returns {Function}\n */\nfunction checkResponseLoggedOut() {\n return response => {\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 * @returns { function(*): { data: *, status: integer }}\n */\nfunction finalizeResponse() {\n return response => {\n const { data, status } = response;\n return {\n data,\n status\n };\n };\n}\n\n/**\n * Common network request error handling\n *\n * @param {Object.} statusHandlers - { code: message }\n * @returns {function(*=): Promise}\n */\nfunction handleError(statusHandlers = {}) {\n return error => {\n let status = error.response && error.response.status;\n let 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 in statusHandlers) {\n error.message = statusHandlers[status];\n }\n /* eslint-enable better-mutation/no-mutation */\n throw error;\n };\n}\n\nfunction reloadOnUnauthorized(error) {\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, scope) {\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 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';\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 `^(\\\\/en|\\\\/da|\\\\/de)?/(${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 * Format query params parsed from query string\n *\n * @param {object} queryParams\n * @returns {object}\n */\nconst formatQueryParams = queryParams => {\n const { categoryId, ...rest } = queryParams;\n const formattedQueryParams = 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 url.startsWith('http') ? url.replace(HOSTS.TRADERA, '') : 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 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 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 react router location object to absolute url string\n * @param {{pathname: string, search: string}} url\n * @returns {string}\n */\nconst toAbsoluteUrlFromObject = url =>\n toAbsoluteUrl(\n `${url.pathname ? url.pathname : ''}${url.search ? url.search : ''}`\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(domain => url.indexOf(domain) !== -1);\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 const isAbsolute = isAbsoluteUrl(url);\n\n const urlObject = isAbsolute\n ? new URL(url)\n : new URL(url, 'http://dummy.com');\n const origin = isAbsolute ? urlObject.origin : '';\n const localisedPathname = setLanguagePrefix(\n urlObject.pathname,\n languageCodeIso2\n );\n\n return `${origin}${localisedPathname}${urlObject.search}`;\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\nexport {\n getLanguagePrefixFromUrl,\n formatQueryParams,\n getBackToHereRedirectUrl,\n isAbsoluteUrl,\n isSpaLink,\n stripAttributesFromQueryParameters,\n stripCategoryIdFromQueryParameters,\n stripHost,\n stripItmFromQueryParameters,\n stripPaginationFromQueryParameters,\n stripSavedQueryNameFromQueryParameters,\n toAbsoluteUrl,\n toAbsoluteUrlFromObject,\n toLocalizedUrl,\n toQueryParameters,\n toRelativeTraderaUrl,\n toSearchString\n};\n","import PropTypes from 'prop-types';\n\nexport const relativeOrAbsoluteUrlString = (props, propName) => {\n const prop = props[propName];\n if (typeof prop !== 'string') {\n return new TypeError('URL must be a string');\n }\n try {\n const origin = 'https://example.com';\n const url = new URL(props[propName], origin);\n\n if (!['http:', 'https:'].includes(url.protocol)) {\n return new URIError('URL protocol must be http: or https:');\n }\n } catch (error) {\n return error;\n }\n};\n\nexport default {\n ...PropTypes,\n relativeOrAbsoluteUrlString\n};\n","import React, { useCallback } from 'react';\nimport PropTypes from 'tradera-utils/prop-types';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { Link } from 'react-router-dom';\nimport NextLink from '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 { URL_LANGUAGES } from 'tradera-lang/constants.mjs';\n\nconst PRODUCTION_ORIGIN = 'https://www.tradera.com';\nconst NEXTWEB_PATHS = ['/how-to-buy', '/how-to-sell'];\n\nconst vipPathRegex = new RegExp(\n `(/(${URL_LANGUAGES.join('|')}))?/item/[0-9]+/[0-9]+/`\n);\nconst isVipLink = pathname => vipPathRegex.test(pathname);\n\nconst isLinkToNextWebPage = url =>\n url.searchParams.get('next') === '1' ||\n NEXTWEB_PATHS.some(nextwebPath => url.pathname.endsWith(nextwebPath));\n\nconst getRelativeUrl = url => `${url.pathname}${url.search}`;\n\nconst ALink = ({\n useLink,\n href,\n children,\n onClick: givenOnClick,\n ...otherProps\n}) => {\n const dispatch = useDispatch();\n const location = useLocation();\n const isSpaNavigationEnabled = useSelector(\n state => state.environment.isSpaNavigationEnabled\n );\n const isNextWebVipSpaNavigationEnabled = useIsFeatureEnabled(\n 'next-web-vip-spa-navigation'\n );\n\n const handleSpaNavigationClick = useCallback(\n evt => {\n dispatch(updateEnvironmentHash());\n if (givenOnClick) givenOnClick(evt);\n },\n [dispatch, givenOnClick]\n );\n\n const absoluteUrl = new URL(href, PRODUCTION_ORIGIN);\n const spaNavigationOrigins = [PRODUCTION_ORIGIN, location?.origin];\n const isRelativeUrl = spaNavigationOrigins.includes(absoluteUrl.origin);\n\n if (isNextWebVipSpaNavigationEnabled && isVipLink(href)) {\n absoluteUrl.searchParams.set('next', '1');\n }\n\n // Strip away origin for SPA links\n const relativeUrl = getRelativeUrl(absoluteUrl);\n\n if (isSpaNavigationEnabled && isRelativeUrl) {\n if (isNextJs && isLinkToNextWebPage(absoluteUrl)) {\n // NextJS routing\n return (\n \n e.stopPropagation()}>\n {children}\n \n \n );\n } else if (!isNextJs && !isLinkToNextWebPage(absoluteUrl) && useLink) {\n // react-router-dom\n return (\n \n {children}\n \n );\n }\n }\n\n const url = isRelativeUrl ? relativeUrl : absoluteUrl.toString();\n return (\n \n {children}\n \n );\n};\n\nALink.propTypes = {\n useLink: PropTypes.bool,\n href: PropTypes.relativeOrAbsoluteUrlString,\n children: PropTypes.node.isRequired,\n onClick: PropTypes.func\n};\n\nALink.defaultProps = {\n useLink: false,\n onClick: null\n};\n\nexport default ALink;\n","import { useSelector } from 'react-redux';\nimport { selectIsFeatureEnabled } from 'tradera-state/environment/selectors';\n\nexport const useIsFeatureEnabled = featureName =>\n useSelector(selectIsFeatureEnabled(featureName));\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 { isDev } from 'static/script/utils/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 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 (let [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 process.env.NEXT_PUBLIC_BLUESHIFT_EVENT_API_KEY,\n isSinglePageApp: true,\n isNativeAppContext: environment.isNativeAppContext,\n isQuantcastConsentEnabled,\n isDigitalAudienceTrackingEnabled,\n isTikTokPixelEnabled,\n quantcastSite,\n ...splitTestGroups\n };\n};\n","import { swedishTimeZoneDate } from 'tradera-utils/date';\n\nfunction formatDuration(durationInSeconds, minuteBreakpoint = 60) {\n if (Number.isInteger(durationInSeconds)) {\n if (durationInSeconds > 24 * 60 * 60) return ''; // Show format from server\n\n if (durationInSeconds > 60 * 60)\n return `${Math.floor(\n durationInSeconds / 60 / 60\n )} tim ${Math.floor((durationInSeconds / 60) % 60)} min`;\n\n if (durationInSeconds > minuteBreakpoint)\n return `${Math.floor(durationInSeconds / 60)} min`;\n\n return `${durationInSeconds} s`;\n } else {\n return '';\n }\n}\n\nfunction 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\nfunction 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\nfunction formatSellerDsrAverage(value, locale = 'sv-SE') {\n return value?.toLocaleString(locale, {\n minimumFractionDigits: 1,\n maximumFractionDigits: 1\n });\n}\n\nfunction formatPrice(price, locale = 'sv-SE', overrideOptions = {}) {\n const defaultOptions = {\n style: 'currency',\n currency: 'SEK',\n currencyDisplay:\n locale.startsWith('sv') &&\n (overrideOptions.currency || 'SEK') === 'SEK'\n ? 'symbol'\n : 'code',\n useGrouping: false,\n minimumFractionDigits: 0,\n maximumFractionDigits: 2\n };\n const options = {\n ...defaultOptions,\n ...overrideOptions\n };\n const priceAsNumber = typeof price !== 'number' ? parseInt(price) : price;\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\nfunction getCurrencySymbol(locale = 'sv-SE', overrideOptions = {}) {\n const defaultOptions = {\n style: 'currency',\n currency: 'SEK',\n currencyDisplay:\n locale.startsWith('sv') &&\n (overrideOptions.currency || '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\nfunction formatDateWithDayOfWeek(dateString, locale) {\n if (!isLocaleFormattingSupportedInBrowser) {\n return dateString;\n }\n\n var 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\nexport {\n formatDuration,\n formatEndDate,\n formatNumberWithSeparators,\n formatPrice,\n formatSellerDsrAverage,\n getCurrencySymbol,\n formatDateWithDayOfWeek\n};\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';\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 = locale => (...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)\n .tz('Europe/Stockholm')\n .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","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 {\n selectGeolocation,\n selectIsOutsideSweden\n} from 'tradera-state/member/selectors';\nimport { selectPreferredLanguage } from 'tradera-state/language/selectors';\nimport { selectIsLoggedIn } from 'tradera-state/member';\nimport { getLanguageFromCountryCode } from 'tradera-localization/languagecode';\nimport {\n isSwedenCountryCodeOrUndefined,\n isDenmarkCountryCode\n} from 'tradera-localization/countrycode';\n\nexport const selectShowRegionSelection = state =>\n !selectIsLoggedIn(state) && selectIsOutsideSweden(state);\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(country);\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.localizationRegionPickerEnabled &&\n !state.shippingRegion.regionPickerDismissed &&\n !gpsMatchesLanguage(state);\n","import axios from 'axios';\nimport {\n utilizeCancelToken,\n finalizeResponse,\n handleError\n} from 'tradera-utils/api';\nimport cookieUtil from 'tradera-utils/cookie';\nimport { FORCE_GEO_DEV } from 'tradera-constants/cookies';\nimport { isServer } from 'tradera-utils/nextjs';\n\nexport const fetchGeolocation = geoPublicBaseUrl => {\n if (isServer) {\n return Promise.reject(\n 'Cannot fetch geo information from server as that would give the wrong result.'\n );\n }\n\n const { cancel, cancelToken } = utilizeCancelToken('fetchGeolocation');\n\n if (cancel) cancel();\n\n const search = (window && window.location && window.location.search) || '';\n return axios\n .get(getGeoPublicApiLocationUrl(geoPublicBaseUrl, search), {\n cancelToken\n })\n .then(finalizeResponse())\n .catch(handleError());\n};\n\nexport const getGeoPublicApiLocationUrl = (geoPublicBaseUrl, search) => {\n const originalUrl = `${geoPublicBaseUrl}/api/country`;\n const forceGeoDevMatch = search.match(/force-geo-(.*?)-dev/);\n\n if (forceGeoDevMatch) {\n cookieUtil.createCookie(FORCE_GEO_DEV, forceGeoDevMatch[1]);\n return `${originalUrl}/${forceGeoDevMatch[1]}`;\n }\n\n const forceGeoDevCookie = cookieUtil.readCookie(FORCE_GEO_DEV);\n if (forceGeoDevCookie) {\n return `${originalUrl}/${forceGeoDevCookie}`;\n }\n\n return originalUrl;\n};\n","import { nullifyUndefinedProperties } from 'tradera-utils/object';\n\nexport default initData => {\n const {\n cleanedMemberAlias,\n facebookId,\n isLoggedIn,\n memberAlias,\n memberDetailedSellerRatingAverage,\n memberCountry,\n memberCountryCodeIso2,\n memberEmail,\n memberEmailMd5,\n memberEmailSha256,\n memberFirstName,\n memberId,\n memberHeroImage,\n memberLastName,\n memberBirthdate,\n memberTown,\n hasTraderaPay\n } = initData;\n return nullifyUndefinedProperties({\n cleanedMemberAlias,\n facebookId,\n geolocation: null,\n isLoggedIn,\n memberAlias,\n memberDetailedSellerRatingAverage,\n memberCountry,\n memberCountryCodeIso2,\n memberEmail,\n memberEmailMd5,\n memberEmailSha256,\n memberFirstName,\n memberId,\n memberHeroImage,\n memberLastName,\n memberBirthdate,\n memberTown,\n hasTraderaPay\n });\n};\n","import actionTypes from './action-types';\nimport { fetchGeolocation } from './api';\nimport { setCurrencyIfNotChosen } from 'tradera-state/multi-currency/actions';\nimport { removeShippingCountryCookieIfSwedish } from 'tradera-state/shipping-region/actions';\nimport { API_ERRORS } from 'tradera-utils/api';\nimport { logger } from 'packages/index';\nimport getInitialState from './initial-state';\n\nexport const initialize = initData => ({\n type: actionTypes.INITIALIZE,\n payload: getInitialState(initData)\n});\n\nexport const initializeServerMember = member => ({\n type: actionTypes.INITIALIZE,\n payload: member\n});\n\nexport const defaultAction = data => ({\n type: actionTypes.DEFAULT_ACTION,\n payload: data\n});\n\nconst setIsFetchingGeolocation = isFetchingGeolocation => ({\n type: actionTypes.SET_IS_FETCHING_GEOLOCATION,\n payload: {\n isFetchingGeolocation\n }\n});\n\nconst setGeolocation = payload => ({\n type: actionTypes.SET_GEOLOCATION,\n payload\n});\n\nconst failedLoadingGeolocation = () => ({\n type: actionTypes.FAILED_LOADING_GEOLOCATION\n});\n\nexport const setMemberHeroImage = payload => ({\n type: actionTypes.SET_MEMBER_HERO_IMAGE,\n payload\n});\n\nexport const getGeolocation = () => (dispatch, getState) => {\n dispatch(setIsFetchingGeolocation(true));\n const { PUBLIC_GEO_PUBLIC_API_BASE_URL } = getState().environment.variables;\n return fetchGeolocation(PUBLIC_GEO_PUBLIC_API_BASE_URL)\n .then(response => {\n const { data } = response;\n dispatch(setGeolocation(data));\n dispatch(setCurrencyIfNotChosen(data.currency));\n dispatch(setIsFetchingGeolocation(false));\n dispatch(removeShippingCountryCookieIfSwedish(data));\n return data;\n })\n .catch(error => {\n switch (error.message) {\n case API_ERRORS.ABORTED:\n case API_ERRORS.CANCELLED:\n case API_ERRORS.NETWORK:\n break;\n default:\n logger(error);\n break;\n }\n dispatch(failedLoadingGeolocation());\n });\n};\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\nconst touchWebUrl = isNextJs ? `${getSiteBaseUrl()}/` : initData.touchWebUrl;\n\nexport default {\n AVAILABLE_SHIPPING_COUNTRIES:\n webApiUrl + '/member/getavailablecountriesforshipping',\n BANK_ID_AUTHENTICATE: touchWebUrl + 'bankid/authenticate',\n BANK_ID_PROGRESS: touchWebUrl + 'bankid/progress',\n BRAND_LIST_PAGE: touchWebUrl + 'brands/api',\n BRAND_PAGE: touchWebUrl + 'brand/api/',\n CART_UPDATE_SUMMARY: touchWebUrl + 'shopping/managecart/updatecartsummary',\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 CHARITY_EARNINGS_TICKER:\n touchWebUrl + 'cache/kampanjer/earningsticker/earnings',\n CMS_API: initData.cmsApiUrl,\n COMBINED_SHIPPING_UPSELL: touchWebUrl + 'combined-shipping-upsell/items',\n FAVORITE_SELLER_ADD: touchWebUrl + 'my/favourite-sellers/add',\n FAVORITE_SELLER_REMOVE: touchWebUrl + 'my/favourite-sellers/remove',\n FAVOURITE_SELLERS: webApiUrl + `/discover/favouritesellers-and-items2`,\n GET_PROFILE_FEEDBACK_ITEMS: touchWebUrl + 'profile/model',\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 ITEM_DESCRIPTION: itemId =>\n `${webApiUrl}/browse/item/${itemId}/description`,\n ITEM_DISCOUNT_QUOTA: touchWebUrl + 'profile/shop-item-settings/quotas',\n LAST_CHANCE: touchWebUrl + 'StartPage/LastChance',\n MEMBER_PAYOUT_SETTINGS_REMOVE:\n webApiUrl + '/member/profile/removetraderapaypayoutdestination',\n MEMBER_PAYOUT_SETTINGS:\n webApiUrl + '/member/paymentprovider/memberpayoutsettingsviewmodel',\n MEMBER_SYSTEM_MESSAGES: webApiUrl + '/member/system-messages',\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 PAYMENT_SWISH_OPTOUT: touchWebUrl + 'my/payments2/OptOut',\n PERSONALISED_SUGGESTIONS: '/api/personalised-suggestions',\n SEARCH_SUGGESTIONS: touchWebUrl + 'search/suggestions',\n SEARCH: touchWebUrl + 'search',\n SELLING_CAMPAING_CODE: touchWebUrl + 'selling/api/campaign',\n SELLING_DRAFT_LOAD_FROM_TEMPLATE:\n touchWebUrl + 'selling/api/drafts/from-template',\n SELLING_DRAFT_SAVE: touchWebUrl + 'selling/api/drafts/',\n SELLING_DRAFT: draftId => touchWebUrl + `selling/api/drafts/${draftId}`,\n SELLING_DRAFTS_DELETE: touchWebUrl + 'selling/api/drafts/delete',\n SELLING_DRAFTS: touchWebUrl + 'selling/api/drafts/',\n SELLING_ITEM_PUBLISH: touchWebUrl + 'selling/api/items',\n SELLING_ITEM_STATUS: itemId =>\n touchWebUrl + `selling/api/items/${itemId}/status`,\n SELLING_ITEM_UPDATE: itemId =>\n touchWebUrl + `selling/api/items/${itemId}/update`,\n SELLING_PREVIEW: draftId =>\n touchWebUrl + `selling/api/drafts/preview/${draftId}`,\n SELLING_SCRIBE_DURATION: touchWebUrl + 'selling/api/scribe/duration',\n SELLING_SCRIBE_INCREMENT: touchWebUrl + 'selling/api/scribe/increment',\n SELLING_SCRIBE_SESSION_DURATION:\n touchWebUrl + 'selling/api/scribe/session-duration',\n SELLING_SCRIBE_SESSION_START:\n touchWebUrl + 'selling/api/scribe/session-start',\n SELLING_SCRIBE_VALIDATION_ERRORS:\n touchWebUrl + 'selling/api/scribe/form-validation-errors',\n SELLING_SHIPPING_CALCULATOR: touchWebUrl + 'selling/shippingcalculator',\n SELLING_TEMPLATE_SAVE: touchWebUrl + 'selling/api/templates',\n SELLING_TEMPLATE: templateId =>\n touchWebUrl + `selling/api/templates/${templateId}`,\n SELLING_TEMPLATES_COUNT: touchWebUrl + 'selling/api/templates-count',\n SELLING_TEMPLATES_DELETE: touchWebUrl + 'selling/api/templates/delete',\n SELLING_TEMPLATES: touchWebUrl + 'selling/api/templates',\n SETTINGS: touchWebUrl + 'profile/shop-item-settings/settings',\n SHIPPING_PROVIDERS: webApiUrl + '/selling/shippingproviderswithproducts',\n SWISH_APP2APP_CALLBACK: 'shopping/payment/swish',\n SWISH_APP2APP_CALLBACK_MARK_AS_PAID:\n webApiUrl + '/shopping/payment/swish-app2app-paymentcallback',\n TOUCHWEB_URL: touchWebUrl,\n TRANSLATE_PROFILE_FEEDBACKITEMS: webApiUrl + '/member/feedback/translated',\n WEB_API: webApiUrl,\n WISHLIST: touchWebUrl + 'my/api/wish-list',\n WISHLIST_ADD: touchWebUrl + 'shopping/wishlist/add',\n WISHLIST_REMOVE: touchWebUrl + 'shopping/wishlist/remove',\n UPI: purchaseOrderId =>\n webApiUrl + '/member/uppo-strike/?PurchaseOrderId=' + purchaseOrderId,\n INR: purchaseOrderId =>\n webApiUrl + '/member/ponr-strike/?PurchaseOrderId=' + 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 { 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: 365\n },\n ITEMS_PER_PAGE: {\n key: 'MyTradera_ItemsPerPage',\n default: '25',\n length: 365\n },\n SHOW_FILTERS: {\n key: 'MyTradera_ShowFiltersToolbar',\n default: 'hidden',\n length: 365\n },\n LIST_VIEW_TYPE_BUYER_ACTIVE_ITEMS: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.BUYER_ACTIVE_ITEMS,\n default: null,\n length: 365\n },\n LIST_VIEW_TYPE_BUYER_PURCHASES: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.BUYER_PURCHASES,\n default: null,\n length: 365\n },\n LIST_VIEW_TYPE_BUYER_ITEMS_LOST: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.BUYER_ITEMS_LOST,\n default: null,\n length: 365\n },\n LIST_VIEW_TYPE_SELLER_ACTIVE: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.SELLER_ACTIVE,\n default: null,\n length: 365\n },\n LIST_VIEW_TYPE_SELLER_SOLD: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.SELLER_SOLD,\n default: null,\n length: 365\n },\n LIST_VIEW_TYPE_SELLER_NOT_SOLD: {\n key: 'MyTradera_ListViewType_' + PAGE_LIST_TYPES.SELLER_NOT_SOLD,\n default: null,\n length: 365\n }\n};\n\nexport const CURRENCY_SELECTED_BY_USER = 'currency_selected_by_user';\nexport const GDPR_CONSENT_ALERT_DISMISSED = 'gdpr_dismissed_v1';\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 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';\n\nexport const COOKIE_CATEGORIES = {\n Essential: 1,\n Performance: 2,\n Functional: 3,\n Marketing: 4\n};\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_ALERT_DISMISSED]: COOKIE_CATEGORIES.Essential,\n [GDPR_CONSENT_COOKIE]: COOKIE_CATEGORIES.Essential,\n [NATIVE_APP_ENVIRONMENT]: COOKIE_CATEGORIES.Essential,\n [TEST]: COOKIE_CATEGORIES.Essential, // Unit test cookie\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 [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};\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 GDPR_CONSENT_COOKIE,\n REGION_PICKER_DISMISSED,\n SHIPPING_COUNTRY\n];\n","import { nullifyUndefinedProperties } from 'tradera-utils/object';\nimport { capitalize } from 'tradera-utils/string';\nimport {\n SUPPORTED_LANGUAGES,\n DEFAULT_LANGUAGE\n} from 'tradera-lang/constants.mjs';\n\nconst getInitialPreferredLanguage = (\n languageCodeIso2,\n availableLanguages,\n defaultLanguage\n) => {\n const availableIsoCodes = availableLanguages.map(\n lang => lang.languageCodeIso2\n );\n if (\n !!languageCodeIso2 &&\n availableIsoCodes.indexOf(languageCodeIso2) !== -1\n ) {\n return availableLanguages.find(\n l => l.languageCodeIso2 === languageCodeIso2\n );\n }\n\n return defaultLanguage;\n};\n\nconst getLanguageDisplayName = languageCodeIso2 =>\n capitalize(\n // Only works on server side, lacks good browser support\n new Intl.DisplayNames([languageCodeIso2], { type: 'language' }).of(\n languageCodeIso2\n )\n );\n\nexport const getInitialServerLanguage = ({\n preferredLanguage = DEFAULT_LANGUAGE,\n memberCountryCodeIso2 = null,\n automaticTranslationPreference = false\n}) => {\n const defaultLanguage = {\n languageCodeIso2: preferredLanguage,\n displayName: getLanguageDisplayName(preferredLanguage)\n };\n const availableLanguages = SUPPORTED_LANGUAGES.map(languageCodeIso2 => ({\n languageCodeIso2,\n displayName: getLanguageDisplayName(languageCodeIso2)\n }));\n\n return {\n preferred: getInitialPreferredLanguage(\n preferredLanguage,\n availableLanguages,\n defaultLanguage\n ),\n available: availableLanguages,\n memberCountryCodeIso2,\n automaticTranslationPreference\n };\n};\n\nexport default initData => {\n const result = nullifyUndefinedProperties({\n preferred: getInitialPreferredLanguage(\n initData.languageCodeIso2,\n initData.availableLanguages || [],\n initData.defaultLanguage\n ),\n memberCountryCodeIso2: initData.memberCountryCodeIso2,\n available: initData.availableLanguages,\n automaticTranslationPreference: initData.automaticTranslationPreference\n });\n return result;\n};\n","/* eslint-disable better-mutation/no-mutation */\n\nimport { createSlice } from '@reduxjs/toolkit';\nimport getInitialState, { getInitialServerLanguage } from './initial-state';\n\nconst languageSlice = createSlice({\n name: 'language',\n initialState: {},\n reducers: {\n initialize: (_state, { payload }) => {\n return getInitialState(payload);\n },\n initServerLanguage: (_state, { payload }) => {\n return getInitialServerLanguage(payload);\n },\n setPreferred: (state, action) => {\n state.preferred =\n state.available.find(\n language => language.languageCodeIso2 === action.payload\n ) || {};\n },\n setAutomaticTranslationPreference: (state, { payload }) => {\n state.automaticTranslationPreference =\n payload.automaticTranslationPreference;\n }\n }\n});\n\nexport const {\n initialize,\n initServerLanguage,\n setPreferred,\n setAutomaticTranslationPreference\n} = languageSlice.actions;\nexport default languageSlice.reducer;\n","export const getInitialState = ({\n localizationRegionPickerEnabled,\n memberCountryCodeIso2,\n isFunctionalCookiesEnabled,\n hasRegionPickerDismissedCookie,\n shippingCountryCookieValue\n}) => {\n const regionPickerDismissed =\n isFunctionalCookiesEnabled && hasRegionPickerDismissedCookie;\n const preferredShippingCountry = memberCountryCodeIso2\n ? memberCountryCodeIso2\n : isFunctionalCookiesEnabled &&\n !!shippingCountryCookieValue &&\n shippingCountryCookieValue;\n return {\n availableShippingCountries: [],\n isLoadingAvailableShippingCountries: false,\n hasLoadedAvailableShippingCountries: false,\n shippingCountry: { countryCodeIso2: preferredShippingCountry || 'SE' },\n localizationRegionPickerEnabled,\n regionPickerDismissed\n };\n};\n","import cookieUtil from 'tradera-utils/cookie';\nimport {\n REGION_PICKER_DISMISSED,\n SHIPPING_COUNTRY\n} from 'tradera-constants/cookies';\nimport { fetchAvailableShippingCountries } from './api';\nimport {\n selectIsLoadingAvailableShippingCountries,\n selectHasLoadedAvailableShippingCountries\n} from './selectors';\n\nimport {\n initialize,\n setShippingCountry,\n setAvailableShippingCountries,\n beginLoadingAvailableShippingOptions,\n setDefaultShippingCountry\n} from './reducer';\nimport { setPreferredCurrencyThunk } from 'tradera-state/multi-currency/actions';\nimport { setPreferredLanguage } from 'tradera-state/language/actions';\nimport { Analytics } from 'packages';\nimport { getLanguageFromCountryCode } from 'tradera-localization/languagecode';\nimport { selectFeatureSwitches } from 'tradera-state/environment/selectors';\nimport { selectMemberCountryCodeIso2 } from 'tradera-state/member/selectors';\nimport { getInitialState } from './initial-state';\nimport GdprSettings from 'tradera-utils/gdpr-settings';\n\nconst yearInMilliseconds = 1000 * 60 * 60 * 24 * 365;\n\nexport const updateShippingRegion = countryCodeIso2 => dispatch => {\n const expireDate = new Date(new Date().getTime() + yearInMilliseconds);\n cookieUtil.createCookie(SHIPPING_COUNTRY, countryCodeIso2, expireDate);\n\n dispatch(setShippingCountry({ countryCodeIso2 }));\n};\n\nexport const removeShippingCountryCookieIfSwedish = geolocation => dispatch => {\n if (\n geolocation.isoCode === 'SE' &&\n cookieUtil.hasCookie(SHIPPING_COUNTRY)\n ) {\n cookieUtil.eraseCookie(SHIPPING_COUNTRY);\n dispatch(setDefaultShippingCountry());\n }\n};\n\nexport const getAvailableShippingCountries = () => async (\n dispatch,\n getState\n) => {\n if (\n selectIsLoadingAvailableShippingCountries(getState()) ||\n selectHasLoadedAvailableShippingCountries(getState())\n ) {\n return;\n }\n\n dispatch(beginLoadingAvailableShippingOptions());\n const { shippingCountries } = await fetchAvailableShippingCountries();\n dispatch(setAvailableShippingCountries({ shippingCountries }));\n\n if (cookieUtil.hasCookie(SHIPPING_COUNTRY)) {\n dispatch(\n setShippingCountry({\n countryCodeIso2: cookieUtil.readCookie(SHIPPING_COUNTRY)\n })\n );\n }\n};\n\nexport const onLocalizationShippingRegionSelected = ({\n countryCodeIso2,\n currencyCode,\n toLocalizedUrl\n}) => dispatch => {\n const languageCodeIso2 = getLanguageFromCountryCode(countryCodeIso2);\n\n Analytics.trackEvent({\n category: 'Top navigation',\n action: 'Localization menu tooltip',\n label: `Set localization region - ${countryCodeIso2}`\n });\n\n dispatch(getAvailableShippingCountries()); //make sure we have loaded countries\n dispatch(updateShippingRegion(countryCodeIso2));\n dispatch(setPreferredCurrencyThunk(currencyCode));\n dispatch(setPreferredLanguage(languageCodeIso2, toLocalizedUrl));\n};\n\nexport const initializeFromInitData = initData => dispatch => {\n const localizationRegionPickerEnabled =\n initData &&\n initData.featureSwitches &&\n !!initData.featureSwitches['localization-region-picker'];\n const memberCountryCodeIso2 = initData.memberCountryCodeIso2;\n const initialState = getInitialState({\n localizationRegionPickerEnabled,\n memberCountryCodeIso2,\n isFunctionalCookiesEnabled: GdprSettings.isFunctionalEnabled(),\n hasRegionPickerDismissedCookie: cookieUtil.hasCookie(\n REGION_PICKER_DISMISSED\n ),\n shippingCountryCookieValue: cookieUtil.readCookie(SHIPPING_COUNTRY)\n });\n dispatch(initialize(initialState));\n};\n\nexport const initializeFromState = (gdprSettings, ssrCookieUtil) => (\n dispatch,\n getState\n) => {\n const featureToggles = selectFeatureSwitches(getState());\n const memberCountryCodeIso2 = selectMemberCountryCodeIso2(getState());\n const initialState = getInitialState({\n localizationRegionPickerEnabled: !!featureToggles[\n 'localization-region-picker'\n ],\n memberCountryCodeIso2,\n isFunctionalCookiesEnabled: gdprSettings.isFunctionalEnabled(),\n hasRegionPickerDismissedCookie: ssrCookieUtil.hasCookie(\n REGION_PICKER_DISMISSED\n ),\n shippingCountryCookieValue: ssrCookieUtil.readCookie(SHIPPING_COUNTRY)\n });\n dispatch(initialize(initialState));\n};\n","import axios from 'axios';\n\nimport ENDPOINTS from 'tradera-constants/endpoints';\nimport { finalizeResponse, handleError } from 'tradera-utils/api';\nimport { removeBannedCountries } from 'tradera-localization/countries';\n\nexport const fetchAvailableShippingCountries = () =>\n axios\n .get(ENDPOINTS.AVAILABLE_SHIPPING_COUNTRIES)\n .then(finalizeResponse())\n .then(({ data }) => ({\n shippingCountries: data.availableCountries\n .map(country => country.countryCodeIso2.toLowerCase())\n .filter(removeBannedCountries)\n }))\n .catch(handleError());\n","import * as actions from './actions';\nimport reducer from './reducer';\nimport {\n selectIsLoggedIn,\n selectGeolocation,\n selectIsOutsideSweden\n} from './selectors';\n\nexport {\n actions,\n reducer,\n selectIsLoggedIn,\n selectGeolocation,\n selectIsOutsideSweden\n};\n","export const isDev = () =>\n process && process.env && process.env.NODE_ENV !== 'production';\n\nexport const warnIfDevBuild = moduleName => {\n if (isDev()) {\n console.log(\n `%c Warning: This is a Dev build of ${moduleName}`,\n 'background:red; color:white; font-size:18px;'\n );\n }\n};\n\n/**\n * helper function that is called after the header has been loaded. useful when you want to have the redux loaded before you start\n * to dispatch actions.\n * @param {func} callback\n */\nexport const onModuleLoaded = callback => {\n const isModuleLoaded = () =>\n window.document.body.getAttribute('data-module-loaded') === 'true';\n\n try {\n if (isModuleLoaded()) {\n callback();\n }\n let observer = new MutationObserver(mutationsList => {\n const element = mutationsList.filter(\n item => item.attributeName === 'data-module-loaded'\n );\n if (element !== null && isModuleLoaded()) {\n callback();\n }\n });\n observer.observe(window.document.body, { attributes: true });\n // eslint-disable-next-line no-empty\n } catch (error) {}\n};\n","import { createSlice } from '@reduxjs/toolkit';\n\nconst resolveCurrency = (enabled, preferredCurrencyCookieValue, currencies) => {\n if (!enabled || !preferredCurrencyCookieValue) {\n return null;\n }\n return (\n currencies.find(\n currency => currency.code === preferredCurrencyCookieValue\n ) || null\n );\n};\n\nconst multiCurrencySlice = createSlice({\n name: 'multiCurrency',\n initialState: {},\n reducers: {\n initialize: (_state, { payload }) => {\n const { currencies = [], enabled, preferredCurrency } = payload;\n\n return {\n enabled,\n currencies,\n preferredCurrency: resolveCurrency(\n enabled,\n preferredCurrency,\n currencies\n )\n };\n },\n setPreferredCurrency: (state, { payload }) => {\n const { enabled, currencies } = state;\n\n return {\n ...state,\n preferredCurrency: resolveCurrency(\n enabled,\n payload.currencyCode,\n currencies\n )\n };\n }\n }\n});\n\nexport const { initialize, setPreferredCurrency } = multiCurrencySlice.actions;\nexport default multiCurrencySlice.reducer;\n","// extracted by mini-css-extract-plugin\nexport default {\"item-toast\":\"item-toast--QaLFk\",\"itemToast\":\"item-toast--QaLFk\",\"item-toast-image\":\"item-toast-image--i_l4w\",\"itemToastImage\":\"item-toast-image--i_l4w\"};","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\nconst MessageToast = ({ message, header }) => {\n const { t } = useTranslator();\n\n return (\n
\n {header &&

{t(header)}

}\n {message && (\n {t(message)}\n )}\n
\n );\n};\n\nexport default MessageToast;\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';\n\nconst queuedToasts = createQueue();\n\nexport 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 showSuccessToast(\n 'checkout_shipping_requestCombinedShippingPriceInfo',\n 'checkout_shipping_combinedShippingPriceRequested'\n );\n showErrorToast('siteWideNotifications_profileUpdateFailed');\n showInfoToast('siteWideNotifications_profileUpdateFailed');\n }}>\n Test\n \n);\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 = await webApiClient.get(\n `/browse/item-basic-info/${nextItem.eventData.itemId}`\n );\n const {\n imageUrl,\n itemUrl,\n shortDescription\n } = response.data.item;\n toast(\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 } = nextItem.eventData;\n toast(\n React.createElement(MessageToast, {\n message,\n header\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 (type, eventData, ttlInMinutes = 10) => {\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 = (itemId, newLeadingBidAmount) =>\n handleNotification('ItemOutbidded', {\n itemId,\n newLeadingBidAmount\n });\n\nexport const showItemFirstBidToast = itemId =>\n handleNotification('ItemFirstBid', { itemId });\n\nexport const showItemSoldToast = (itemId, price) =>\n handleNotification('ItemSold', { itemId, price });\n\nexport const showItemWonToast = (itemId, price) =>\n handleNotification('ItemWon', { itemId, price });\n\nexport const showItemPaidToast = itemId =>\n handleNotification('ItemPaid', { itemId });\n\nexport const showItemWishListReminderToast = (itemId, timeLeftMinutes) =>\n handleNotification(\n 'ItemWishListReminder',\n { itemId, timeLeftMinutes },\n timeLeftMinutes > 10 ? 10 : 2\n );\n\nexport const showSuccessToast = (message, header) => {\n handleNotification('Message', {\n message,\n header,\n type: toast.TYPE.SUCCESS\n });\n};\n\nexport const showErrorToast = (message, header) => {\n handleNotification('Message', {\n message,\n header,\n type: toast.TYPE.ERROR\n });\n};\n\nexport const showInfoToast = (message, header) => {\n handleNotification('Message', {\n message,\n header,\n type: toast.TYPE.INFO\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","export const isPrerender = userAgent =>\n Boolean(\n userAgent?.includes(\n 'Prerender (+https://github.com/prerender/prerender)'\n )\n );\n","export const capitalize = text => `${text[0].toUpperCase()}${text.slice(1)}`;\n\nexport const removeTags = text => text.replace(/(<([^>]+)>)/gi, '');\n","/* eslint-disable better-mutation/no-mutation */\n/**\n * Debounce function\n * Borrowed from underscore;\n */\nconst debounce = function(func, wait, immediate) {\n let timeout;\n return function() {\n let context = this,\n args = arguments;\n let later = function() {\n timeout = null;\n if (!immediate) {\n func.apply(context, args);\n }\n };\n let callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) {\n func.apply(context, args);\n }\n };\n};\n\nexport default debounce;\n","// https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Number/toLocaleString\nfunction toLocaleStringSupportsLocales() {\n let number = 0;\n try {\n number.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 formatPrice = price => {\n if (!isLocaleFormattingSupportedInBrowser) {\n return typeof price !== 'number'\n ? `${parseInt(price)} kr`\n : `${price} kr`;\n }\n\n const format = formatMe =>\n formatMe.toLocaleString('sv-SE', {\n symbol: ' kr',\n symbolPosition: 'end',\n decimal: ',',\n comma: '.'\n });\n return typeof price !== 'number'\n ? `${format(parseInt(price))} kr`\n : `${format(price)} kr`;\n};\n\nexport const formatNumber = number => {\n if (!isLocaleFormattingSupportedInBrowser) {\n return typeof number !== 'number' ? `${parseInt(number)}` : `${number}`;\n }\n\n const format = formatMe => formatMe.toLocaleString('sv-SE');\n\n return number !== undefined\n ? typeof number !== 'number'\n ? format(parseInt(number))\n : format(number)\n : '';\n};\n\nexport const formatUserRating = rating => {\n if (!rating) return;\n const number = parseFloat(rating);\n if (number <= 0) return '0.0';\n if (number >= 5) return '5.0';\n return number.toFixed(1);\n};\n","import axios from 'axios';\nimport { handleError } from 'tradera-utils/api';\n\nexport const saveLanguageSetting = (code, toLocalizedUrl) =>\n axios\n .post(toLocalizedUrl('/my/profile/save-language-setting'), {\n languageCodeIso2: code\n })\n .catch(handleError());\n\n// Export object for Sinon stubbing\nexport default {\n saveLanguageSetting\n};\n","import Analytics from 'packages/analytics';\nimport logger from 'packages/logger';\nimport locationUtils from 'tradera-utils/location';\nimport api from './api';\nimport { selectIsLoggedIn } from 'tradera-state/member';\nimport { setPreferred } from './reducer';\n\n/**\n * Sets new preferred language\n * @param {string} code - example: 'sv' or 'en'\n */\nexport const setPreferredLanguage = (code, toLocalizedUrl) => async (\n dispatch,\n getState\n) => {\n Analytics.trackEvent({\n category: 'Settings',\n action: 'Language',\n label: code\n });\n\n try {\n if (selectIsLoggedIn(getState())) {\n await api.saveLanguageSetting(code, toLocalizedUrl);\n }\n dispatch(setPreferred(code));\n locationUtils.reloadLocalized(code);\n } catch (error) {\n logger(error);\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 { toLocalizedUrl } from 'tradera-utils/url';\n\n/**\n * Hide location.reload to be able to stub it with sinon\n * see https://developer.mozilla.org/en-US/docs/Web/API/Location/reload\n */\nexport const reload = (force = false) => location.reload(force);\n\nexport const reloadLocalized = code =>\n (window.location.href = toLocalizedUrl(window.location.href, code));\n\n// Export object for Sinon stubbing\nexport default {\n reload,\n reloadLocalized\n};\n","export const isSwedishOrUndefined = languageCodeIso2 =>\n languageCodeIso2 === undefined || languageCodeIso2.toLowerCase() === 'sv';\n\nexport const getLanguageFromCountryCode = countryCodeIso2 => {\n const key = countryCodeIso2?.toLowerCase() || 'se';\n const languageMap = {\n se: 'sv',\n dk: 'da',\n de: 'de'\n };\n return languageMap[key] || 'en';\n};\n\nexport const getCountryCodeFromLanguage = 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 };\n return countryMap[key] || 'se';\n};\n\nexport const areLanguageCodesIso2Equal = (first, second) =>\n (first || 'SV').toUpperCase() === (second || 'SV').toUpperCase();\n","export default {\n DEFAULT_ACTION: 'member/default',\n INITIALIZE: 'MEMBER/INITIALIZE',\n SET_IS_FETCHING_GEOLOCATION: 'MEMBER/SET_IS_FETCHING_GEOLOCATION',\n SET_GEOLOCATION: 'MEMBER/SET_GEOLOCATION',\n FAILED_LOADING_GEOLOCATION: 'MEMBER/FAILED_LOADING_GEOLOCATION',\n SET_MEMBER_HERO_IMAGE: 'MEMBER/SET_MEMBER_HERO_IMAGE'\n};\n","/* eslint-disable better-mutation/no-mutation */\n\nimport { createSlice } from '@reduxjs/toolkit';\nimport cookieUtil from 'tradera-utils/cookie';\nimport { REGION_PICKER_DISMISSED } from 'tradera-constants/cookies';\n\nconst shippingRegionSlice = createSlice({\n name: 'shippingRegion',\n initialState: {},\n reducers: {\n initialize: (_state, { payload }) => {\n return { ...payload };\n },\n setShippingCountry: (state, action) => {\n const { countryCodeIso2 } = action.payload;\n state.shippingCountry = {\n countryCodeIso2: toUpperCase(countryCodeIso2)\n };\n },\n setDefaultShippingCountry: state => {\n // Remove name\n state.shippingCountry = { countryCodeIso2: 'SE' };\n },\n setAvailableShippingCountries: (state, action) => {\n state.availableShippingCountries = action.payload.shippingCountries;\n state.hasLoadedAvailableShippingCountries = true;\n state.isLoadingAvailableShippingCountries = false;\n },\n beginLoadingAvailableShippingOptions: state => {\n state.isLoadingAvailableShippingCountries = true;\n },\n dismissLocalizationRegionPicker: {\n reducer: state => {\n state.localizationRegionPickerEnabled = false;\n },\n prepare: () => {\n cookieUtil.createCookie(REGION_PICKER_DISMISSED, true);\n return {};\n }\n }\n }\n});\n\nconst toUpperCase = (countryCodeIso2 = '') => countryCodeIso2.toUpperCase();\n\nexport const {\n initialize,\n setShippingCountry,\n setAvailableShippingCountries,\n beginLoadingAvailableShippingOptions,\n dismissLocalizationRegionPicker,\n setDefaultShippingCountry\n} = shippingRegionSlice.actions;\nexport default shippingRegionSlice.reducer;\n"],"sourceRoot":""}