{"version":3,"file":"coopse.script.2765.dd46da90.chunk.js","mappings":"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","sources":["webpack:///../../packages/icons/src/stroke2/chevron-down.svg","webpack:///../../packages/icons/src/stroke2/chevron-left.svg","webpack:///../../packages/icons/src/stroke2/chevron-right.svg","webpack:///../../packages/icons/src/stroke2/pin.svg","webpack:///./src/microApps/base/components/UserTypeModeSwitch/UserTypeModeSwitch.utils.ts","webpack:///./src/microApps/common/api/clients/directDkeAxiosClient.ts","webpack:///./src/microApps/common/api/dke/dkeApi.ts","webpack:///./src/microApps/common/components/SwipableList/SwipableList.tsx","webpack:///./src/microApps/common/hooks/useA11yAnnouncerDispatch.ts","webpack:///./src/microApps/common/components/atoms/ConditionalWrapper.tsx","webpack:///./src/microApps/common/components/atoms/ProductBadge/ProductBadge.tsx","webpack:///./src/microApps/common/components/atoms/ProductBadge/ProductBadge.module.less","webpack:///./src/microApps/common/components/atoms/RawPicture/RawPicture.tsx","webpack:///./src/microApps/common/components/atoms/RawPicture/RawPicture.module.less","webpack:///./src/microApps/common/components/molecules/ProductTeaser/ProductTeaser.consts.ts","webpack:///./src/microApps/common/components/molecules/ProductTeaser/ProductTeaser.module.less","webpack:///./src/microApps/common/components/molecules/ProductTeaser/ProductTeaser.tsx","webpack:///./src/microApps/common/components/organisms/BaseImageTextBlock/BaseImageTextBlock.tsx","webpack:///./src/microApps/common/components/organisms/BaseImageTextBlock/BaseImageTextBlock.module.less","webpack:///./src/microApps/common/components/organisms/DoubleImageTextBlock/DoubleImageTextBlock.tsx","webpack:///./src/microApps/common/components/organisms/DoubleImageTextBlock/DoubleImageTextBlock.module.less","webpack:///./src/microApps/common/components/organisms/ImageTextPropertyBlock/ImageTextPropertyBlock.module.scss","webpack:///./src/microApps/common/components/organisms/ImageTextPropertyBlock/ImageTextPropertyBlock.tsx","webpack:///./src/microApps/common/hooks/useBadges.ts","webpack:///./src/microApps/common/tracking/ga4/stores/ga4StoresEvents.ts","webpack:///./src/microApps/common/tracking/hooks/usePromotionTracking.ts","webpack:///./src/microApps/ecommerce/contexts/useRouterContext.tsx","webpack:///./src/microApps/ecommerce/hooks/useReactRouting.ts","webpack:///./src/microApps/episerver/epiUtils.ts","webpack:///./src/microApps/storeAndOffers/api/directStoresAxiosClient.ts","webpack:///./src/microApps/storeAndOffers/api/storeApi.ts","webpack:///./src/microApps/storeAndOffers/hooks/useFavoriteStores.ts","webpack:///./src/microApps/storeAndOffers/pages/StorePage/StorePage.utils.ts","webpack:///./src/microApps/storeAndOffers/pages/StoreAndOffers.utils.ts","webpack:///./src/microApps/storeAndOffers/physicalOffers/components/BecomeAMemberBlock/BecomeAMemberBlock.module.scss","webpack:///./src/microApps/storeAndOffers/physicalOffers/components/BecomeAMemberBlock/BecomeAMemberBlock.tsx","webpack:///./src/microApps/storeAndOffers/physicalOffers/components/StoreOfferTeaser/StoreOfferTeaser.tsx","webpack:///./src/microApps/storeAndOffers/physicalOffers/components/StoreOfferTeaser/StoreOfferTeaser.module.less","webpack:///./src/microApps/storeAndOffers/utils.ts"],"sourcesContent":["var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgChevronDown = _ref => {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"1em\",\n height: \"1em\",\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M19.7071 8.29289C20.0976 8.68342 20.0976 9.31658 19.7071 9.70711L12.7071 16.7071C12.3166 17.0976 11.6834 17.0976 11.2929 16.7071L4.29289 9.70711C3.90237 9.31658 3.90237 8.68342 4.29289 8.29289C4.68342 7.90237 5.31658 7.90237 5.70711 8.29289L12 14.5858L18.2929 8.29289C18.6834 7.90237 19.3166 7.90237 19.7071 8.29289Z\"\n })));\n};\nexport default SvgChevronDown;","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgChevronLeft = _ref => {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"1em\",\n height: \"1em\",\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M15.7071 20.2071C15.3166 20.5976 14.6834 20.5976 14.2929 20.2071L7.29289 13.2071C6.90237 12.8166 6.90237 12.1834 7.29289 11.7929L14.2929 4.79289C14.6834 4.40237 15.3166 4.40237 15.7071 4.79289C16.0976 5.18342 16.0976 5.81658 15.7071 6.20711L9.41421 12.5L15.7071 18.7929C16.0976 19.1834 16.0976 19.8166 15.7071 20.2071Z\"\n })));\n};\nexport default SvgChevronLeft;","var _path;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgChevronRight = _ref => {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"1em\",\n height: \"1em\",\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M8.29289 4.79289C8.68342 4.40237 9.31658 4.40237 9.70711 4.79289L16.7071 11.7929C17.0976 12.1834 17.0976 12.8166 16.7071 13.2071L9.70711 20.2071C9.31658 20.5976 8.68342 20.5976 8.29289 20.2071C7.90237 19.8166 7.90237 19.1834 8.29289 18.7929L14.5858 12.5L8.29289 6.20711C7.90237 5.81658 7.90237 5.18342 8.29289 4.79289Z\"\n })));\n};\nexport default SvgChevronRight;","var _path, _path2;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nconst SvgPin = _ref => {\n let {\n title,\n titleId,\n ...props\n } = _ref;\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: \"1em\",\n height: \"1em\",\n viewBox: \"0 0 24 24\",\n xmlns: \"http://www.w3.org/2000/svg\",\n \"aria-labelledby\": titleId\n }, props), title ? /*#__PURE__*/React.createElement(\"title\", {\n id: titleId\n }, title) : null, _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M12 3C10.6822 3 9.41311 3.53668 8.47336 4.50052C7.53278 5.46522 7 6.77891 7 8.15385C7 10.1079 7.86187 11.9472 8.97074 13.4942C10.0375 14.9825 11.277 16.1219 12 16.726C12.723 16.1219 13.9625 14.9825 15.0293 13.4942C16.1381 11.9472 17 10.1079 17 8.15385C17 6.77891 16.4672 5.46522 15.5266 4.50052C14.5869 3.53668 13.3178 3 12 3ZM7.04136 3.10432C8.35205 1.76002 10.1352 1 12 1C13.8648 1 15.6479 1.76002 16.9586 3.10432C18.2685 4.44776 19 6.26458 19 8.15385C19 10.6893 17.8906 12.9353 16.6548 14.6594C15.4136 16.391 13.9838 17.6819 13.2008 18.3285C12.5004 18.9069 11.4996 18.9069 10.7992 18.3285C10.0162 17.6819 8.58641 16.391 7.34518 14.6593C6.10942 12.9353 5 10.6893 5 8.15385C5 6.26458 5.73151 4.44776 7.04136 3.10432ZM7.58323 17.8177C7.68394 18.3607 7.32537 18.8825 6.78235 18.9832C6.58572 19.0197 6.39671 19.058 6.21578 19.098C5.33613 19.2924 4.68807 19.5174 4.28499 19.7352C4.25778 19.7499 4.23253 19.7642 4.20914 19.7779L4.2114 19.7792C4.54864 19.9761 5.10316 20.1876 5.87574 20.3783C7.4054 20.756 9.57111 21 12 21C14.4289 21 16.5946 20.756 18.1243 20.3783C18.8968 20.1876 19.4514 19.9761 19.7886 19.7792L19.7909 19.7779C19.7675 19.7642 19.7422 19.7499 19.715 19.7352C19.3119 19.5174 18.6639 19.2924 17.7842 19.098C17.6033 19.058 17.4143 19.0197 17.2177 18.9832C16.6746 18.8825 16.3161 18.3607 16.4168 17.8177C16.5175 17.2746 17.0393 16.9161 17.5823 17.0168C17.7999 17.0571 18.0113 17.0999 18.2158 17.1451C19.1774 17.3576 20.0293 17.6317 20.6659 17.9758C20.9837 18.1475 21.2947 18.3615 21.5371 18.6337C21.7849 18.9121 22 19.2992 22 19.7779C22 20.6626 21.3 21.2128 20.7969 21.5064C20.2233 21.8413 19.4598 22.1086 18.6037 22.32C16.876 22.7466 14.5417 23 12 23C9.45833 23 7.12404 22.7466 5.39633 22.32C4.54023 22.1086 3.77674 21.8413 3.20313 21.5064C2.70004 21.2128 2 20.6626 2 19.7779C2 19.2992 2.21505 18.9121 2.46292 18.6337C2.7053 18.3615 3.01634 18.1475 3.33408 17.9758C3.97069 17.6317 4.82263 17.3576 5.78422 17.1451C5.9887 17.0999 6.20006 17.0571 6.41765 17.0168C6.96068 16.9161 7.48253 17.2746 7.58323 17.8177ZM20.0472 19.5874C20.0472 19.5874 20.0458 19.5902 20.0411 19.5956C20.0446 19.59 20.0472 19.5874 20.0472 19.5874ZM3.95277 19.5874C3.95277 19.5874 3.9554 19.59 3.9589 19.5956C3.95422 19.5902 3.95277 19.5874 3.95277 19.5874Z\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M14 8C14 9.10457 13.1046 10 12 10C10.8954 10 10 9.10457 10 8C10 6.89543 10.8954 6 12 6C13.1046 6 14 6.89543 14 8Z\"\n })));\n};\nexport default SvgPin;","import { appConfig } from '../../../../appConfig';\nimport { Cookies } from '../../../../utility/cookies';\nimport { BUSINESS_TOGGLE_COOKIE } from '../../../common/persistance/cookie/cookieKeys';\nimport { getAnonymousCustomerGroups } from '../../../common/utils/customerGroupsUtils';\n\nexport const b2bModeTrigger = () => {\n const isB2BUser = getAnonymousCustomerGroups().includes('CUSTOMER_COMPANY');\n const isB2CUser = !isB2BUser;\n\n const switchToB2B = () => {\n if (!appConfig.coopUserSettings.isAuthenticated) {\n Cookies.create(BUSINESS_TOGGLE_COOKIE, 'true');\n\n // always redirect to ecommerce handla page\n window.location.href = appConfig.coopSettings.ecommerce.page.url;\n }\n };\n\n const switchToB2C = () => {\n if (!appConfig.coopUserSettings.isAuthenticated) {\n Cookies.eraseCookie(BUSINESS_TOGGLE_COOKIE);\n\n // always redirect to ecommerce handla page\n window.location.href = appConfig.coopSettings.ecommerce.page.url;\n }\n };\n\n const toggle = () => {\n if (!appConfig.coopUserSettings.isAuthenticated) {\n if (isB2BUser) {\n switchToB2C();\n } else {\n switchToB2B();\n }\n }\n };\n\n return {\n isB2CUser,\n isB2BUser,\n switchToB2B,\n switchToB2C,\n toggle,\n };\n};\n","import { appConfig } from '../../../../appConfig';\nimport axiosClientFactory from './clientFactory';\n\nconst getStoreOffersAxiosClient = () => {\n const storeOffersAxiosClient = axiosClientFactory.createDirectApiClient({\n baseURL: appConfig.coopSettings.serviceAccess.dkeUrl,\n headers: {\n 'Ocp-Apim-Subscription-Key': appConfig.coopSettings.serviceAccess.dkeKey,\n },\n });\n return storeOffersAxiosClient;\n};\n\nexport default getStoreOffersAxiosClient;\n","import getStoreOffersAxiosClient from '../clients/directDkeAxiosClient';\nimport type { ApiDkeStoreOffer } from './dkeModels';\nimport type { ApiGetDkeStoreOffersResponse } from './dkeResponse';\n\nconst getDkeOffers = async (storeId: string) => {\n const axiosClient = await getStoreOffersAxiosClient();\n const response = await axiosClient.get<ApiGetDkeStoreOffersResponse>(\n `/categories/offers/${storeId}`,\n {\n params: { 'api-version': 'v1', clustered: 'true' },\n },\n );\n return response.data;\n};\nconst getTvOffers = async () => {\n const axiosClient = await getStoreOffersAxiosClient();\n const response = await axiosClient.get<ApiDkeStoreOffer[]>('/tv', {\n params: { 'api-version': 'v1' },\n });\n return response.data;\n};\nexport default {\n getDkeOffers,\n getTvOffers,\n};\n","/* eslint-disable no-param-reassign */\n/* eslint-disable react/jsx-props-no-spreading */\nimport 'swiper/less';\nimport 'swiper/less/navigation';\nimport 'swiper/less/pagination';\nimport 'swiper/less/scrollbar';\nimport './Swiper.less';\n\nimport { Icon } from '@coop/components';\nimport { ChevronLeftIcon, ChevronRightIcon } from '@coop/icons';\nimport classNames from 'classnames';\nimport type { FC } from 'react';\nimport * as React from 'react';\nimport { useMemo, useRef, useState } from 'react';\nimport { Navigation, Pagination, Scrollbar } from 'swiper/modules';\nimport { Swiper, SwiperSlide } from 'swiper/react';\nimport type { NavigationOptions, ScrollbarOptions, SwiperOptions } from 'swiper/types';\n\nimport { useA11yAnnouncerDispatch } from '../../hooks/useA11yAnnouncerDispatch';\nimport { useIsMobile } from '../atoms/ResponsiveBreakpoints';\n\nexport interface SwipableListProps {\n swiperMainClassName?: string;\n swiperButtonClassName?: string;\n swiperPaginationClass?: string;\n swiperOptions?: SwiperOptions;\n onSwiper?: React.ComponentProps<typeof Swiper>['onSwiper'];\n}\n\ninterface NavButtonProps {\n hasScrollbar: boolean;\n class?: string;\n}\n\nconst PrevButton = React.forwardRef<HTMLButtonElement, NavButtonProps>((props, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={classNames(\n 'swiper-button swiper-button--prev',\n props.hasScrollbar && 'swiper-button--scrollbar',\n props.class,\n )}\n aria-label=\"Se tidigare i listan\"\n >\n <Icon icon={ChevronLeftIcon} className=\"swiper-arrow\" aria-hidden />\n </button>\n));\n\nconst NextButton = React.forwardRef<HTMLButtonElement, NavButtonProps>((props, ref) => (\n <button\n ref={ref}\n type=\"button\"\n className={classNames(\n 'swiper-button swiper-button--next',\n props.hasScrollbar && 'swiper-button--scrollbar',\n props.class,\n )}\n aria-label=\"Se fler i listan\"\n >\n <Icon icon={ChevronRightIcon} className=\"swiper-arrow\" aria-hidden />\n </button>\n));\n\nconst isScrollbarOptions = (\n scrollbar: boolean | ScrollbarOptions,\n): scrollbar is ScrollbarOptions => {\n return (scrollbar as ScrollbarOptions).el !== undefined;\n};\n\nconst modifySwiperOptions = (customSwiperOptions?: SwiperOptions): SwiperOptions => {\n let scrollbar: boolean | ScrollbarOptions = false;\n\n if (customSwiperOptions && customSwiperOptions.scrollbar) {\n if (!isScrollbarOptions(customSwiperOptions.scrollbar)) {\n scrollbar = {\n el: '.swiper-scrollbar-container',\n draggable: true,\n };\n } else {\n scrollbar = {\n el: '.swiper-scrollbar-container',\n draggable: true,\n ...customSwiperOptions.scrollbar,\n };\n }\n }\n\n return {\n watchSlidesProgress: true,\n ...customSwiperOptions,\n containerModifierClass: classNames('swiper-container--'),\n scrollbar,\n };\n};\n\nconst SwipableList: FC<React.PropsWithChildren<SwipableListProps>> = (props) => {\n const [nextEl, setNextEl] = useState<HTMLButtonElement | null>(null);\n const [prevEl, setPrevEl] = useState<HTMLButtonElement | null>(null);\n const [paginationEl, setPaginationEl] = useState<HTMLDivElement | null>(null);\n\n const focusTimer = useRef<NodeJS.Timeout | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const announce = useA11yAnnouncerDispatch();\n\n // iphone crashes if we have too many items in the swiper\n const MAX_NUMBER_OF_SWIPABLE_ITEMS = 60;\n\n // this is important becase the ref wont change but the value in the ref will. So we need to use the element to trigger useMemo, not the ref\n const swiperOptions: SwiperOptions = useMemo(() => {\n return {\n threshold: 5,\n navigation: {\n ...(props.swiperOptions?.navigation as NavigationOptions),\n disabledClass: 'is-hidden',\n nextEl,\n prevEl,\n },\n pagination: {\n clickable: true,\n el: paginationEl,\n lockClass: 'is-hidden',\n dynamicBullets: true,\n dynamicMainBullets: 5,\n },\n ...modifySwiperOptions(props.swiperOptions),\n };\n }, [nextEl, prevEl, paginationEl, props.swiperOptions]);\n const isMobile = useIsMobile();\n return (\n <>\n <div\n ref={containerRef}\n className={classNames(\n 'swiper',\n props.swiperMainClassName,\n isMobile && 'swiper-disabledNavigation',\n !isMobile && swiperOptions?.watchSlidesProgress && 'swiper-watch',\n )}\n >\n <PrevButton\n class={props.swiperButtonClassName}\n ref={setPrevEl}\n hasScrollbar={!!swiperOptions.scrollbar}\n />\n\n <Swiper\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...swiperOptions}\n modules={[Navigation, Pagination, Scrollbar]}\n onSwiper={props.onSwiper}\n wrapperTag=\"ul\"\n onSlideChange={(swiper) => {\n if (focusTimer.current) {\n clearTimeout(focusTimer.current);\n }\n const setFocus = () => {\n const focusElement = containerRef.current?.querySelector<HTMLElement>(\n '.swiper-slide-active a, .swiper-slide-active button',\n );\n if (focusElement) {\n focusElement.focus();\n }\n };\n\n announce(`Visar sida ${swiper.snapIndex + 1}`);\n /** timeout much match transitiontime which is 400ms */\n focusTimer.current = setTimeout(setFocus, 500);\n }}\n >\n {React.Children.map(\n props.children,\n (child, index) =>\n child &&\n index < MAX_NUMBER_OF_SWIPABLE_ITEMS && (\n <SwiperSlide tag=\"li\">{child}</SwiperSlide>\n ),\n )}\n {swiperOptions.scrollbar && <div className=\"swiper-scrollbar-container\" />}\n </Swiper>\n\n <NextButton\n class={props.swiperButtonClassName}\n ref={setNextEl}\n hasScrollbar={!!swiperOptions.scrollbar}\n />\n </div>\n {swiperOptions.pagination && (\n <div\n ref={setPaginationEl}\n className={classNames('swiper-pagination', props.swiperPaginationClass)}\n />\n )}\n </>\n );\n};\n\nexport default SwipableList;\n","import { useCallback, useEffect } from 'react';\n\nimport { currentPageActions } from '../store/slices/currentPage/currentPageSlice';\nimport { useAppDispatch } from './useThunkDispatch';\n\nexport const useA11yAnnouncerDispatch = () => {\n const dispatch = useAppDispatch();\n\n const a11yAnnounceDispatch = useCallback(\n (value: string) => {\n dispatch(currentPageActions.setA11yAnnounceText(value));\n },\n [dispatch],\n );\n\n return a11yAnnounceDispatch;\n};\n\nexport const useA11yAnnouncerDispatchEffect = (value: string | undefined) => {\n const dispatchA11yAnnouncer = useA11yAnnouncerDispatch();\n\n useEffect(() => {\n if (!value) {\n return;\n }\n\n dispatchA11yAnnouncer(value);\n }, [dispatchA11yAnnouncer, value]);\n};\n","import type { FC, ReactNode } from 'react';\nimport { Fragment } from 'react';\n\ninterface ConditionalWrapperProps {\n condition: boolean;\n renderWrapper: (children: ReactNode) => ReactNode;\n}\n\nexport const ConditionalWrapper: FC<React.PropsWithChildren<ConditionalWrapperProps>> = (props) =>\n // eslint-disable-next-line react/jsx-no-useless-fragment\n props.condition ? <>{props.renderWrapper(props.children)}</> : <>{props.children}</>;\n\ninterface ConditionalMultipleWrappersProps {\n choices: {\n condition: boolean;\n renderWrapper: (children: ReactNode) => ReactNode;\n }[];\n\n children: ReactNode;\n}\n\nexport const ConditionalMultipleWrappers: FC<\n React.PropsWithChildren<ConditionalMultipleWrappersProps>\n> = (props) => {\n return (\n <>\n {props.choices.map(\n (choice, index) =>\n choice.condition && (\n // eslint-disable-next-line react/no-array-index-key\n <Fragment key={index}>{choice.renderWrapper(props.children)}</Fragment>\n ),\n )}\n </>\n );\n};\n","import type { FC } from 'react';\nimport { useState } from 'react';\n\nimport { trim } from '../../../utils/stringUtils';\nimport CloudinaryImage from '../CloudinaryImage';\nimport styles from './ProductBadge.module.less';\n\ninterface Dimensions {\n width: number | 'auto';\n height: number | 'auto';\n}\n\ntype ProductBadgeProps = { dimensions: Dimensions; url: string; alt?: string } & (\n | { zoomable: true; zoomDimensions: Dimensions }\n | { zoomable: false }\n);\n\nconst getTransformDimensions = (dimensions: Dimensions) => {\n const height = dimensions.height !== 'auto' ? `h_${dimensions.height}` : '';\n const width = dimensions.width !== 'auto' ? `w_${dimensions.width}` : '';\n\n const retinaHeight = dimensions.height !== 'auto' ? `h_${dimensions.height * 2}` : '';\n const retinaWidth = dimensions.width !== 'auto' ? `w_${dimensions.width * 2}` : '';\n\n const transformDimensions = trim(`${height},${width}`, ',');\n const transformDimensionsRetina = trim(`${retinaHeight},${retinaWidth}`, ',');\n return { desktop: transformDimensions, retina: transformDimensionsRetina };\n};\n\nconst ProductBadge: FC<React.PropsWithChildren<ProductBadgeProps>> = (props) => {\n const cloudinaryDimensions = props.zoomable ? props.zoomDimensions : props.dimensions;\n const transformDimensions = getTransformDimensions(cloudinaryDimensions);\n\n const [isZoomed, setIsZoomed] = useState<boolean>(false);\n\n const zoomIn = () => {\n if (props.zoomable) {\n setIsZoomed(true);\n }\n };\n\n const zoomOut = () => {\n setIsZoomed(false);\n };\n\n const toggleZoom = () => {\n if (props.zoomable) {\n setIsZoomed((zoomed) => !zoomed);\n }\n };\n\n const currentDimensions = props.zoomable && isZoomed ? props.zoomDimensions : props.dimensions;\n\n return (\n <div\n className={styles.ProductBadgeContainer}\n onMouseEnter={zoomIn}\n onMouseLeave={zoomOut}\n onTouchStart={toggleZoom}\n >\n <CloudinaryImage\n cssClass={styles.ProductBadge}\n url={props.url}\n name={props.alt || ''}\n title={props.alt}\n transform={`fl_progressive,q_90,c_pad,g_center${\n transformDimensions.desktop ? `,${transformDimensions.desktop}` : ''\n }`}\n retinaTransform={`fl_progressive,q_90,c_pad,g_center${\n transformDimensions.retina ? `,${transformDimensions.retina}` : ''\n }`}\n width={currentDimensions.width === 'auto' ? undefined : currentDimensions.width}\n height={currentDimensions.height === 'auto' ? undefined : currentDimensions.height}\n />\n </div>\n );\n};\n\nexport default ProductBadge;\n","// extracted by mini-css-extract-plugin\nexport default {\"ProductBadge\":\"rDdYn4if\",\"ProductBadgeContainer\":\"VOS2_9H2\"};","import classNames from 'classnames';\n\nimport styles from './RawPicture.module.less';\n\ntype SourceMedia = {\n minWidth: number;\n height?: number;\n srcSet: string;\n};\n\ninterface RawPictureProps {\n altText?: string;\n src?: string;\n height?: number;\n srcSet?: SourceMedia[];\n imgClassName?: string;\n className?: string;\n lazy?: boolean;\n}\n\n/**\n * Use this component for solving Art Direction problem in the images.\n * As opposed to RawImage component, browser will not download the image it thinks is the best - you tell it which image to download based on the viewport size size.\n */\nconst RawPicture = (props: RawPictureProps) => {\n const srcSet = props.srcSet?.sort((a, b) => b.minWidth - a.minWidth);\n\n return (\n <picture className={classNames(styles.Container, props.className)}>\n {srcSet?.map((item, index) => {\n return (\n <source\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n media={`(min-width: ${item.minWidth}px)`}\n srcSet={item.srcSet}\n height={item.height}\n />\n );\n })}\n <img\n loading={props.lazy ? 'lazy' : undefined}\n className={classNames(styles.Image, props.imgClassName)}\n src={props.src}\n alt={props.altText || ''}\n height={props.height}\n />\n </picture>\n );\n};\n\nexport default RawPicture;\n","// extracted by mini-css-extract-plugin\nexport default {\"Container\":\"J5qjoGvQ\",\"Image\":\"qk0vMZV4\"};","export const missingProductImageUrl = '/Assets/Images/missing-image-product.png';\n","// extracted by mini-css-extract-plugin\nexport default {};","import { Chip } from '@coop/components';\nimport classNames from 'classnames';\nimport type { FC, ReactNode } from 'react';\nimport * as React from 'react';\n\nimport { Helpers } from '../../../../../utility/helpers';\nimport { useBadges } from '../../../hooks/useBadges';\nimport type { PriceType } from '../../../models/priceData/priceData';\nimport type {\n ProductAttributeLabel,\n ProductProps,\n ProductVariantProps,\n} from '../../../models/props/itemTeaserProps';\nimport CloudinaryImage from '../../atoms/CloudinaryImage';\nimport { ConditionalWrapper } from '../../atoms/ConditionalWrapper';\nimport ProductBadge from '../../atoms/ProductBadge';\nimport { missingProductImageUrl } from './ProductTeaser.consts';\nimport styles from './ProductTeaser.module.less';\n\ntype BaseProductTeaserProps = {\n handleTeaserClick?: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n handleLinkClick?: (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => void;\n handleVariantChange?: (variantId: string) => void;\n containerCss?: string;\n isALink?: boolean;\n isAsyncLink?: boolean;\n currentVariant?: ProductVariantProps;\n product: ProductProps;\n // detailsContainerColumn?: boolean;\n notificationSlot?: React.ReactNode;\n actionsSlot?: React.ReactNode;\n priceType: PriceType;\n // additionalSplashInfo?: string;\n};\n\nconst ProductTeaserWrapper = React.forwardRef<\n HTMLDivElement,\n Pick<BaseProductTeaserProps, 'containerCss' | 'handleTeaserClick' | 'notificationSlot'> & {\n children: ReactNode;\n }\n>((props, ref) => {\n const containerCss = classNames(\n styles.FakeStyle,\n 'ProductTeaser ProductTeaser-alignCenter',\n props.containerCss,\n );\n\n return (\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n <div ref={ref} onClick={props.handleTeaserClick} className={containerCss}>\n <div className=\"ProductTeaser-content\">{props.children}</div>\n {props.notificationSlot}\n </div>\n );\n});\n\ninterface ProductTeaserMediaProps {\n attributeLabels?: ProductAttributeLabel[];\n url?: string;\n name: string;\n imageUrl?: string;\n isALink?: boolean;\n handleLinkClick?: (e: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => void;\n slotTopBadge?: ReactNode;\n promotionSplashSlot?: ReactNode;\n}\n\nconst ProductTeaserMedia: FC<React.PropsWithChildren<ProductTeaserMediaProps>> = (props) => {\n const badges = useBadges(props.attributeLabels);\n\n const filteredBadges = badges.slice(0, 2); // business requirement: max 2 badges can be displayed on any product listing\n\n return (\n <div className=\"ProductTeaser-media\">\n <ConditionalWrapper\n condition={!!props.isALink || !!props.handleLinkClick}\n renderWrapper={(ch) => (\n <a\n href={props.url}\n className={classNames('u-outlineSolidBase2')}\n aria-label={props.name}\n onClick={props.handleLinkClick}\n >\n {ch}\n </a>\n )}\n >\n <div className=\"ProductTeaser-image\">\n <CloudinaryImage\n url={props.imageUrl}\n name={props.name}\n fallbackUrl={missingProductImageUrl}\n transform=\"f_auto,fl_clip,fl_progressive,q_auto,c_lpad,g_center,h_120,w_120\"\n retinaTransform=\"f_auto,fl_clip,fl_progressive,q_auto,c_lpad,g_center,h_240,w_240\"\n lazy\n />\n </div>\n </ConditionalWrapper>\n {(props.slotTopBadge || filteredBadges?.length > 0) && (\n <div className=\"ProductTeaser-badges\">\n {props.slotTopBadge}\n {filteredBadges.map((badge, index) => {\n return (\n <ProductBadge\n // eslint-disable-next-line react/no-array-index-key\n key={`${badge.url}-${index.toString()}`}\n zoomable={false}\n url={badge.url!}\n alt={badge.alt}\n dimensions={{ width: 24, height: 24 }}\n />\n );\n })}\n </div>\n )}\n {!!props.promotionSplashSlot && (\n <div className=\"ProductTeaser-promos\">\n <div className=\"ProductTeaser-splash\">{props.promotionSplashSlot}</div>\n </div>\n )}\n </div>\n );\n};\n\nconst ProductTeaserBrand: FC<React.PropsWithChildren<{ brand: string; fromSweden?: boolean }>> = ({\n brand,\n fromSweden,\n}) => {\n return (\n <div className={classNames(`ProductTeaser-brand`)}>\n {fromSweden && (\n <img\n className=\"u-marginRxxxxsm\"\n src=\"/Assets/Icons/flag-sweden.svg\"\n alt=\"Svensk flagga\"\n width=\"16\"\n height=\"10\"\n />\n )}\n <span>{brand}.</span>\n </div>\n );\n};\n\nconst ProductTeaserPackageSizeInfo: FC<\n React.PropsWithChildren<{ packageSizeInformation: string }>\n> = ({ packageSizeInformation }) => {\n return (\n <Chip size={24} theme=\"whiteBlack\">\n {Helpers.capitalize(packageSizeInformation)}\n </Chip>\n );\n};\n\nconst ProductTeaserHeading: FC<React.PropsWithChildren<{ name: string }>> = ({ name }) => {\n return <h3 className=\"ProductTeaser-heading\">{name}</h3>;\n};\n\nconst ProductTeaser = {\n Wrapper: ProductTeaserWrapper,\n Media: ProductTeaserMedia,\n Brand: ProductTeaserBrand,\n Heading: ProductTeaserHeading,\n PackageSizeInfo: ProductTeaserPackageSizeInfo,\n};\n\nexport default ProductTeaser;\n","import classnames from 'classnames';\n\nimport styles from './BaseImageTextBlock.module.less';\n\ninterface BaseImageTextBlockProps {\n disableMinimumHeight: boolean;\n className?: string;\n disableRoundCorners?: boolean;\n}\n\nconst BaseImageTextBlock = (props: React.PropsWithChildren<BaseImageTextBlockProps>) => {\n return (\n <div\n className={classnames(\n props.className,\n styles.Container,\n !props.disableRoundCorners && styles.RoundedCorners,\n props.disableMinimumHeight && styles.NoMinHeight,\n )}\n >\n {props.children}\n </div>\n );\n};\n\nexport default BaseImageTextBlock;\n","// extracted by mini-css-extract-plugin\nexport default {\"Container\":\"hrfQfmUQ\",\"MinHeight\":\"CY6tbW28\",\"NoMinHeight\":\"wKwuTcpr\",\"RoundedCorners\":\"PSiFG8T5\"};","/* eslint-disable react/jsx-props-no-spreading */\n\nimport { useIsFromMedium } from '../../atoms/ResponsiveBreakpoints';\nimport BaseImageTextBlock from '../BaseImageTextBlock';\nimport type { ImageTextPropertyBlockProps } from '../ImageTextPropertyBlock/ImageTextPropertyBlock';\nimport ImageTextPropertyBlock from '../ImageTextPropertyBlock/ImageTextPropertyBlock';\nimport styles from './DoubleImageTextBlock.module.less';\n\nexport interface DoubleImageTextBlockProps {\n left: ImageTextPropertyBlockProps;\n right: ImageTextPropertyBlockProps;\n disableMinimumHeight: boolean;\n proritizeRightContent: boolean;\n}\n\nconst DoubleImageTextBlock = (props: DoubleImageTextBlockProps) => {\n const isFromMedium = useIsFromMedium();\n\n return (\n <BaseImageTextBlock\n className={styles.Container}\n disableMinimumHeight={props.disableMinimumHeight}\n >\n {!isFromMedium && props.proritizeRightContent ? (\n <>\n <ImageTextPropertyBlock {...props.right} />\n <ImageTextPropertyBlock {...props.left} />\n </>\n ) : (\n <>\n <ImageTextPropertyBlock {...props.left} />\n <ImageTextPropertyBlock {...props.right} />\n </>\n )}\n </BaseImageTextBlock>\n );\n};\n\nexport default DoubleImageTextBlock;\n","// extracted by mini-css-extract-plugin\nexport default {\"Container\":\"VUETTU_f\"};","// extracted by mini-css-extract-plugin\nexport default {\"Container\":\"Ypd0HvZh\",\"LinkWrapper\":\"UB_NKnuP\",\"ButtonWrapper\":\"clSqay92\",\"Content\":\"krz_Qx3J\",\"Content--horizontalCenter\":\"qCMRntMQ\",\"Content--verticalCenter\":\"QpI1gwuM\",\"Content--noVerticalCenter\":\"aW1pr0rh\",\"Content--contentLessPadding\":\"hIdzuq5u\",\"Content--contentLessHorizontalPadding\":\"MQ5LaEBg\",\"Image\":\"ZT2h_6Ah\",\"ImageContainer\":\"rZSamSNn\",\"ImageContainer--absolute\":\"FThob5tX\",\"ImageContainer--relative\":\"rX4dLvHh\",\"Image--noExplicitHeight\":\"Sj8KwF9F\",\"Heading\":\"dZ6aR3XU\"};","/* eslint-disable react/jsx-props-no-spreading */\nimport type { Button } from '@coop/components';\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useCallback } from 'react';\n\nimport usePromotionTracking from '../../../tracking/hooks/usePromotionTracking';\nimport type { IGaPromoData } from '../../../tracking/models/IGaPromoData';\nimport RawHtml from '../../atoms/RawHtml';\nimport RawPicture from '../../atoms/RawPicture';\nimport type Heading from '../../Heading';\nimport styles from './ImageTextPropertyBlock.module.scss';\n\nexport interface ImageTextPropertyBlockProps extends IGaPromoData {\n imageUrl?: string;\n imageHeight?: number;\n srcSet?: { srcSet: string; height?: number; minWidth: number }[];\n imageAltText?: string;\n\n centerBlockVertically: boolean;\n centerBlockHorizontally: boolean;\n contentLessPadding: boolean;\n contentLessHorizontalPadding: boolean;\n backgroundColor?:\n | 'u-bgWhite'\n | 'u-bgGreenDark'\n | 'u-bgGreen'\n | 'u-bgGreenLight2'\n | 'u-bgGrayLight';\n linkUrl?: string;\n target: '_self' | '_blank';\n isClickable: boolean;\n body?: string;\n textColor?: string;\n lazy?: boolean;\n ariaLabel: string;\n buttonProps?: React.ComponentPropsWithoutRef<typeof Button>;\n renderButton?: (props: React.ComponentPropsWithoutRef<typeof Button>) => React.ReactNode;\n secondaryButtonProps?: React.ComponentPropsWithoutRef<typeof Button>;\n renderSecondaryButton?: (\n props: React.ComponentPropsWithoutRef<typeof Button>,\n ) => React.ReactNode;\n headingProps?: React.ComponentPropsWithoutRef<typeof Heading>;\n renderHeading?: (props: React.ComponentPropsWithoutRef<typeof Heading>) => React.ReactNode;\n}\n\nconst ImageTextPropertyBlock = (props: ImageTextPropertyBlockProps) => {\n const { ref: trackingRef, click: trackClick } = usePromotionTracking({\n gaPromoCreative: props.gaPromoCreative,\n gaPromoId: props.gaPromoId,\n gaPromoName: props.gaPromoName,\n gaPromoPosition: props.gaPromoPosition,\n });\n\n const ref = useCallback(\n (node: HTMLElement | null) => {\n trackingRef(node);\n },\n [trackingRef],\n );\n\n const anchorRel = props.target?.includes('blank') ? 'noopener noreferrer' : undefined;\n\n // If whole banner is clickable, render is as anchor and dont render the button inside to not have nested interactive elements\n if (props.isClickable) {\n return (\n <a\n ref={ref}\n className={classNames(styles.Container, styles.LinkWrapper, props.backgroundColor)}\n href={props.linkUrl}\n target={props.target}\n rel={anchorRel}\n onClick={trackClick}\n aria-label={props.ariaLabel}\n >\n <Content {...props} />\n </a>\n );\n }\n return (\n <div ref={ref} className={classNames(styles.Container, props.backgroundColor)}>\n <Content\n {...props}\n belowTextSlot={\n !!props.buttonProps &&\n !!props.renderButton && (\n <BottomSlot\n onClick={trackClick}\n centerBlockHorizontally={props.centerBlockHorizontally}\n centerBlockVertically={props.centerBlockVertically}\n buttonProps={props.buttonProps}\n renderButton={props.renderButton}\n secondaryButtonProps={props.secondaryButtonProps}\n renderSecondaryButton={props.renderSecondaryButton}\n />\n )\n }\n />\n </div>\n );\n};\n\nconst Content = (props: ImageTextPropertyBlockProps & { belowTextSlot?: React.ReactNode }) => {\n const bannerPositionClassNames = classNames(\n styles.Content,\n props.centerBlockHorizontally && styles['Content--horizontalCenter'],\n props.centerBlockVertically\n ? styles['Content--verticalCenter']\n : styles['Content--noVerticalCenter'],\n props.contentLessPadding && styles['Content--contentLessPadding'],\n props.contentLessHorizontalPadding && styles['Content--contentLessHorizontalPadding'],\n );\n\n const hasContent =\n !!props.body ||\n React.isValidElement(props.belowTextSlot) ||\n (!!props.headingProps &&\n !!props.renderHeading &&\n React.isValidElement(props.renderHeading(props.headingProps)));\n\n return (\n <>\n {(props.imageUrl || !!props.srcSet?.length) && (\n <RawPicture\n altText={props.imageAltText}\n srcSet={props.srcSet}\n src={props.imageUrl}\n height={props.imageHeight}\n imgClassName={classNames(\n styles.Image,\n !props.imageHeight && styles['Image--noExplicitHeight'],\n )}\n className={classNames(\n styles.ImageContainer,\n hasContent && styles['ImageContainer--absolute'], // if there is any content, it should dictate the height of the block, so make image absolute to be positioned behind the content\n !hasContent && styles['ImageContainer--relative'], // no content - image is dictating the height of the block\n )}\n lazy={props.lazy}\n />\n )}\n {hasContent && (\n <div className={bannerPositionClassNames}>\n <div className=\"u-sizeFull\">\n {!!props.headingProps &&\n !!props.renderHeading &&\n props.renderHeading({\n ...props.headingProps,\n fontFamilySecondary: true,\n alignment: props.centerBlockHorizontally\n ? 'center'\n : props.headingProps.alignment,\n className: classNames(\n props.headingProps.className,\n styles.Heading,\n 'u-marginBsm',\n ),\n })}\n {props.body && (\n <div className={classNames('Editorial', props.textColor)}>\n <RawHtml html={props.body} />\n </div>\n )}\n </div>\n\n {props.belowTextSlot}\n </div>\n )}\n </>\n );\n};\n\nconst BottomSlot = (props: {\n centerBlockHorizontally: boolean;\n centerBlockVertically: boolean;\n onClick: (e: React.MouseEvent<HTMLButtonElement>) => void;\n buttonProps: React.ComponentPropsWithoutRef<typeof Button>;\n renderButton: (props: React.ComponentPropsWithoutRef<typeof Button>) => React.ReactNode;\n secondaryButtonProps?: React.ComponentPropsWithoutRef<typeof Button>;\n renderSecondaryButton?: (\n props: React.ComponentPropsWithoutRef<typeof Button>,\n ) => React.ReactNode;\n}) => {\n const bothButtonsExist = props.buttonProps && props.secondaryButtonProps;\n\n const wrapperClassNames = classNames(\n styles.ButtonWrapper,\n bothButtonsExist && props.centerBlockHorizontally && 'u-flexJustifyCenter',\n );\n\n return (\n <div className={wrapperClassNames}>\n {props.renderButton({\n ...props.buttonProps,\n style:\n bothButtonsExist && props.centerBlockHorizontally\n ? {\n ...props.buttonProps.style,\n // when two buttons exist and are centered then they will be aligned not by themselves, but by the parent component\n margin: 0,\n }\n : props.buttonProps.style,\n onClick: (e) => {\n props.onClick?.(e);\n props.buttonProps?.onClick?.(e);\n },\n })}\n {/* Secondary is rendered only if primary already exists */}\n {!!props.buttonProps &&\n !!props.renderButton &&\n !!props.secondaryButtonProps &&\n props.renderSecondaryButton?.({\n ...props.secondaryButtonProps,\n style:\n bothButtonsExist && props.centerBlockHorizontally\n ? {\n ...props.secondaryButtonProps.style,\n // when two buttons exist and are centered then they will be aligned not by themselves, but by the parent component\n margin: 0,\n }\n : props.secondaryButtonProps.style,\n onClick: (e) => {\n props.onClick?.(e);\n props.secondaryButtonProps?.onClick?.(e);\n },\n })}\n </div>\n );\n};\n\nexport default ImageTextPropertyBlock;\n","import type { ProductAttributeLabel, ProductBadgeProps } from '../models/props/itemTeaserProps';\nimport { filterProductAttributes } from '../utils/productUtils';\n\nexport const useBadges = (labels?: ProductAttributeLabel[]) => {\n const getAppliedBadges = (): ProductBadgeProps[] => {\n if (!labels?.length) {\n return [];\n }\n\n const attributes = filterProductAttributes(labels);\n const badges = attributes.map<ProductBadgeProps>((attribute) => {\n return { alt: attribute.name, url: attribute.image ? attribute.image.url : undefined };\n });\n\n return badges || [];\n };\n\n return getAppliedBadges();\n};\n","import { failSilently } from '../../utils/failSilently';\nimport { sendGA4Event } from '../shared/sendGa4Event';\n\nconst favoriteStore =\n (type: FavoriteStoreInteractionType) => (storeId: string, storeName: string) => {\n const event: FavoriteStoreEvent = {\n event: 'favourite',\n feature_name: 'store',\n type,\n store_id: storeId,\n store_name: storeName.toLowerCase(),\n event_key: `favourite_store_${type}`,\n };\n\n sendGA4Event(event);\n };\n\nconst storeFlyerDownload = (type: StoreFlyerWeekType) => (storeId: string, storeName: string) => {\n const event: StoreFlyerDownloadEvent = {\n event: 'file_download',\n file_name: type === 'current' ? 'veckans reklamblad' : 'nästa veckas reklamblad',\n file_extension: 'pdf',\n store_id: storeId,\n store_name: storeName.toLowerCase(),\n };\n\n sendGA4Event(event);\n};\n\nconst storeLocator = (storeResults: number) => {\n const event: StoreLocatorEvent = {\n event: 'shop_locator',\n shop_results: storeResults,\n event_key: storeResults > 0 ? 'shop_locator_result' : 'shop_locator_no_result',\n };\n\n sendGA4Event(event);\n};\n\nconst becomeAMember = (type: BecomeAMemberType) => (clickText: string) => {\n const event: BecomeAMemberEvent = {\n event: 'interaction',\n type,\n click_text: clickText,\n page_type: 'stores and offers',\n };\n sendGA4Event(event);\n};\nconst storeLoginInteraction = () => {\n const event: StoreLoginInteractionEvent = {\n event: 'login',\n status: 'start',\n method: null,\n };\n sendGA4Event(event);\n};\nconst storeMapInteraction = (\n interactionType: StoreMapInteractionType,\n mapPinLocation: string | null,\n) => {\n switch (interactionType) {\n case 'pinClick':\n sendGA4Event({\n event: 'shop_map_interaction',\n type: 'map pin',\n event_key: 'map_shop_interaction_pin_click',\n map_pin_location: mapPinLocation,\n });\n break;\n case 'zoomOut':\n sendGA4Event({\n event: 'shop_map_interaction',\n type: 'zoom changed',\n event_key: 'map_shop_interaction_zoom_out',\n map_pin_location: mapPinLocation,\n });\n break;\n case 'zoomIn':\n sendGA4Event({\n event: 'shop_map_interaction',\n type: 'zoom changed',\n event_key: 'map_shop_interaction_zoom_in',\n map_pin_location: mapPinLocation,\n });\n break;\n default:\n break;\n }\n};\n\nconst findStore = (pageLocation: string) => {\n const event: FindStoreEvent = {\n event: 'find_store',\n page_location: pageLocation,\n };\n sendGA4Event(event);\n};\n\nconst storeTab = (pageLocation: string, clickText: string) => {\n const event: StoreTabEvent = {\n event: 'store_tab',\n click_text: clickText,\n page_location: pageLocation,\n };\n sendGA4Event(event);\n};\n\nexport default {\n favorite: {\n add: failSilently(favoriteStore('add')),\n remove: failSilently(favoriteStore('remove')),\n },\n storeFlyerDownload: {\n currentWeek: failSilently(storeFlyerDownload('current')),\n nextWeek: failSilently(storeFlyerDownload('next')),\n },\n shopLocator: failSilently(storeLocator),\n storeMapInteraction: failSilently(storeMapInteraction),\n findStore: failSilently(findStore),\n storeTab: failSilently(storeTab),\n becomeAMember: {\n account: failSilently(becomeAMember('account')),\n membership: failSilently(becomeAMember('membership')),\n },\n storeLoginInteraction: failSilently(storeLoginInteraction),\n};\n","import { useEffect } from 'react';\nimport { useInView } from 'react-intersection-observer';\n\nimport { ga4PromotionTracking } from '../ga4/promotion';\nimport type { IGaPromoData } from '../models/IGaPromoData';\n\nconst usePromotionTracking = ({\n gaPromoCreative,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n}: IGaPromoData) => {\n const [ref, inView] = useInView({\n triggerOnce: true,\n threshold: 0.5,\n });\n\n useEffect(() => {\n if (inView) {\n ga4PromotionTracking.viewPromotion({\n gaPromoCreative,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n });\n }\n }, [gaPromoCreative, gaPromoId, gaPromoName, gaPromoPosition, inView]);\n\n const click = () => {\n ga4PromotionTracking.selectPromotion({\n gaPromoCreative,\n gaPromoId,\n gaPromoName,\n gaPromoPosition,\n });\n };\n\n return { ref, click };\n};\n\nexport default usePromotionTracking;\n","import type { FC } from 'react';\nimport { createContext, useContext, useMemo } from 'react';\n\ninterface IRouterContext {}\n\nconst RouterContext = createContext<IRouterContext | null>(null);\n\nconst useRouterContext = () => {\n const routerContext = useContext(RouterContext);\n return routerContext;\n};\n\ninterface RouterContextProviderProps {}\n\nconst RouterContextProvider: FC<React.PropsWithChildren<RouterContextProviderProps>> = ({\n children,\n}) => {\n const contextValue = useMemo(() => ({}), []);\n\n return <RouterContext.Provider value={contextValue}>{children}</RouterContext.Provider>;\n};\n\nexport { RouterContextProvider, useRouterContext };\n","import { useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\n\nimport { useRouterContext } from '../contexts/useRouterContext';\n\ntype Path = string;\n\nexport interface AppHistoryState {\n noScroll?: boolean;\n}\n\ninterface RouteState {\n state?: AppHistoryState;\n search?: string;\n}\n\nconst isPath = (arg: Path | RouteState): arg is Path => {\n return typeof arg === 'string';\n};\n\nconst useReactRouting = () => {\n const navigate = useNavigate();\n const routerContext = useRouterContext();\n const isReactRouted = routerContext !== null;\n\n const pushPath = useCallback(\n (path: string, isRedirect: boolean = false) => {\n if (!path.startsWith('/')) {\n window.location.href = path;\n return;\n }\n\n if (isRedirect) {\n window.location.href = path;\n return;\n }\n\n if (!isReactRouted) {\n window.location.href = path;\n return;\n }\n\n navigate(path);\n },\n [isReactRouted, navigate],\n );\n\n const prepareLocation = useCallback(\n (location: RouteState) => {\n const newLocationState = { ...location };\n\n if (routerContext) {\n newLocationState.state = {\n ...location.state,\n };\n } else {\n newLocationState.state = {};\n }\n\n return newLocationState;\n },\n [routerContext],\n );\n\n const pushLocation = useCallback(\n (location: RouteState) => {\n const newLocation = prepareLocation(location);\n navigate(newLocation);\n },\n [navigate, prepareLocation],\n );\n\n const push = useCallback(\n (path: Path | RouteState, isRedirect: boolean = false) => {\n if (isPath(path)) {\n pushPath(path, isRedirect);\n return;\n }\n\n pushLocation(path);\n },\n [pushLocation, pushPath],\n );\n\n const replace = useCallback(\n (location: Path | RouteState) => {\n if (isPath(location)) {\n navigate(location);\n return;\n }\n\n const newLocation = prepareLocation(location);\n navigate(newLocation);\n },\n [navigate, prepareLocation],\n );\n\n const goBack = useCallback(() => {\n navigate(-1);\n }, [navigate]);\n\n return {\n push,\n pushLocation,\n replace,\n goBack,\n };\n};\n\nexport default useReactRouting;\n","import { appConfig } from '../../appConfig';\nimport type { PageHeadData } from '../common/components/atoms/PageHead';\nimport { ensureTrailingSlash } from '../common/utils/urlUtils';\nimport type { EpiPageTypes } from './components/pages/epiPageTypes';\nimport type { EpiSitePageType } from './components/pages/epiSitePageType';\n\nexport const getCssClassForDisplayOptionWithDefaultTag = (name: DisplayOption) => {\n const potentialCssClass = appConfig.coopSettings.epi.blockDisplayOptionToCssClass[name];\n\n if (potentialCssClass) {\n return `${appConfig.coopSettings.epi.baseChildrenCssClass} ${potentialCssClass}`;\n }\n\n return appConfig.coopSettings.epi.baseChildrenCssClass;\n};\n\nexport const filterContentArea = <T extends IContent>(\n contentArea: ContentAreaItem[],\n predicate: (content: IContent) => content is T,\n): T[] => {\n const contents =\n contentArea\n ?.map((x) => x.contentLink?.expanded)\n .filter(Boolean)\n .filter(predicate) || [];\n return contents;\n};\n\nexport const filterContent = <T extends IContent>(\n contentItems: IContent[],\n predicate: (content: IContent) => content is T,\n): T[] => {\n const filteredContents = contentItems?.filter(predicate) || [];\n return filteredContents;\n};\n\nexport const filterContentType = <T extends EpiPageTypes[keyof EpiPageTypes]>(\n contents: IContent[],\n contentType: keyof EpiPageTypes,\n): T[] => {\n return (contents?.filter((item) => item.contentType.includes(contentType)) as T[]) || [];\n};\n\n/**\n * Use with caution, EPI adds ?epieditmode=True in edit mode, but so can users\n */\nexport const isEpiEditMode = () =>\n new URLSearchParams(window.location.search).get('epieditmode') === 'True';\n\nexport const editTableProp = (name: string) => (window.epi?.inEditMode ? name : undefined);\n\nexport const mapEpiPageHeadData = (page: EpiSitePageType): PageHeadData => {\n const canonicalUrl = page.canonicalUrl && ensureTrailingSlash(page.canonicalUrl);\n\n return {\n title: page.pageTitle,\n link: {\n canonical: canonicalUrl,\n },\n meta: {\n description: page.metaDescription,\n 'og:url': canonicalUrl,\n 'og:description': page.metaDescription,\n },\n };\n};\n\nexport const isEpiPageViewSettings = (page: IContent): page is PageViewSettingsIContent => {\n return 'contentPageSize' in (page as PageViewSettingsIContent);\n};\n\nexport const isContentReference = (input: unknown): input is ContentReference => {\n return 'url' in (input as ContentReference);\n};\n","import type { AxiosInstance } from 'axios';\n\nimport { appConfig } from '../../../appConfig';\nimport { getAuthToken } from '../../common/api/auth/getAuthToken';\nimport axiosClientFactory from '../../common/api/clients/clientFactory';\n\nconst getHeaderWithTokenOrNot = async () => {\n const baseHeader = {\n Accept: 'application/json',\n 'Ocp-Apim-Subscription-Key': appConfig.coopSettings.serviceAccess.storeApiSubscriptionKey,\n 'Ocp-Apim-Trace': 'true',\n };\n\n if (appConfig.coopUserSettings.isAuthenticated) {\n const { token } = await getAuthToken();\n return {\n Authorization: `Bearer ${token}`,\n ...baseHeader,\n };\n }\n\n return baseHeader;\n};\n\nconst getDirectStoresAxiosClient = async (version?: string): Promise<AxiosInstance> => {\n const directStoresAxiosClient = axiosClientFactory.createDirectApiClient({\n baseURL: appConfig.coopSettings.serviceAccess.storeApiUrl,\n headers: await getHeaderWithTokenOrNot(),\n params: {\n 'api-version': version || 'v1',\n },\n });\n\n return directStoresAxiosClient;\n};\n\nexport default getDirectStoresAxiosClient;\n","import axios from 'axios';\n\nimport { appConfig } from '../../../appConfig';\nimport type { FavoriteStore, Store, StoreSimple } from '../models';\nimport type { MapStore } from '../storeOffersMap/models';\nimport {\n getLastVisitedStoreLocalStorage,\n getWithAddedZerosIfNeccessaryForLedgerAccountNumber,\n} from '../utils';\nimport getDirectStoresAxiosClient from './directStoresAxiosClient';\n\nconst getAllStores = async (): Promise<MapStore[]> => {\n const axiosClient = await getDirectStoresAxiosClient('v2');\n const response = await axiosClient.get('/stores/map?conceptIds=12,6,95&invertFilter=true'); // 12 Coop center. 6 and 95 is x:-tra\n return response.data;\n};\n\n// If you need to clear favorite stores cache on Coop.se\nconst clearCoopSeUserFavoriteStoresCache = async () => {\n const response = await axios.put('/api/userprofile/store/clearuserfavoritestorescache');\n return response.data;\n};\n\n// Store API: https://app-external-store-api-dev.azurewebsites.net/swagger/index.html\nconst getStoresByStoreIds = async (storeIds: number[]): Promise<StoreSimple[]> => {\n if (storeIds.length > 0) {\n const axiosClient = await getDirectStoresAxiosClient();\n const response = await axiosClient.get(`/stores?storeIds=${storeIds.join(',')}`);\n return response.data.stores;\n }\n\n return [];\n};\n\nconst getFavoriteStores = async (): Promise<FavoriteStore[]> => {\n const axiosClient = await getDirectStoresAxiosClient();\n const response = await axiosClient.get('/favorite-stores/me');\n return response.data.favoriteStores;\n};\nconst getLastVisitedStore = async (): Promise<StoreSimple[]> => {\n const lastVisited = getLastVisitedStoreLocalStorage();\n const foundStores = await getStoresByStoreIds(lastVisited);\n return foundStores;\n};\nconst getStoresInformation = async (id: string): Promise<Store> => {\n const axiosClient = await getDirectStoresAxiosClient();\n const response = await axiosClient.get(`/stores/${id}`);\n return response.data;\n};\n\nconst addFavoriteStore = async ({ ledgerId }: { ledgerId: string }) => {\n if (appConfig.coopUserSettings.isAuthenticated) {\n const axiosClient = await getDirectStoresAxiosClient();\n const response = await axiosClient.post(\n `/favorite-stores/${getWithAddedZerosIfNeccessaryForLedgerAccountNumber(ledgerId)}`,\n );\n return response.data;\n }\n};\n\nconst deleteFavoriteStore = async ({ ledgerId }: { ledgerId: string }) => {\n if (appConfig.coopUserSettings.isAuthenticated) {\n const axiosClient = await getDirectStoresAxiosClient();\n const response = await axiosClient.delete(\n `/favorite-stores/${getWithAddedZerosIfNeccessaryForLedgerAccountNumber(ledgerId)}`,\n );\n\n return response.data;\n }\n};\n\nexport default {\n stores: {\n getAll: getAllStores,\n getStoresByStoreIds,\n getStoresInformation,\n getLastVisitedStore,\n },\n userFavorites: {\n clearCoopSeUserFavoriteStoresCache,\n getAll: getFavoriteStores,\n add: addFavoriteStore,\n delete: deleteFavoriteStore,\n },\n};\n","/* eslint-disable prettier/prettier */\n/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable unused-imports/no-unused-vars */\nimport { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\n\nimport { useIsUserAuthenticated } from '../../common/hooks/useUserProfile';\nimport storeApi from '../api/storeApi';\nimport { ensureStoreLedgerIdFormat } from '../pages/StorePage/StorePage.utils';\nimport { storeQueryKeys } from '../storeQueries';\n\nconst useFavoriteStores = (filterXtraStores: boolean = true) => {\n const isAuthenticated = useIsUserAuthenticated();\n const query = useQuery({\n queryKey: storeQueryKeys.favoriteStores,\n queryFn: storeApi.userFavorites.getAll,\n staleTime: Infinity,\n enabled: isAuthenticated,\n });\n\n const queryClient = useQueryClient();\n\n const addFavoriteStoreMutation = useMutation({\n mutationFn: storeApi.userFavorites.add,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: storeQueryKeys.favoriteStores });\n storeApi.userFavorites.clearCoopSeUserFavoriteStoresCache();\n },\n });\n\n const deleteFavoriteStoreMutation = useMutation({\n mutationFn: storeApi.userFavorites.delete,\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: storeQueryKeys.favoriteStores });\n storeApi.userFavorites.clearCoopSeUserFavoriteStoresCache();\n },\n });\n\n const allStores =\n query.data?.filter((item) => !!item.storeId && !!item.ledgerAccountNumber) || [];\n\n const favoriteStores = (\n filterXtraStores\n ? allStores.filter(\n (store) =>\n // those are concept IDs of X:-TRA stores that have their external domain, so we never show our own EPi store page for it\n // why two ids? - when X:-TRA became a concept it was suppossed to have 95 as ID (thats saved in our DB), but after migrating store data to Broo, they changed it to 6\n // old id was left in db too\n store.conceptId !== 95 && // X:-TRA (old concept id)\n store.conceptId !== 6 && // X:-TRA (new concept id)\n !store.name.toLowerCase().includes('x:-tra'), // X:-TRA stores with wrong conceptIds))\n )\n : allStores\n ).map((item) => ({\n ...item,\n ledgerAccountNumber: ensureStoreLedgerIdFormat(item.ledgerAccountNumber!),\n }));\n\n return {\n favoriteStores,\n getFavoriteStoresStatus: query.status,\n favoriteStoreError:\n query.error || addFavoriteStoreMutation.error || deleteFavoriteStoreMutation.error,\n favoriteStoresLoading: query.isLoading,\n addFavoriteStore: addFavoriteStoreMutation.mutate,\n deleteFavoriteStore: deleteFavoriteStoreMutation.mutate,\n favoriteStoreClearError() {\n addFavoriteStoreMutation.reset();\n deleteFavoriteStoreMutation.reset();\n },\n };\n};\n\nexport default useFavoriteStores;\n","import type { ApiDkeStoreOffer } from '../../../common/api/dke/dkeModels';\nimport type { EpiStoreOffersCategoryBlock } from '../../../episerver/components/blocks/EpiStoreOffersCategoryBlock/epiStoreOffersCategoryBlockType';\nimport type { EpiStoreOffersCategoryContainerBlockType } from '../../../episerver/components/blocks/EpiStoreOffersCategoryContainerBlock/epiStoreOffersCategoryContainerBlockType';\nimport type { EpiStoreSettingsPageType } from '../../../episerver/components/pages/EpiStoreSettingsPage/epiStoreSettingsPageType';\nimport { filterContentArea } from '../../../episerver/epiUtils';\n\nexport const getStreetAndGoogleAddress = (address: string, headLine: string) => {\n let streetAddress;\n let address1;\n let address2;\n let googleAddress;\n const addressStr = [];\n if (address) {\n streetAddress = address?.split(' ');\n const coopName = headLine?.replace('Lilla', '')?.replace(':-', '');\n\n googleAddress = `https://maps.google.com/maps?q=${coopName}+${\n streetAddress[0]\n }+${streetAddress[1].replace(/,*$/, '')}+${streetAddress[2]}+${streetAddress[3]}`;\n\n address1 = address?.split(',');\n address2 = streetAddress.reverse();\n addressStr.push(address1[0], address2[1], address2[0]);\n\n return { addressStr, googleAddress };\n }\n};\n\nexport const filterServices = (array: string[], str: string) => {\n return (array || []).filter((service) => {\n return !!service && !!str && str.split('|').includes(service);\n });\n};\nexport const ensureStoreLedgerIdFormat = (id: string) =>\n (id || []).length < 6 ? id.padStart(6, '0') : id;\n\nexport const configuringSvgIcons = (\n roleDescriptions: string[],\n otherLogos: [],\n ageRestriction: string | undefined,\n environmentalCode: string | undefined,\n ethicCode: string | undefined,\n nutritionCode: string | undefined,\n) => {\n const arr = [];\n\n if (ageRestriction === '15-års åldersgräns' || ageRestriction === '15') {\n arr.push({\n url: '/Assets/Icons/badge-15arsgrans.svg',\n alt: 'Åldersgräns: 15 år',\n });\n }\n if (ageRestriction === '18-års åldersgräns' || ageRestriction === '18') {\n arr.push({\n url: '/Assets/Icons/badge-18arsgrans.svg',\n alt: 'Åldersgräns: 18 år',\n });\n }\n roleDescriptions.forEach((role) => {\n if (role === 'VE')\n arr.push({\n url: '/Assets/Icons/veckans-ekologiska.svg',\n alt: 'Veckans ekologiska',\n });\n if (role === 'NY') arr.push({ url: '/Assets/Icons/badge-nyhet.svg', alt: 'Nyhet' });\n });\n switch (environmentalCode) {\n case '2':\n arr.push({\n url: '/Assets/Icons/badge-bramiljoval.svg',\n alt: 'Bra miljöval',\n });\n break;\n case '3':\n arr.push({\n url: '/Assets/Icons/badge-krav.svg',\n alt: 'Krav',\n });\n break;\n case '4':\n arr.push({\n url: '/Assets/Icons/badge-svanen.svg',\n alt: 'Svanen',\n });\n break;\n case '6':\n arr.push({\n url: '/Assets/Icons/badge-fsc.svg',\n alt: 'FSC - Forest Stewardship Council',\n });\n break;\n case '8':\n arr.push({\n url: '/Assets/Icons/badge-msc.svg',\n alt: 'MSC - Marine Stewardship Council',\n });\n break;\n case 'A':\n arr.push({\n url: '/Assets/Icons/badge-eu-ekologiskt-jordbruk.svg',\n alt: 'EU - Ekologiskt jordbruk',\n });\n break;\n case 'B':\n arr.push({\n url: '/Assets/Icons/badge-asc.svg',\n alt: 'ASC - Aquaculture Stewardship Council',\n });\n break;\n default:\n }\n if (ethicCode === '0') {\n arr.push({\n url: '/Assets/Icons/badge-fairtrade.svg',\n alt: 'Fairtade',\n });\n }\n if (nutritionCode === '1') {\n arr.push({\n url: '/Assets/Icons/badge-nyckelhal.svg',\n alt: 'Nyckelhål',\n });\n }\n\n otherLogos.forEach((logo) => {\n if (logo === 'Svensk kött') {\n arr.push({\n url: '/Assets/Icons/badge-svenskt-kott.svg',\n alt: 'Kött från Sverige',\n });\n }\n if (logo === 'Svensk fågel') {\n arr.push({\n url: '/Assets/Icons/badge-svensk-fagel.svg',\n alt: 'Svensk fågel',\n });\n }\n });\n return arr;\n};\n\nexport const extractingImages = (offers: ApiDkeStoreOffer[]) => {\n return offers.slice(0, 3).map((obj) => obj.content.imageUrl);\n};\n\nconst isStoreOffersCategoryBlockType = (\n content: IContent,\n): content is EpiStoreOffersCategoryBlock => {\n return content?.contentType?.includes('StoreOffersCategoryBlockType') === true;\n};\n\nconst isStoreOffersCategoryContainerBlockType = (\n content: IContent,\n): content is EpiStoreOffersCategoryContainerBlockType => {\n return content?.contentType?.includes('StoreOffersCategoryContainerBlockType') === true;\n};\n\nexport const getNumberOfRows = (\n listIndex: number,\n listHeading: string,\n storeOffers: ApiDkeStoreOffer[],\n minimalOffersCount: number,\n pageSettings?: EpiStoreSettingsPageType,\n) => {\n if (pageSettings && storeOffers && listHeading !== 'Övrigt') {\n const categoryContainers = filterContentArea(\n pageSettings.drCategoryContainers,\n isStoreOffersCategoryContainerBlockType,\n );\n\n const offers = categoryContainers.find(\n (droffers) => droffers.minimalOffersCount === minimalOffersCount,\n );\n\n if (offers) {\n const categoryBlocks = filterContentArea(\n offers.categoryBlocks,\n isStoreOffersCategoryBlockType,\n );\n\n if (categoryBlocks && categoryBlocks[listIndex]) {\n return {\n numberOfRowsDesktop: categoryBlocks[listIndex].maxRowsBeforLoadModeDesktop || 1,\n numberOfRowsTablet: categoryBlocks[listIndex].maxRowsBeforLoadModeTablet || 1,\n numberOfRowsPhone: categoryBlocks[listIndex].maxRowsBeforLoadModeTablet || 1,\n };\n }\n }\n }\n\n return {\n numberOfRowsDesktop: 0,\n numberOfRowsTablet: 0,\n numberOfRowsPhone: 0,\n };\n};\n\nexport const getCurrentStoreMetaDescription = (\n storeName: string,\n template: string,\n storeServices: string[],\n storeServicesPriority: { storeService: string; storeServiceOverridenName: string }[],\n) => {\n const filteredPrioritizedServices = storeServicesPriority\n .filter((item) => storeServices.includes(item.storeService))\n .map((item) => item.storeServiceOverridenName || item.storeService)\n .slice(0, 4); // only 4 first sevices are put inside meta description\n\n let description = template.replace('[STORE_NAME]', storeName);\n const storeServicesString = filteredPrioritizedServices.reduce((acc, curr, index, array) => {\n let elementWithPrefix = '';\n\n switch (index) {\n case 0: {\n elementWithPrefix = curr;\n break;\n }\n case array.length - 1: {\n elementWithPrefix = ` och ${curr}`;\n break;\n }\n default: {\n elementWithPrefix = `, ${curr}`;\n }\n }\n\n return acc + elementWithPrefix;\n }, '');\n\n description = description.replace('[STORE_SERVICES]', storeServicesString);\n\n return description;\n};\n","import { ga4StoresTracking } from '../../common/tracking/ga4/stores';\n\nexport const becomeAMemberHandler = (\n event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>,\n) => {\n const buttonText = event.currentTarget.innerText;\n\n ga4StoresTracking.becomeAMember.membership(buttonText);\n};\nexport const accountHandler = (event: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => {\n const buttonText = event.currentTarget.innerText;\n ga4StoresTracking.becomeAMember.account(buttonText);\n};\nexport const loginHandler = () => {\n ga4StoresTracking.storeLoginInteraction();\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"LoginBlock\":\"yv0WpwXm\",\"Container\":\"mV8Mr4m_\",\"Heading\":\"nvLZg5Vt\",\"ButtonContainer\":\"t4_kZz62\",\"MemberLink\":\"DIv0URV8\"};","/* eslint-disable react/jsx-props-no-spreading */\nimport { Button } from '@coop/components';\nimport classNames from 'classnames';\n\nimport { appConfig } from '../../../../../appConfig';\nimport {\n useBrowserCustomMediaQuery,\n useIsFromMedium,\n} from '../../../../common/components/atoms/ResponsiveBreakpoints';\nimport Heading from '../../../../common/components/Heading';\nimport DoubleImageTextBlock from '../../../../common/components/organisms/DoubleImageTextBlock/DoubleImageTextBlock';\nimport type { ImageTextPropertyBlockProps } from '../../../../common/components/organisms/ImageTextPropertyBlock/ImageTextPropertyBlock';\nimport { becomeAMemberHandler, loginHandler } from '../../../pages/StoreAndOffers.utils';\nimport styles from './BecomeAMemberBlock.module.scss';\n\nconst { loginUrl } = appConfig.coopSettings;\nconst becomMemberUrl = appConfig.coopSettings.myProfilePage?.becomeAMemberPageUrl;\n\nconst BecomeAMemberBlock = () => {\n const isLoggedIn = appConfig.coopUserSettings.isAuthenticated;\n const isMember = appConfig.coopUserSettings.isMedmeraCustomer;\n\n if (isLoggedIn && !isMember) return <LogginedIn />;\n if (!isLoggedIn) {\n return <NotLoggedIn />;\n }\n return null;\n};\nexport default BecomeAMemberBlock;\n\nconst LogginedIn = () => {\n const isMediumDevice = useIsFromMedium();\n const isValidScreen = useBrowserCustomMediaQuery(0, 480);\n\n return (\n <div className=\"Section u-marginVlg\">\n <div className={classNames('u-bgGreenLight u-borderRadius20', styles.LoginBlock)}>\n <div className={styles.Container}>\n <h1\n className={classNames(\n styles.Heading,\n 'u-textFamilySecondary u-marginBz u-colorGreenDark u-textXLarge u-lg-size2of3 u-sm-size3of5 u-md-size3of5 u-md-text3XLarge',\n )}\n >\n Se dina personliga erbjudanden\n </h1>\n\n <h2 className=\"u-textWeightMedium u-marginVxsm u-sm-size1of2 u-md-textXLarge u-textMedium \">\n Som medlem får du personliga erbjudanden varje vecka. Bli medlem idag!\n </h2>\n\n <div className=\"u-paddingBlg u-flex u-flexWrap u-flexGap16\">\n <Button\n fullWidth={!!isValidScreen}\n theme=\"primary\"\n asChild\n size={isMediumDevice ? 48 : 40}\n onClick={becomeAMemberHandler}\n >\n <a href={becomMemberUrl}>Bli medlem</a>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nconst NotLoggedIn = () => {\n const rightprops = getRightImageTextProps();\n return (\n <div className=\"Section Section--margin\">\n <DoubleImageTextBlock\n right={rightprops}\n left={{\n imageUrl: '/Assets/Images/LoginBlock/coop-shopping.png',\n centerBlockVertically: true,\n centerBlockHorizontally: true,\n contentLessPadding: true,\n contentLessHorizontalPadding: true,\n target: '_self',\n isClickable: false,\n ariaLabel: '',\n }}\n disableMinimumHeight={false}\n proritizeRightContent={false}\n />\n </div>\n );\n};\nconst getRightImageTextProps = (): ImageTextPropertyBlockProps => ({\n imageUrl: '',\n centerBlockVertically: true,\n centerBlockHorizontally: true,\n contentLessPadding: false,\n contentLessHorizontalPadding: false,\n target: '_self',\n isClickable: false,\n body: 'Logga in för att se alla rabatter och personliga erbjudanden.',\n textColor: 'u-colorGreenDark',\n lazy: false,\n imageAltText: '',\n ariaLabel: '',\n buttonProps: {\n theme: 'primary',\n fullWidth: true,\n disabled: false,\n className: 'u-marginHauto',\n size: 40,\n },\n headingProps: {\n children: 'Missa inga erbjudanden!',\n color: 'darkGreen',\n element: 'h2',\n stylingElement: 'h1',\n className: 'u-marginHauto',\n },\n renderButton: (bProps) => (\n <div className={styles.ButtonContainer}>\n <Button {...bProps} onClick={loginHandler} asChild>\n <a href={loginUrl} rel=\"nofollow\">\n Logga in med BankID\n </a>\n </Button>\n <div className={styles.MemberLink}>\n <a\n href={becomMemberUrl}\n onClick={becomeAMemberHandler}\n className=\"u-colorGreenDark\"\n >\n Bli Coop-medlem\n </a>\n </div>\n </div>\n ),\n\n renderHeading: (hProps) => <Heading {...hProps} />,\n});\n","/* eslint-disable no-unsafe-optional-chaining */\nimport { Button, Icon } from '@coop/components';\nimport { ChevronDownIcon } from '@coop/icons';\nimport classNames from 'classnames';\nimport type { FC } from 'react';\n\nimport { appConfig } from '../../../../../appConfig';\nimport { b2bModeTrigger } from '../../../../base/components/UserTypeModeSwitch/UserTypeModeSwitch.utils';\nimport type { ApiDkeStoreOffer } from '../../../../common/api/dke/dkeModels';\nimport CloudinaryImage from '../../../../common/components/atoms/CloudinaryImage';\nimport {\n useIsFromXSmall,\n useIsMobile,\n} from '../../../../common/components/atoms/ResponsiveBreakpoints';\nimport Splash from '../../../../common/components/atoms/Splash';\nimport ProductTeaser from '../../../../common/components/molecules/ProductTeaser';\nimport AddOfferToShoppingListButton from '../../../../shoppingList/components/offer/AddOfferToShoppingListButton';\nimport { configuringSvgIcons, extractingImages } from '../../../pages/StorePage/StorePage.utils';\nimport styles from './StoreOfferTeaser.module.less';\nimport {\n configuringCssIcons,\n formatOrdinaryPriceText,\n isBusinessEcommerceFuc,\n splashHasLongValueOnly,\n svgIconsForClusterOffers,\n} from './StoreOfferTeaser.utils';\n\nexport interface SvgIcons {\n url: string;\n alt: string;\n}\ninterface StoreOfferTeaserProps {\n offer: ApiDkeStoreOffer;\n onGroupClick?: () => void;\n isExpanded?: boolean;\n groupedFirstItem?: boolean;\n showAddToShoppingList?: boolean;\n}\n\nconst StoreOfferTeaser: FC<React.PropsWithChildren<StoreOfferTeaserProps>> = ({\n offer,\n onGroupClick,\n isExpanded,\n groupedFirstItem,\n showAddToShoppingList,\n}) => {\n let shopExpress = false;\n\n const clusterInteriorOffers = groupedFirstItem ? [] : offer.clusterInteriorOffers;\n\n const ordinaryPriceText = formatOrdinaryPriceText(\n offer.categoryGroup,\n offer.roleDescriptions,\n offer.priceInformation?.ordinaryPrice?.toString().replace('.', ','),\n offer.priceInformation?.unit,\n offer.content?.formattedComparativePriceText,\n );\n\n offer.roleDescriptions?.forEach((role) => {\n if (role === 'SE') {\n shopExpress = true;\n }\n });\n\n const extractedImages = clusterInteriorOffers && extractingImages(clusterInteriorOffers);\n\n const svgIcons = configuringSvgIcons(\n offer.roleDescriptions,\n offer.otherLogos,\n offer.ageRestriction,\n offer.environmentalCode,\n offer.ethicCode,\n offer.nutritionCode,\n );\n\n const svgIconsCluster =\n offer.clusterInteriorOffers && svgIconsForClusterOffers(offer.clusterInteriorOffers);\n\n const toggleClusteredOffers = () => {\n onGroupClick?.();\n };\n\n const isLoggedIn = appConfig.coopUserSettings.isAuthenticated;\n\n const showIcons = (iconsArray: SvgIcons[]) => {\n return (\n <>\n {iconsArray.map((icon, index) => (\n <img\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n className=\"ProductTeaser-badge\"\n src={icon?.url}\n alt={icon?.alt}\n width={24}\n height={24}\n />\n ))}\n </>\n );\n };\n\n const additionalRules = () => {\n const cssIcons = configuringCssIcons(offer.roleDescriptions);\n const isBusinessEcommerce = b2bModeTrigger().isB2BUser;\n\n const promotionUnit = cssIcons?.household\n ? isBusinessEcommerceFuc(isBusinessEcommerce)\n : 'hushåll';\n\n let dealOfferOrLimitationText = offer.content?.dealOfferLimitText;\n if (!dealOfferOrLimitationText && offer.content?.limitations[0] !== '0') {\n dealOfferOrLimitationText = `Max ${offer.content?.limitations[0]} köp/${\n promotionUnit || 'hushåll'\n }`;\n }\n\n const dealOfferRulesText = offer.content?.dealOfferRulesText?.trim();\n\n const recyclingInformationText = offer.content?.recyclingInformationText;\n\n if (!dealOfferOrLimitationText && !dealOfferRulesText && !recyclingInformationText) {\n return null;\n }\n\n return (\n <div className=\"u-marginTauto\">\n {dealOfferOrLimitationText && (\n <div className=\"u-colorRed1 u-textCenter\">{dealOfferOrLimitationText}</div>\n )}\n\n {dealOfferRulesText && (\n <div className=\"u-colorRed1 u-textCenter\">\n {offer.content?.dealOfferRulesText}\n </div>\n )}\n\n {recyclingInformationText && (\n <div className=\"u-colorRed1 u-textCenter\">{recyclingInformationText}</div>\n )}\n </div>\n );\n };\n\n const ordinaryPriceTextFormatted =\n ((clusterInteriorOffers?.length === 0 || clusterInteriorOffers === undefined) &&\n ordinaryPriceText) ||\n undefined;\n\n const descriptionFormatted =\n ((clusterInteriorOffers?.length === 0 || clusterInteriorOffers === undefined) &&\n offer.content?.description) ||\n undefined;\n\n const packageSizeInformationFormatted =\n ((clusterInteriorOffers?.length === 0 || clusterInteriorOffers === undefined) &&\n offer.content?.amountInformation) ||\n undefined;\n\n const manufacturerFormatted =\n clusterInteriorOffers?.length === 0 || clusterInteriorOffers === undefined\n ? offer.content?.brand\n : undefined;\n\n const isFromXSmall = useIsFromXSmall();\n const isMobile = useIsMobile();\n\n const splashShowAllTextOnly = splashHasLongValueOnly(offer.unifiedSplash);\n\n return (\n <ProductTeaser.Wrapper containerCss={classNames('u-borderAllGrayLight2', styles.Container)}>\n <ProductTeaser.Media\n name={offer.content?.title}\n imageUrl={offer.content?.imageUrl}\n slotTopBadge={\n (clusterInteriorOffers?.length === 0 || clusterInteriorOffers === undefined) &&\n svgIcons\n ? showIcons(svgIcons)\n : showIcons(svgIconsCluster)\n }\n promotionSplashSlot={\n <Splash\n type={!isFromXSmall ? 'small' : 'default'}\n allText={splashShowAllTextOnly ? offer.unifiedSplash.value : ''}\n prefix={offer.unifiedSplash?.prefix}\n price={!splashShowAllTextOnly ? offer.unifiedSplash?.value : ''}\n suffix={offer.unifiedSplash?.suffix}\n decimal={offer.unifiedSplash?.decimal}\n unit={offer.unifiedSplash?.unit}\n isMemberPrice={offer.unifiedSplash?.tag?.includes('Medlemspris')}\n />\n }\n />\n <div className=\"ProductTeaser-info\">\n <div className=\"ProductTeaser-headingContainer\">\n {(clusterInteriorOffers?.length > 0 || shopExpress) && (\n <div className=\"ProductTeaser-features\">\n <div>\n {clusterInteriorOffers?.length > 0 && (\n <div className=\"ProductTeaser-tag ProductTeaser-tag--images\">\n {extractedImages.map((image, index) => (\n <CloudinaryImage\n // eslint-disable-next-line react/no-array-index-key\n key={index}\n url={image}\n name=\"product variation\"\n transform=\"e_sharpen,f_auto,fl_progressive,q_90,c_lpad,g_center,w_56,h_56\"\n retinaTransform=\"e_sharpen,f_auto,fl_progressive,q_90,c_pad,g_center,h_60,w_60\"\n />\n ))}\n </div>\n )}\n {shopExpress && (\n <div className=\"u-flex u-flexJustifyCenter u-sizeFull\">\n <div className=\"ProductTeaser-tag ProductTeaser-tag--shopExpress\">\n SHOPEXPRESS\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n {offer.content?.title && <ProductTeaser.Heading name={offer.content?.title} />}\n {packageSizeInformationFormatted && (\n <div className=\"ProductTeaser-features\">\n <ProductTeaser.PackageSizeInfo\n packageSizeInformation={packageSizeInformationFormatted}\n />\n </div>\n )}\n </div>\n <div\n className={classNames(\n 'u-flex u-flexGrow u-flexDirectionColumn u-flexAlignCenter u-flexJustifyStart u-marginTxsm',\n styles['StoreOfferTeaser-details'],\n )}\n >\n {manufacturerFormatted && (\n <div className=\"u-marginBxxsm\">\n <ProductTeaser.Brand brand={manufacturerFormatted} />\n </div>\n )}\n {descriptionFormatted && <div>{descriptionFormatted}</div>}\n\n {ordinaryPriceTextFormatted && <div>{ordinaryPriceTextFormatted}</div>}\n\n {/* dont look here, I am just a pointless spacing that designers wanted :) */}\n <div style={{ marginBottom: 20 }} />\n\n {additionalRules()}\n </div>\n </div>\n {showAddToShoppingList && isLoggedIn ? (\n <div className={classNames('u-sizeFull u-flex u-flexJustifyCenter')}>\n <AddOfferToShoppingListButton offerId={offer.id} offerType=\"DKE\" />\n </div>\n ) : (\n clusterInteriorOffers?.length > 0 && (\n <div className={classNames('u-sizeFull u-flex u-flexJustifyCenter')}>\n <Button\n aria-label={` Visa ${clusterInteriorOffers?.length + 1} varianter`}\n theme=\"primaryOutline\"\n onClick={toggleClusteredOffers}\n fullWidth\n rightSlot={\n <Icon\n icon={ChevronDownIcon}\n rotateClockwise={isExpanded ? '180deg' : '0deg'}\n width={16}\n aria-hidden\n />\n }\n >\n {isMobile ? '' : ` Visa ${clusterInteriorOffers?.length + 1} varianter`}\n </Button>\n </div>\n )\n )}\n </ProductTeaser.Wrapper>\n );\n};\nexport default StoreOfferTeaser;\n","// extracted by mini-css-extract-plugin\nexport default {\"Container\":\"ZqYMYGyR\",\"StoreOfferTeaser-details\":\"nEatcoiG\"};","import { Cookies } from '../../utility/cookies';\nimport { FAVORITE_STORES_COOKIE_NAME } from '../common/persistance/cookie/cookieKeys';\n\nexport const getFavoriteStoreIdsFromCookie = () => {\n const storesString = Cookies.read(FAVORITE_STORES_COOKIE_NAME);\n return storesString && storesString !== null && storesString.length !== 0\n ? (JSON.parse(storesString) as number[])\n : [];\n};\nexport const getLastVisitedStoreLocalStorage = () => {\n const lastVisited = localStorage.getItem('Store:LastVisited');\n return lastVisited ? ([JSON.parse(lastVisited)] as number[]) : [];\n};\n\nexport const updateLastVisitedStoreLocalStorage = (newStoreId: number): void => {\n const lastVisitedStoreId = getLastVisitedStoreLocalStorage();\n if (!lastVisitedStoreId) {\n const favoriteStoreCookie = getFavoriteStoreIdsFromCookie();\n if (favoriteStoreCookie.length) {\n setLocalStorage([favoriteStoreCookie[0]], newStoreId);\n }\n } else setLocalStorage(lastVisitedStoreId, newStoreId);\n};\nconst setLocalStorage = (storeId: number[], newStoreId: number) => {\n if (!storeId.includes(newStoreId)) {\n localStorage.setItem('Store:LastVisited', JSON.stringify([newStoreId]));\n }\n};\n\nexport const getWithAddedZerosIfNeccessaryForLedgerAccountNumber = (\n ledgerAccountNumber: string,\n) => {\n if (ledgerAccountNumber.length >= 6) {\n return ledgerAccountNumber;\n }\n\n const zerosToAdd = 6 - ledgerAccountNumber.length;\n return '0'.repeat(zerosToAdd) + ledgerAccountNumber;\n};\n"],"names":["_path","_extends","Object","assign","bind","n","e","arguments","length","t","r","hasOwnProperty","call","apply","_ref","title","titleId","props","width","height","viewBox","xmlns","id","fillRule","clipRule","d","_path2","b2bModeTrigger","isB2BUser","includes","switchToB2B","coopUserSettings","isAuthenticated","create","window","location","href","coopSettings","ecommerce","page","url","switchToB2C","eraseCookie","isB2CUser","toggle","createDirectApiClient","baseURL","appConfig","serviceAccess","dkeUrl","headers","dkeKey","getDkeOffers","storeId","axiosClient","get","params","clustered","data","getTvOffers","PrevButton","ref","type","className","hasScrollbar","class","Icon","icon","NextButton","nextEl","setNextEl","useState","prevEl","setPrevEl","paginationEl","setPaginationEl","focusTimer","useRef","containerRef","announce","dispatch","useCallback","value","c","setA11yAnnounceText","useA11yAnnouncerDispatch","swiperOptions","useMemo","threshold","navigation","disabledClass","pagination","clickable","el","lockClass","dynamicBullets","dynamicMainBullets","customSwiperOptions","scrollbar","undefined","isScrollbarOptions","draggable","watchSlidesProgress","containerModifierClass","modifySwiperOptions","isMobile","swiperMainClassName","swiperButtonClassName","modules","onSwiper","wrapperTag","onSlideChange","swiper","current","clearTimeout","snapIndex","setTimeout","focusElement","querySelector","focus","map","children","child","index","tag","swiperPaginationClass","ConditionalWrapper","condition","renderWrapper","ConditionalMultipleWrappers","choices","choice","Fragment","transformDimensions","dimensions","retinaHeight","retinaWidth","desktop","retina","getTransformDimensions","zoomable","zoomDimensions","isZoomed","setIsZoomed","currentDimensions","onMouseEnter","onMouseLeave","onTouchStart","zoomed","CloudinaryImage","cssClass","name","alt","transform","retinaTransform","srcSet","sort","a","b","minWidth","item","media","loading","lazy","imgClassName","src","altText","missingProductImageUrl","Wrapper","containerCss","FakeStyle","onClick","handleTeaserClick","notificationSlot","Media","filteredBadges","useBadges","attributeLabels","slice","isALink","handleLinkClick","ch","imageUrl","fallbackUrl","slotTopBadge","badge","ProductBadge","toString","promotionSplashSlot","Brand","brand","fromSweden","Heading","PackageSizeInfo","packageSizeInformation","Chip","size","theme","capitalize","disableRoundCorners","disableMinimumHeight","isFromMedium","BaseImageTextBlock","proritizeRightContent","ImageTextPropertyBlock","right","left","Content","bannerPositionClassNames","centerBlockHorizontally","centerBlockVertically","contentLessPadding","contentLessHorizontalPadding","hasContent","body","belowTextSlot","headingProps","renderHeading","RawPicture","imageAltText","imageHeight","fontFamilySecondary","alignment","textColor","RawHtml","html","BottomSlot","bothButtonsExist","buttonProps","secondaryButtonProps","wrapperClassNames","renderButton","style","margin","renderSecondaryButton","trackingRef","click","trackClick","usePromotionTracking","gaPromoCreative","gaPromoId","gaPromoName","gaPromoPosition","node","anchorRel","target","isClickable","backgroundColor","linkUrl","rel","ariaLabel","labels","attribute","image","favoriteStore","storeName","event","feature_name","store_id","store_name","toLowerCase","event_key","storeFlyerDownload","file_name","file_extension","becomeAMember","clickText","click_text","page_type","favorite","add","remove","currentWeek","nextWeek","shopLocator","storeResults","shop_results","storeMapInteraction","interactionType","mapPinLocation","map_pin_location","findStore","pageLocation","page_location","storeTab","account","membership","storeLoginInteraction","status","method","inView","triggerOnce","useEffect","viewPromotion","selectPromotion","RouterContext","createContext","useRouterContext","useContext","RouterContextProvider","contextValue","Provider","isPath","arg","navigate","routerContext","isReactRouted","pushPath","path","isRedirect","startsWith","prepareLocation","newLocationState","state","pushLocation","newLocation","push","replace","goBack","getCssClassForDisplayOptionWithDefaultTag","potentialCssClass","epi","blockDisplayOptionToCssClass","baseChildrenCssClass","filterContentArea","contentArea","predicate","x","contentLink","expanded","filter","Boolean","filterContentType","contents","contentType","isEpiEditMode","URLSearchParams","search","mapEpiPageHeadData","canonicalUrl","pageTitle","link","canonical","meta","description","metaDescription","isEpiPageViewSettings","version","storeApiUrl","baseHeader","Accept","storeApiSubscriptionKey","token","getAuthToken","Authorization","getStoresByStoreIds","storeIds","join","stores","getAll","getStoresInformation","getLastVisitedStore","lastVisited","userFavorites","clearCoopSeUserFavoriteStoresCache","axios","put","favoriteStores","ledgerId","post","delete","filterXtraStores","query","queryKey","s","queryFn","staleTime","Infinity","enabled","queryClient","addFavoriteStoreMutation","mutationFn","onSuccess","invalidateQueries","deleteFavoriteStoreMutation","allStores","ledgerAccountNumber","store","conceptId","getFavoriteStoresStatus","favoriteStoreError","error","favoriteStoresLoading","isLoading","addFavoriteStore","mutate","deleteFavoriteStore","favoriteStoreClearError","reset","getStreetAndGoogleAddress","address","headLine","streetAddress","address1","address2","googleAddress","addressStr","split","reverse","filterServices","array","str","service","ensureStoreLedgerIdFormat","padStart","configuringSvgIcons","roleDescriptions","otherLogos","ageRestriction","environmentalCode","ethicCode","nutritionCode","arr","forEach","role","logo","extractingImages","offers","obj","content","isStoreOffersCategoryBlockType","isStoreOffersCategoryContainerBlockType","getNumberOfRows","listIndex","listHeading","storeOffers","minimalOffersCount","pageSettings","drCategoryContainers","find","droffers","categoryBlocks","numberOfRowsDesktop","maxRowsBeforLoadModeDesktop","numberOfRowsTablet","maxRowsBeforLoadModeTablet","numberOfRowsPhone","getCurrentStoreMetaDescription","template","storeServices","storeServicesPriority","filteredPrioritizedServices","storeService","storeServiceOverridenName","storeServicesString","reduce","acc","curr","elementWithPrefix","becomeAMemberHandler","buttonText","currentTarget","innerText","loginHandler","loginUrl","becomMemberUrl","myProfilePage","becomeAMemberPageUrl","isLoggedIn","isMember","isMedmeraCustomer","LogginedIn","NotLoggedIn","isMediumDevice","isValidScreen","Button","fullWidth","asChild","rightprops","getRightImageTextProps","DoubleImageTextBlock","disabled","color","element","stylingElement","bProps","hProps","offer","onGroupClick","isExpanded","groupedFirstItem","showAddToShoppingList","shopExpress","clusterInteriorOffers","ordinaryPriceText","categoryGroup","priceInformation","ordinaryPrice","unit","formattedComparativePriceText","extractedImages","svgIcons","svgIconsCluster","showIcons","iconsArray","ordinaryPriceTextFormatted","descriptionFormatted","packageSizeInformationFormatted","amountInformation","manufacturerFormatted","isFromXSmall","splashShowAllTextOnly","unifiedSplash","ProductTeaser","Splash","allText","prefix","price","suffix","decimal","isMemberPrice","marginBottom","cssIcons","isBusinessEcommerce","promotionUnit","household","dealOfferOrLimitationText","dealOfferLimitText","limitations","dealOfferRulesText","trim","recyclingInformationText","additionalRules","AddOfferToShoppingListButton","A","offerId","offerType","rightSlot","rotateClockwise","getLastVisitedStoreLocalStorage","localStorage","getItem","JSON","parse","updateLastVisitedStoreLocalStorage","newStoreId","lastVisitedStoreId","setLocalStorage","favoriteStoreCookie","storesString","read","getFavoriteStoreIdsFromCookie","setItem","stringify","getWithAddedZerosIfNeccessaryForLedgerAccountNumber","zerosToAdd","repeat"],"sourceRoot":""}