{"version":3,"sources":["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/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/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/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/utils/languagecode.js","webpack:///./src/frontend/state/language/api.js","webpack:///./src/frontend/state/language/actions.js","webpack:///./src/frontend/utils/countrycode.js","webpack:///./src/EbaySweden.TouchWeb/static/script/packages/init-data.js","webpack:///./src/frontend/utils/location.js","webpack:///./src/frontend/utils/countries.js","webpack:///./src/frontend/state/member/action-types.js","webpack:///./src/frontend/state/shipping-region/reducer.js"],"names":["selectAvailableLanguages","state","language","available","selectAvailableLanguageCodesIso2","map","x","languageCodeIso2","selectPreferredLanguage","preferred","selectPreferredLanguageCode","DEFAULT_LANGUAGE","selectLocale","country","memberCountryCodeIso2","selectIsForeignLanguageActivated","selectAutomaticTranslationPreference","automaticTranslationPreference","ensureClientOnly","isServer","Error","httpClient","baseUrl","shouldLocalizeUrl","axiosWrapper","url","httpClientConfig","axiosCaller","cancelTokenId","axiosConfig","version","initData","utilizeCancelToken","cancel","cancelToken","safeUrl","substring","getSafeUrl","localizedUrl","toLocalizedUrl","getLanguage","axiosWithTokenRefresh","then","checkResponseVersion","response","finalizeResponse","catch","handleError","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","length","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","dispatch","getState","a","Analytics","trackEvent","selectIsLoggedIn","createPreferredCurrencyCookie","setPreferredCurrency","setCurrencyIfNotChosen","cookieUtil","readCookie","sv","da","de","includes","createCookie","selectFeatureSwitches","environment","featureSwitches","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","replace","format","formatNumberWithSeparators","react","useSuspense","missingKeyLoggingConfig","saveMissing","saveMissingTo","missingKeyHandler","missingInterpolationHandler","text","JSON","stringify","whenInitialized","t","getCurrentLanguage","error","scope","sentryException","nullifyUndefinedProperties","obj","mapObject","isUndefined","getElementById","usedKeyPageTypes","getOrCreatePageTypeNamespaces","has","addKey","usedKeys","selectPageType","page","useTranslator","pathType","useSelector","useTranslation","wait","ready","wrappedT","useCallback","i18nKey","withTranslator","WrappedComponent","WithTranslator","props","displayName","withUrlLocalizer","WithUrlLocalizer","useUrlLocalizer","useCurrentLanguage","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","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","ga","pathname","isNonInteractive","analyticsData","userTriggered","trackTiming","variable","hitCallback","member","selectGeolocation","selectMemberId","memberId","selectMemberEmail","memberEmail","selectMemberCountryCodeIso2","selectIsOutsideSweden","isoCode","toLowerCase","showDanishFromCountry","fromCountry","selectShippingRegionCountryCodeIso2","areCountryCodesIso2Equal","CookieUtil","gdpr","segment","convertToExpiresStr","expiresStr","Number","Infinity","toUTCString","cookieKey","domain","secure","CATEGORIZED_COOKIES","COOKIE_DEFAULT_CATEGORY","encodeURIComponent","protocol","hasCookie","eraseCookie","parseAppVersion","split","filter","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","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","request","status","reject","handleUnauthorized","checkLoginState","errorResponseInterceptor","responseString","responseStatus","errorCode","isMissingAuthToken","axiosInstance","instance","create","interceptors","cancelTokens","tokenId","CancelToken","source","token","checkResponseLoggedOut","statusHandlers","toString","isCancel","reloadOnUnauthorized","reload","logError","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","matches","match","firstMatch","index","getLanguagePrefixFromUrl","getBackToHereRedirectUrl","forceRedirect","Math","round","random","host","ALink","useLink","givenHref","givenOnClick","onClick","otherProps","useDispatch","useIsFeatureEnabled","isVipLink","handleSpaNavigationClick","evt","isLinkToNextWebPage","prefetch","onMouseEnter","e","stopPropagation","to","propTypes","defaultProps","featureName","toLocalizedRiotUrl","querySelector","getAttribute","userLanguage","memberHashedEmail","memberEmailSha256","memberEmailMd5","memberFirstName","memberLastName","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","minimumFractionDigits","maximumFractionDigits","formatPrice","price","overrideOptions","defaultOptions","style","currency","currencyDisplay","useGrouping","priceAsNumber","suffix","formattedPrice","formatDateWithDayOfWeek","dateString","weekday","year","month","day","DateTimeFormat","plainDayjs","extend","isBetween","utc","timezone","localizedFormat","localizedDayjs","date","tz","formatUtcDateAsSwedishTimeZoneDate","lozalizedDayjs","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","countryCodeIso2","selectIsSwedishVisitor","isSwedenCountryCodeOrUndefined","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","removeBannedCountries","setAvailableShippingCountries","onLocalizationShippingRegionSelected","setPreferredLanguage","initializeFromInitData","warnIfDevBuild","moduleName","console","log","onModuleLoaded","isModuleLoaded","body","MutationObserver","mutationsList","attributeName","observe","attributes","resolveCurrency","enabled","preferredCurrencyCookieValue","currencies","code","multiCurrencySlice","preferredCurrency","ItemToast","imageUrl","itemUrl","shortDescription","eventData","className","styles","title","alt","ToastMessage","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","toUpperCase","debounce","func","immediate","timeout","context","args","arguments","later","apply","callNow","clearTimeout","setTimeout","formatNumber","formatMe","isSwedishOrUndefined","se","dk","getCountryCodeFromLanguage","languageCode","en","areLanguageCodesIso2Equal","first","second","api","locationUtils","reloadLocalized","isSwedenCountryNameOrUndefined","countryName","isDenmarkCountryCode","initDataEL","getInitData","force","bannedCountries","getAvailableCountries","countries","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","dm","do","dz","ec","ee","eg","eh","er","es","et","fi","fj","fk","fm","fo","fr","fx","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","sg","sh","si","sj","sk","sl","sm","sn","so","sr","st","sy","sz","tc","td","tf","tg","th","tj","tk","tl","tm","tn","tr","tt","tv","tw","ua","ug","um","us","uy","uz","va","vc","ve","vg","vi","vn","vu","wf","ws","ye","yt","yu","za","zm","zw","shippingRegionSlice","dismissLocalizationRegionPicker","prepare"],"mappings":"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,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,aACJtwB,GAAI,aACJuwB,GAAI,aACJ5E,GAAI,aACJ6E,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,aACJxpB,GAAI,aACJypB,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,a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","file":"script/chunks/chunk.default~resolution~swedish-company~swedish-private.066c2f415d.js","sourcesContent":["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} 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 httpClient = (baseUrl, shouldLocalizeUrl) => {\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 safeUrl = getSafeUrl(baseUrl, url);\n const localizedUrl = shouldLocalizeUrl\n ? toLocalizedUrl(safeUrl, getLanguage())\n : safeUrl;\n return axiosCaller(axiosWithTokenRefresh(), localizedUrl, axiosConfig)\n .then(\n version ? checkResponseVersion(version) : response => response\n )\n .then(finalizeResponse())\n .catch(handleError());\n };\n\n return {\n get: (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);\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 = currencyCode => async (\n dispatch,\n getState\n) => {\n Analytics.trackEvent({\n category: 'Settings',\n action: 'Currency',\n label: currencyCode\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]));\n } else {\n dispatch(setPreferredCurrencyThunk(currencyCode));\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;\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 selectEnvVariable = variable => state =>\n state.environment.variables[variable] || process.env[variable];\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","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-utils/countrycode';\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 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","import {\n CATEGORIZED_COOKIES,\n COOKIE_DEFAULT_CATEGORY\n} from 'tradera-constants/cookies';\nimport { GdprSettings } from 'tradera-utils/gdpr-settings';\nimport logger from 'packages/logger';\nimport { isServer } from 'tradera-utils/nextjs';\nimport { getCookieFromBrowser, setCookieToBrowser } from './cookie-helpers';\n\nexport class CookieUtil {\n constructor(getCookie, setCookie) {\n if (!getCookie || !setCookie) {\n throw new Error('You must provide getCookie and setCookie');\n }\n this.getCookie = getCookie;\n this.setCookie = setCookie;\n this.gdpr = new GdprSettings(getCookie, setCookie);\n }\n\n segment(name, value) {\n return value ? '; ' + name + '=' + value : '';\n }\n\n convertToExpiresStr(expires) {\n let expiresStr = '';\n\n switch (expires.constructor) {\n case Number:\n expiresStr =\n expires === Infinity\n ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT'\n : '; max-age=' + expires * 24 * 60 * 60;\n break;\n case String:\n expiresStr = '; expires=' + expires;\n break;\n case Date:\n expiresStr = '; expires=' + expires.toUTCString();\n break;\n }\n\n return expiresStr;\n }\n\n createCookie(cookieKey, cookieValue, expires, path, domain, secure) {\n let expiresStr = '';\n\n if (\n !cookieKey ||\n /^(?:expires|max-age|path|domain|secure)$/i.test(cookieKey)\n ) {\n return false;\n }\n\n // check gdpr for cookie category\n let category = CATEGORIZED_COOKIES[cookieKey];\n if (typeof category === 'undefined') {\n logger(`No category set for cookie ${cookieKey}`);\n category = COOKIE_DEFAULT_CATEGORY;\n }\n if (!this.gdpr.isCategoryEnabled(category)) {\n // console.info(\n // `Cookie category not enabled: ${cookieKey}, category: ${category}`\n // );\n return false;\n }\n\n // if expired set prepare date string\n if (expires) {\n expiresStr = this.convertToExpiresStr(expires);\n }\n\n if (isServer) {\n throw new Error('Setting cookie is not supported on the server');\n }\n\n this.setCookie(\n encodeURIComponent(cookieKey) +\n '=' +\n encodeURIComponent(cookieValue) +\n expiresStr +\n this.segment('domain', domain) +\n this.segment('path', path || '/') +\n (location.protocol == 'https:' || secure ? '; secure' : '')\n );\n\n return true;\n }\n\n readCookie(key) {\n return this.getCookie(key);\n }\n\n hasCookie(key) {\n return typeof this.readCookie(key) === 'string';\n }\n\n eraseCookie(key, path, domain) {\n if (!key || !this.hasCookie(key)) {\n return false;\n }\n\n if (isServer) {\n throw new Error('Setting cookie is not supported on the server');\n }\n\n this.setCookie(\n encodeURIComponent(key) +\n '=; expires=Thu, 01 Jan 1970 00:00:01 GMT' +\n this.segment('domain', domain) +\n this.segment('path', path || '/')\n );\n\n return true;\n }\n}\n\nexport default new CookieUtil(getCookieFromBrowser, setCookieToBrowser);\n","export const parseAppVersion = version => {\n const [major = 0, minor = 0, patch = 0] = String(version)\n .split('.')\n .map(Number)\n .filter(number => !Number.isNaN(number));\n return { major, minor, patch };\n};\n\nexport const isSupportedMinimumVersion = (\n appVersionString,\n minimumVersionString\n) => {\n const appVersion = parseAppVersion(appVersionString);\n const minimumVersion = parseAppVersion(minimumVersionString);\n if (appVersion.major > minimumVersion.major) {\n return true;\n }\n if (appVersion.major === minimumVersion.major) {\n if (appVersion.minor > minimumVersion.minor) {\n return true;\n }\n if (appVersion.minor === minimumVersion.minor) {\n if (appVersion.patch >= minimumVersion.patch) {\n return true;\n }\n }\n }\n\n return false;\n};\n","import { isSupportedMinimumVersion } from 'tradera-utils/versions';\n\nexport const getNativeAppSupport = ({\n isNativeAppContext,\n isHybridAppContext,\n hybridAppDevice,\n hybridAppVersion,\n appOsVersion,\n isIOS,\n isAndroid\n}) => {\n const isHybridAppContextForAndroid = Boolean(\n isHybridAppContext &&\n (hybridAppDevice?.toLowerCase().includes('android') || isAndroid)\n );\n const isHybridAppContextForIos = Boolean(\n isHybridAppContext &&\n (hybridAppDevice?.toLowerCase().includes('iphone') ||\n hybridAppDevice?.toLowerCase().includes('ipad') ||\n isIOS)\n );\n const isIos13 =\n isNativeAppContext &&\n isHybridAppContextForIos &&\n isSupportedMinimumVersion(appOsVersion, '13');\n return {\n isHybridAppContextForAndroid,\n isHybridAppContextForIos,\n isNativeAppWithApplyPaySupport:\n isIos13 && isSupportedMinimumVersion(hybridAppVersion, '3.51'),\n isNativeAppWithSwishCallbackSupport:\n isIos13 && isSupportedMinimumVersion(hybridAppVersion, '3.57')\n };\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 { 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\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};\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) {\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);\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 React, { useCallback } from 'react';\nimport PropTypes from '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 { isNextJs } from 'tradera-utils/nextjs';\n\nconst isVipLink = href => href.startsWith('/item/');\n\nconst isLinkToNextWebPage = href =>\n href.endsWith('?next=1') ||\n href.endsWith('/how-to-buy') ||\n href.endsWith('/how-to-sell');\n\nconst ALink = ({\n useLink,\n href: givenHref,\n children,\n onClick: givenOnClick,\n ...otherProps\n}) => {\n const dispatch = useDispatch();\n const isSpaNavigationEnabled = useSelector(\n state => state.environment.isSpaNavigationEnabled\n );\n const isNextWebVipSpaNavigationEnabled = useIsFeatureEnabled(\n 'next-web-vip-spa-navigation'\n );\n const href =\n isNextWebVipSpaNavigationEnabled && isVipLink(givenHref)\n ? `${givenHref}?next=1`\n : givenHref;\n\n const handleSpaNavigationClick = useCallback(\n evt => {\n dispatch(updateEnvironmentHash());\n if (givenOnClick) givenOnClick(evt);\n },\n [dispatch, givenOnClick]\n );\n if (isNextJs && isSpaNavigationEnabled && isLinkToNextWebPage(href)) {\n // NextJS routing\n return (\n \n e.stopPropagation()}>\n {children}\n \n \n );\n } else if (!isNextJs && isSpaNavigationEnabled && useLink) {\n // react-router-dom\n // Strip away origin for local links\n let to = href;\n if (href?.startsWith(location.origin)) {\n const { pathname, search } = new URL(href);\n to = pathname + search;\n }\n return (\n \n {children}\n \n );\n }\n return (\n \n {children}\n \n );\n};\n\nALink.propTypes = {\n useLink: PropTypes.bool,\n href: PropTypes.string.isRequired,\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';\n\nexport const useIsFeatureEnabled = featureName =>\n useSelector(state => state.environment.featureSwitches?.[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 ...overrideOptions\n };\n const priceAsNumber = typeof price !== 'number' ? parseInt(price) : price;\n\n if (!isLocaleFormattingSupportedInBrowser) {\n const suffix =\n defaultOptions.currencyDisplay === 'code' &&\n defaultOptions.currency === 'SEK'\n ? 'kr'\n : defaultOptions.currency;\n return `${priceAsNumber} ${suffix}`;\n }\n\n const formattedPrice = priceAsNumber.toLocaleString(locale, defaultOptions);\n return formatNumberWithSeparators(formattedPrice);\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 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, localizedDayjs) =>\n localizedDayjs(date).tz('Europe/Stockholm');\n\nexport const formatUtcDateAsSwedishTimeZoneDate = (date, lozalizedDayjs) =>\n swedishTimeZoneDate(date, lozalizedDayjs).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-utils/languagecode';\nimport { isSwedenCountryCodeOrUndefined } from 'tradera-utils/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));\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 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 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-utils/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-utils/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 { formatNumberWithSeparators } from 'tradera-utils/format';\nimport ALink from 'tradera-components/alink/alink';\nimport { useTranslator, useUrlLocalizer } from 'tradera-lang/translate';\nimport styles from './item-toast.module.scss';\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 let message;\n switch (type) {\n case 'ItemOutbidded':\n message = t('siteWideNotifications_itemOutbidded', {\n newLeadingBidAmount: formatNumberWithSeparators(\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', {\n price: formatNumberWithSeparators(eventData.price),\n shortDescription\n });\n break;\n case 'ItemWon':\n message = t('siteWideNotifications_itemWon', {\n price: formatNumberWithSeparators(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 userAgent.indexOf('Prerender (+https://github.com/prerender/prerender)') >\n -1;\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","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","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","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","/**\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","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 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":""}