{"version":3,"file":"coopse.script.7768.560bc2b7.chunk.js","mappings":"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","sources":["webpack:///./src/microApps/common/components/BuyableFoodboxTeaser/BuyableFoodboxTeaser.tsx","webpack:///./src/microApps/common/components/BuyableRecipeTeaser/BuyableRecipeTeaser.tsx","webpack:///./src/microApps/common/components/molecules/Breadcrumbs/Breadcrumbs.tsx","webpack:///./src/microApps/common/components/molecules/Breadcrumbs/Breadcrumbs.module.less","webpack:///./src/microApps/common/components/molecules/EmphasizedButton/EmphasizedButton.tsx","webpack:///./src/microApps/common/components/molecules/EmphasizedButton/EmphasizedButton.module.less","webpack:///./src/microApps/common/components/molecules/BuyableRecipeButton/BuyableRecipeButton.tsx","webpack:///./src/microApps/common/components/molecules/BuyableRecipeButton/BuyableRecipeButton.hooks.ts","webpack:///./src/microApps/common/components/molecules/RecipeModalTrigger/RecipeButtonWithModal.tsx","webpack:///./src/microApps/common/components/molecules/RecipeModalTrigger/RecipeModalTrigger.hooks.ts","webpack:///./src/microApps/common/components/molecules/RecipeModalTrigger/RecipeModalTrigger.tsx","webpack:///./src/microApps/ecommerce/components/JsonLd/ProductJsonSchema.utils.ts","webpack:///./src/microApps/ecommerce/components/pages/notfoundPage/NotFoundPage.tsx","webpack:///./src/microApps/ecommerce/components/pages/productSectionPage/SectionBreadcrumbs.tsx","webpack:///./src/microApps/ecommerce/ecommerceQueryKeys.ts","webpack:///./src/microApps/ecommerce/hooks/useEcommerceSettings.ts"],"sourcesContent":["import { Chip } from '@coop/components';\nimport * as React from 'react';\n\nimport { useSingleFavorite } from '../../hooks/useFavouriteRecipes';\nimport { ga4RecipesTracking } from '../../tracking/ga4/recipes';\nimport BaseRecipeTeaser from '../BaseRecipeTeaser';\nimport FavoriteRecipeToggle from '../molecules/FavoriteRecipeToggle';\nimport { RecipeButtonWithModal, useRecipeModal } from '../molecules/RecipeModalTrigger';\n\ninterface BuyableFoodboxTeaserProps {\n id: string;\n url: string;\n name: string;\n imageUrl: string;\n defaultPortions: number;\n onBuyClick?: (e: React.SyntheticEvent) => void;\n onLinkClick?: (e: React.SyntheticEvent) => void;\n analyticsListName: string;\n withBorder?: boolean;\n}\n\nconst BuyableFoodboxTeaser = React.forwardRef<HTMLDivElement, BuyableFoodboxTeaserProps>(\n (props, ref) => {\n const { tryOpen, isOpen, close } = useRecipeModal(props.id, props.name);\n\n const { isFavourite, onFavouriteRecipeToggleClick, isLoading } = useSingleFavorite(\n props.id,\n props.name,\n );\n\n const handleLinkClick = (e: React.SyntheticEvent) => {\n ga4RecipesTracking.click.buyableFoodbox(props.id, props.name);\n props.onLinkClick?.(e);\n };\n\n const handleBuyClick = (e: React.SyntheticEvent) => {\n tryOpen();\n ga4RecipesTracking.click.buyableFoodbox(props.id, props.name);\n props.onBuyClick?.(e);\n };\n\n return (\n <BaseRecipeTeaser.Wrapper\n ref={ref}\n name={props.name}\n imageUrl={props.imageUrl}\n withBorder={props.withBorder}\n topSlot={\n <FavoriteRecipeToggle\n isFavorite={isFavourite}\n onClick={onFavouriteRecipeToggleClick}\n disabled={isLoading}\n />\n }\n >\n <BaseRecipeTeaser.Badges>\n <Chip theme=\"whiteBlack\" size={32}>\n Färdigt paket\n </Chip>\n </BaseRecipeTeaser.Badges>\n <BaseRecipeTeaser.Content>\n <BaseRecipeTeaser.Info>\n <BaseRecipeTeaser.Heading\n url={props.url}\n flexOrder={1}\n onLinkClick={handleLinkClick}\n >\n {props.name}\n </BaseRecipeTeaser.Heading>\n </BaseRecipeTeaser.Info>\n <BaseRecipeTeaser.Actions>\n <RecipeButtonWithModal\n recipeId={props.id}\n recipeName={props.name}\n defaultPortions={props.defaultPortions}\n buyText=\"Se & köp\"\n onBuyClick={handleBuyClick}\n onRemoveClick={(e) => e.stopPropagation()}\n buttonType=\"new\"\n buttonFullWidth\n analyticsListName={props.analyticsListName}\n isOpen={isOpen}\n close={close}\n />\n </BaseRecipeTeaser.Actions>\n </BaseRecipeTeaser.Content>\n </BaseRecipeTeaser.Wrapper>\n );\n },\n);\n\nexport default BuyableFoodboxTeaser;\n","import { Chip } from '@coop/components';\nimport * as React from 'react';\n\nimport { useSingleFavorite } from '../../hooks/useFavouriteRecipes';\nimport { ga4RecipesTracking } from '../../tracking/ga4/recipes';\nimport BaseRecipeTeaser from '../BaseRecipeTeaser';\nimport FavoriteRecipeToggle from '../molecules/FavoriteRecipeToggle';\nimport { RatingStars } from '../molecules/RatingStars';\nimport { RecipeButtonWithModal, useRecipeModal } from '../molecules/RecipeModalTrigger';\n\ninterface BuyableRecipeTeaserProps {\n id: string;\n url: string;\n name: string;\n rating: number;\n votes: number;\n imageUrl: string;\n co2ImpactKg: number | null;\n defaultPortions: number;\n onBuyClick?: (e: React.SyntheticEvent) => void;\n onLinkClick?: (e: React.SyntheticEvent) => void;\n analyticsListName: string;\n withBorder?: boolean;\n}\n\nconst BuyableRecipeTeaser = React.forwardRef<HTMLDivElement, BuyableRecipeTeaserProps>(\n (props, ref) => {\n const { tryOpen, isOpen, close } = useRecipeModal(props.id, props.name);\n\n const { isFavourite, onFavouriteRecipeToggleClick, isLoading } = useSingleFavorite(\n props.id,\n props.name,\n );\n\n const handleLinkClick = (e: React.SyntheticEvent) => {\n ga4RecipesTracking.click.buyableRecipe(props.id, props.name);\n props.onLinkClick?.(e);\n };\n\n const handleBuyClick = (e: React.SyntheticEvent) => {\n tryOpen();\n ga4RecipesTracking.click.buyableRecipe(props.id, props.name);\n props.onBuyClick?.(e);\n };\n\n return (\n <BaseRecipeTeaser.Wrapper\n ref={ref}\n name={props.name}\n imageUrl={props.imageUrl}\n withBorder={props.withBorder}\n topSlot={\n <FavoriteRecipeToggle\n isFavorite={isFavourite}\n onClick={onFavouriteRecipeToggleClick}\n disabled={isLoading}\n />\n }\n >\n <BaseRecipeTeaser.Badges>\n <Chip theme=\"whiteBlack\" size={32}>\n Recept\n </Chip>\n </BaseRecipeTeaser.Badges>\n <BaseRecipeTeaser.Content>\n <BaseRecipeTeaser.Info>\n <BaseRecipeTeaser.Heading\n url={props.url}\n flexOrder={1}\n onLinkClick={handleLinkClick}\n >\n {props.name}\n </BaseRecipeTeaser.Heading>\n <BaseRecipeTeaser.RatingContainer>\n <RatingStars rating={props.rating} votes={props.votes} />\n <BaseRecipeTeaser.ClimateImpact co2ImpactKg={props.co2ImpactKg} />\n </BaseRecipeTeaser.RatingContainer>\n </BaseRecipeTeaser.Info>\n <BaseRecipeTeaser.Actions>\n <RecipeButtonWithModal\n recipeId={props.id}\n recipeName={props.name}\n defaultPortions={props.defaultPortions}\n buyText=\"Se & köp\"\n onBuyClick={handleBuyClick}\n onRemoveClick={(e) => e.stopPropagation()}\n buttonType=\"new\"\n buttonFullWidth\n analyticsListName={props.analyticsListName}\n isOpen={isOpen}\n close={close}\n />\n </BaseRecipeTeaser.Actions>\n </BaseRecipeTeaser.Content>\n </BaseRecipeTeaser.Wrapper>\n );\n },\n);\n\nexport default BuyableRecipeTeaser;\n","import { Icon } from '@coop/components';\nimport { ChevronRightIcon } from '@coop/icons';\nimport classnames from 'classnames';\nimport type { FC } from 'react';\nimport { JsonLd } from 'react-schemaorg';\nimport type { BreadcrumbList } from 'schema-dts';\n\nimport useReactRouting from '../../../../ecommerce/hooks/useReactRouting';\nimport { sendInteractionEvent } from '../../../tracking/utils';\nimport { ConditionalMultipleWrappers } from '../../atoms/ConditionalWrapper';\nimport styles from './Breadcrumbs.module.less';\nimport type {\n BreadcrumbItem,\n BreadcrumbsJsonLdSchemaProps,\n BreadcrumbsProps,\n} from './Breadcrumbs.types';\n\nconst getUrl = (url: string) => {\n return url ? new URL(url, window.location.origin).toString() : undefined;\n};\n\nconst BreadcrumbsJsonLdSchema: FC<React.PropsWithChildren<BreadcrumbsJsonLdSchemaProps>> = ({\n items,\n}) => {\n return (\n <JsonLd<BreadcrumbList>\n item={{\n '@type': 'BreadcrumbList',\n itemListElement: items\n .filter((item) => !!item.url)\n .map((item, index) => ({\n '@type': 'ListItem',\n name: item.name,\n item: getUrl(item.url),\n position: index + 1,\n })),\n '@context': 'https://schema.org',\n }}\n />\n );\n};\n\nconst Breadcrumbs: FC<React.PropsWithChildren<BreadcrumbsProps>> = ({\n items,\n wrapperClasses,\n small,\n}) => {\n const { push } = useReactRouting();\n\n const handleLinkClick = (\n e: React.MouseEvent<HTMLAnchorElement, MouseEvent>,\n item: BreadcrumbItem,\n ) => {\n e.stopPropagation();\n e.preventDefault();\n sendInteractionEvent({\n eventCategory: 'Navigation',\n eventAction: 'Breadcrumbs',\n eventLabel: e.currentTarget.innerText,\n });\n\n if (item.isLayoutRouterAsyncLink) {\n push(e.currentTarget.href, true);\n } else {\n push(e.currentTarget.pathname);\n }\n };\n\n const isBreadcumbActive = (index: number) => {\n return index === items.length - 1;\n };\n\n return (\n <>\n <BreadcrumbsJsonLdSchema items={items} />\n <nav aria-label=\"Du är här\">\n <ol\n className={classnames(\n styles.Breadcrumbs,\n small && styles['Breadcrumbs--small'],\n wrapperClasses,\n )}\n >\n {items?.map((item, index) => {\n return (\n <li\n key={item.name}\n className={classnames(\n styles.Item,\n isBreadcumbActive(index) && styles.IsActive,\n )}\n >\n {index >= 1 && (\n <Icon\n className={styles.Arrow}\n icon={ChevronRightIcon}\n style={{ marginRight: 4 }}\n aria-hidden\n />\n )}\n <ConditionalMultipleWrappers\n choices={[\n {\n condition: isBreadcumbActive(index),\n renderWrapper: (children) => (\n <div className=\"u-flex u-flexAlignCenter\">\n {children}\n </div>\n ),\n },\n {\n condition: !isBreadcumbActive(index),\n renderWrapper: (children) => (\n <a\n href={item.url}\n onClick={(e) => handleLinkClick(e, item)}\n className=\"u-flex u-flexAlignCenter\"\n >\n {children}\n </a>\n ),\n },\n ]}\n >\n {isBreadcumbActive(index) && !small ? (\n <h1>{item.name}</h1>\n ) : (\n <span>{item.name}</span>\n )}\n </ConditionalMultipleWrappers>\n </li>\n );\n })}\n </ol>\n </nav>\n </>\n );\n};\n\nexport default Breadcrumbs;\n","// extracted by mini-css-extract-plugin\nexport default {\"Breadcrumbs\":\"qGOTTJuA\",\"Breadcrumbs--small\":\"CaVhiulH\",\"Item\":\"_SebCbUH\",\"Arrow\":\"oRewZS72\",\"IsActive\":\"acIGpM5O\"};","import { Button } from '@coop/components';\nimport type { ButtonProps } from '@coop/components/src/Button/Button.types';\n\nimport styles from './EmphasizedButton.module.less';\n\nconst EmphasizedButton = (props: ButtonProps) => {\n return (\n <Button\n // eslint-disable-next-line react/jsx-props-no-spreading\n {...props}\n size={48}\n className={styles.EmphasizedButton}\n >\n {props.children}\n </Button>\n );\n};\n\nexport default EmphasizedButton;\n","// extracted by mini-css-extract-plugin\nexport default {\"EmphasizedButton\":\"r2Q8CPVL\"};","import { Button, Icon } from '@coop/components';\nimport { Bag1Icon } from '@coop/icons';\nimport type { FC } from 'react';\n\nimport cartRecipeSelectors from '../../../../cart/selectors/cartRecipeSelectors';\nimport { useAsyncDispatcher } from '../../../hooks/useAsyncDispatcher';\nimport { useAppDispatch, useAppSelector } from '../../../hooks/useThunkDispatch';\nimport { cartThunks } from '../../../thunks/cartThunks';\nimport EmphasizedButton from '../EmphasizedButton/EmphasizedButton';\nimport { useRecipeTracking } from './BuyableRecipeButton.hooks';\nimport type { RecipeButtonType } from './BuyableRecipeButton.types';\n\ninterface BuyableRecipeButtonProps {\n recipeId: string;\n recipeName: string;\n onBuyClick?: (e: React.SyntheticEvent) => void;\n onRemoveClick?: (e: React.SyntheticEvent) => void;\n buyText?: string;\n removeText?: string;\n buttonType: RecipeButtonType;\n buttonFullWidth: boolean;\n}\n\nconst BuyableRecipeButton: FC<React.PropsWithChildren<BuyableRecipeButtonProps>> = ({\n recipeId,\n recipeName,\n onBuyClick,\n onRemoveClick,\n buyText,\n removeText,\n buttonType,\n buttonFullWidth,\n}) => {\n const cartRecipe = useAppSelector((state) =>\n cartRecipeSelectors.nonEmpty.selectById(state, recipeId),\n );\n\n const dispatch = useAppDispatch();\n\n const removeRecipeDispatcher = useAsyncDispatcher(() =>\n dispatch(cartThunks.removeRecipe(recipeId)),\n );\n useRecipeTracking(removeRecipeDispatcher, cartRecipe);\n\n const handleRecipeRemove = (e: React.SyntheticEvent) => {\n removeRecipeDispatcher.execute();\n onRemoveClick?.(e);\n };\n\n const onRecipeBuyClick = (e: React.SyntheticEvent) => {\n onBuyClick?.(e);\n };\n\n const hasRecipeInCart = !!cartRecipe;\n\n const { isLoading } = removeRecipeDispatcher;\n\n const buttonRemoveText = removeText || 'Ta bort varor';\n const buttonBuyText = buyText || 'Se & köp';\n\n if (buttonType === 'emphasized') {\n return hasRecipeInCart ? (\n <EmphasizedButton\n onClick={handleRecipeRemove}\n theme=\"primary\"\n isLoading={isLoading}\n rightSlot={<Icon icon={Bag1Icon} width={20} height={20} />}\n fullWidth={buttonFullWidth}\n aria-label={`${buttonRemoveText} - ${recipeName}`}\n >\n {buttonRemoveText}\n </EmphasizedButton>\n ) : (\n <EmphasizedButton\n onClick={onRecipeBuyClick}\n theme=\"primary\"\n rightSlot={<Icon icon={Bag1Icon} width={20} height={20} />}\n fullWidth={buttonFullWidth}\n aria-label={`Anpassa varor & köp - ${recipeName}`}\n >\n Anpassa varor & köp\n </EmphasizedButton>\n );\n }\n\n if (buttonType === 'new') {\n return hasRecipeInCart ? (\n <Button\n theme=\"primary\"\n size={40}\n isLoading={isLoading}\n rightSlot={<Icon icon={Bag1Icon} width={20} height={20} />}\n onClick={handleRecipeRemove}\n fullWidth={buttonFullWidth}\n aria-label={`${buttonRemoveText} - ${recipeName}`}\n >\n {buttonRemoveText}\n </Button>\n ) : (\n <Button\n theme=\"primary\"\n size={40}\n isLoading={isLoading}\n rightSlot={<Icon icon={Bag1Icon} width={20} height={20} />}\n onClick={onRecipeBuyClick}\n fullWidth={buttonFullWidth}\n aria-label={`${buttonBuyText} - ${recipeName}`}\n >\n {buttonBuyText}\n </Button>\n );\n }\n\n return null;\n};\n\nexport default BuyableRecipeButton;\n","import { useEffect, useRef } from 'react';\n\nimport cartItemsSelectors from '../../../../cart/selectors/cartItemsSelectors';\nimport type { AsyncDispatcher } from '../../../hooks/useAsyncDispatcher';\nimport { useAppSelector } from '../../../hooks/useThunkDispatch';\nimport { storeSelectors } from '../../../selectors/storeSelectors';\nimport type { CartRecipe } from '../../../store/structureDefinitions/cartState';\nimport { ga4CartTracking } from '../../../tracking/ga4/cart';\n\nexport const useRecipeTracking = (\n removeRecipeDispatcher: AsyncDispatcher<void, []>,\n cartRecipe: CartRecipe | undefined,\n) => {\n const currentCartItems = useAppSelector(cartItemsSelectors.selectAllCartItems);\n const previousCartItems = useRef(currentCartItems);\n const currentProductionUnit = useAppSelector(storeSelectors.currentProductionUnit);\n\n useEffect(() => {\n if (cartRecipe) {\n previousCartItems.current = currentCartItems;\n }\n }, [currentCartItems, cartRecipe]);\n\n const { status, reset } = removeRecipeDispatcher;\n useEffect(() => {\n if (status === 'success') {\n ga4CartTracking.changeCartItems(\n previousCartItems.current.map((item) => ({\n productId: item.cartItemData.productId,\n variantId: item.cartItemData.variantId,\n quantity: item.cartItemData.quantity,\n })),\n currentCartItems.map((item) => ({\n productId: item.cartItemData.productId,\n variantId: item.cartItemData.variantId,\n quantity: item.cartItemData.quantity,\n })),\n currentProductionUnit,\n {\n list: 'BuyRecipeButton',\n position: 0,\n },\n );\n\n reset();\n }\n }, [status, currentCartItems, currentProductionUnit, reset]);\n};\n","import type { FC } from 'react';\n\nimport { RecipeModalTab } from '../../../../recipe/models';\nimport { Modal } from '../../atoms/Modal';\nimport type { RecipeButtonType } from '../BuyableRecipeButton';\nimport RecipeButton from '../BuyableRecipeButton';\nimport BuyableRecipeModalBody from './BuyableRecipeModalBody';\n\ninterface RecipeModalButtonProps {\n recipeId: string;\n recipeName: string;\n defaultPortions: number;\n onBuyClick?: (e: React.SyntheticEvent) => void;\n onRemoveClick?: (e: React.SyntheticEvent) => void;\n buyText?: string;\n removeText?: string;\n buttonType: RecipeButtonType;\n buttonFullWidth: boolean;\n analyticsListName: string;\n isOpen: boolean;\n close: () => void;\n}\n\nconst RecipeButtonWithModal: FC<React.PropsWithChildren<RecipeModalButtonProps>> = ({\n recipeId,\n recipeName,\n defaultPortions: portions,\n onBuyClick,\n onRemoveClick,\n buyText,\n removeText,\n buttonType,\n analyticsListName,\n isOpen,\n close,\n buttonFullWidth,\n}) => {\n return (\n <>\n <RecipeButton\n recipeId={recipeId}\n recipeName={recipeName}\n onRemoveClick={onRemoveClick}\n onBuyClick={onBuyClick}\n buyText={buyText}\n removeText={removeText}\n buttonType={buttonType}\n buttonFullWidth={buttonFullWidth}\n />\n <div onClick={(e) => e.stopPropagation()}>\n <Modal isOpen={isOpen} close={close} additionalClasses=\"RecipeModal u-posRelative\">\n <BuyableRecipeModalBody\n recipeId={recipeId}\n portions={portions}\n tabToDisplay={RecipeModalTab.Products}\n close={close}\n analyticsListName={analyticsListName}\n />\n </Modal>\n </div>\n </>\n );\n};\n\nexport default RecipeButtonWithModal;\n","import { useMemo } from 'react';\nimport { v4 } from 'uuid';\n\nimport { useCncFlyInState } from '../../../hooks/useCncFlyInState';\nimport useModal from '../../../hooks/useModal';\nimport { useAppSelector } from '../../../hooks/useThunkDispatch';\nimport { storeSelectors } from '../../../selectors/storeSelectors';\nimport { RecipeModalType } from '../../../store/structureDefinitions/modalState';\nimport tracking from '../../../tracking/tracking';\n\nexport const useRecipeModal = (recipeId: string, recipeName: string) => {\n const guid = useMemo(() => v4(), []);\n const modalActions = useModal(RecipeModalType.RecipeModal, undefined, `${recipeId}_${guid}`);\n\n const hasActiveStoreSelection = useAppSelector(storeSelectors.hasActiveStoreSelection);\n\n const { initCnc } = useCncFlyInState();\n\n const tryOpen = () => {\n tracking.ecommerce.recipes.interaction(\n 'Receptsida - Öppna receptmodal',\n recipeName,\n recipeName,\n );\n\n if (!hasActiveStoreSelection) {\n initCnc();\n } else {\n modalActions.open();\n }\n };\n\n return { ...modalActions, tryOpen };\n};\n","import type { FC } from 'react';\n\nimport type { RecipeButtonType } from '../BuyableRecipeButton';\nimport RecipeButtonWithModal from './RecipeButtonWithModal';\nimport { useRecipeModal } from './RecipeModalTrigger.hooks';\n\ninterface RecipeModalTriggerProps {\n recipeId: string;\n recipeName: string;\n portions: number;\n onBuyClick?: (e: React.SyntheticEvent) => void;\n onRemoveClick?: (e: React.SyntheticEvent) => void;\n buyText?: string;\n removeText?: string;\n buttonType: RecipeButtonType;\n buttonFullWidth: boolean;\n analyticsListName: string;\n}\n\nconst RecipeModalTrigger: FC<React.PropsWithChildren<RecipeModalTriggerProps>> = ({\n recipeId,\n recipeName,\n portions,\n onBuyClick,\n onRemoveClick,\n buyText,\n removeText,\n buttonType,\n analyticsListName,\n buttonFullWidth,\n}) => {\n const { close, isOpen, tryOpen } = useRecipeModal(recipeId, recipeName);\n\n const onRecipeBuyClick = (e: React.SyntheticEvent) => {\n tryOpen();\n\n onBuyClick?.(e);\n };\n\n return (\n <RecipeButtonWithModal\n recipeId={recipeId}\n recipeName={recipeName}\n defaultPortions={portions}\n analyticsListName={analyticsListName}\n isOpen={isOpen}\n close={close}\n onBuyClick={onRecipeBuyClick}\n onRemoveClick={onRemoveClick}\n buyText={buyText}\n removeText={removeText}\n buttonType={buttonType}\n buttonFullWidth={buttonFullWidth}\n />\n );\n};\n\nexport default RecipeModalTrigger;\n","import type { ItemList, Offer, Product, WithContext } from 'schema-dts';\n\nimport { appConfig } from '../../../../appConfig';\nimport { Helpers } from '../../../../utility/helpers';\nimport type { PriceType } from '../../../common/models/priceData/priceData';\nimport { getCloudinaryUrl } from '../../../common/utils/cloudinaryImageUtils';\nimport { buildAbsoluteUrl } from '../../utils/urlEcommerceUtils';\n\n/**\n *\n * @param product the product to be used for the offer.\n * @param priceType price type to be used for the offer.\n * @param area Specifices if the product is being used in a list or product detail page.\n * @param hostname the hostname for the site\n * @returns json+ld object for the offer.\n */\nexport const generateOfferJsonLd = (\n product: ApiProduct,\n priceType: PriceType,\n hostname: string,\n) => {\n const offer: Offer = {\n '@type': 'Offer',\n price: `${product.priceData && Helpers.getPrice(product.priceData, priceType)}`,\n priceCurrency: 'SEK',\n availability: 'https://schema.org/InStock',\n itemCondition: 'https://schema.org/NewCondition',\n url: buildAbsoluteUrl(product.url),\n };\n\n offer.deliveryLeadTime = {\n '@type': 'QuantitativeValue',\n value: 0,\n unitCode: 'DAY',\n description: 'Vissa butiker erbjuder expressleveranser',\n };\n offer.shippingDetails = {\n '@type': 'OfferShippingDetails',\n shippingRate: {\n '@type': 'MonetaryAmount',\n maxValue: 79,\n minValue: 0,\n currency: 'SEK',\n },\n shippingDestination: {\n '@type': 'DefinedRegion',\n addressCountry: 'SE',\n },\n deliveryTime: {\n '@type': 'ShippingDeliveryTime',\n handlingTime: {\n '@type': 'QuantitativeValue',\n minValue: 0,\n maxValue: 1,\n unitCode: 'DAY',\n },\n transitTime: {\n '@type': 'QuantitativeValue',\n minValue: 0,\n maxValue: 1,\n unitCode: 'DAY',\n },\n },\n };\n\n offer.hasMerchantReturnPolicy = {\n '@type': 'MerchantReturnPolicy',\n returnFees: 'https://schema.org/FreeReturn',\n returnPolicyCategory: 'https://schema.org/MerchantReturnFiniteReturnWindow',\n applicableCountry: 'SE',\n merchantReturnLink: `https://${hostname}${appConfig.coopSettings.myCoop.lastOrdersUrl}`,\n itemCondition: 'NewCondition',\n merchantReturnDays: 30,\n customerRemorseReturnShippingFeesAmount: {\n '@type': 'MonetaryAmount',\n name: ' 14 dagar från leverans ångra köp av varor.',\n value: '0',\n currency: 'SEK',\n },\n refundType: 'https://schema.org/FullRefund',\n itemDefectReturnFees: 'https://schema.org/FreeReturn',\n customerRemorseReturnFees: 'https://schema.org/ReturnFeesCustomerResponsibility',\n };\n\n return offer;\n};\n\n/**\n *\n * @param product the product to be used for the product.\n * @param priceType price type to be used for the product.\n * @param area Specifices if the product is being used in a list or product detail page.\n * @param hostname the hostname for the site\n * @returns json+ld object for the product.\n */\nexport const generateProductJsonLd = (\n product: ApiProduct,\n priceType: PriceType,\n hostname: string,\n) => {\n const jsonLd: WithContext<Product> = {\n '@type': 'Product',\n name: product.name,\n brand: product.manufacturer,\n countryOfOrigin: product.details?.countryOfOriginCodes?.join(','),\n image: product.image?.url\n ? [\n getCloudinaryUrl(\n product.image.url,\n 'e_sharpen,f_auto,fl_clip,fl_progressive,q_90,c_lpad,g_center,h_660,w_660',\n ),\n getCloudinaryUrl(\n product.image.url,\n 'e_sharpen,f_auto,fl_clip,fl_progressive,q_90,c_lpad,g_center,h_371,w_660',\n ),\n getCloudinaryUrl(\n product.image.url,\n 'e_sharpen,f_auto,fl_clip,fl_progressive,q_90,c_lpad,g_center,h_440,w_660',\n ),\n ].filter(Boolean)\n : [],\n offers: generateOfferJsonLd(product, priceType, hostname),\n sku: product.identifier,\n '@context': 'https://schema.org',\n };\n const isNicotineProduct = product.details.isAgeLimited;\n const isPharmaceutical = product.details?.pharmaceuticalData?.isPharmaceutical;\n jsonLd.description = product.details?.description;\n // If i understand GTIN correctly, 2 series is \"Used to issue Restricted Circulation Numbers within a geographic region.\" and 5 series \"is reserved for future use\".\n if (product.ean.length === 13 && !product.ean.startsWith('2') && !product.ean.startsWith('5')) {\n jsonLd.gtin13 = product.ean;\n }\n\n if (isNicotineProduct || isPharmaceutical) {\n jsonLd.audience = {\n '@type': 'PeopleAudience',\n requiredMinAge: 18,\n };\n }\n\n return jsonLd;\n};\n\nexport const generateItemListJsonLd = (\n urls: string[],\n optional?: {\n numberOfItems?: number;\n name?: string;\n },\n): WithContext<ItemList> => {\n const list: WithContext<ItemList> = {\n '@type': 'ItemList',\n '@context': 'https://schema.org',\n itemListElement: urls.map((url, index) => ({\n '@type': 'ListItem',\n position: index + 1,\n url,\n })),\n };\n if (optional) {\n if (optional.numberOfItems) {\n list.numberOfItems = optional.numberOfItems;\n }\n if (optional.name) {\n list.name = optional.name;\n }\n }\n return list;\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport ListBlock from '../../../../common/components/ListBlock';\nimport BuyableProductTeaser, {\n BuyableProductTeaserSkeleton,\n} from '../../../../common/components/molecules/BuyableProductTeaser';\nimport PageProperties from '../../../../common/components/molecules/PageProperties';\nimport { useAppSelector } from '../../../../common/hooks/useThunkDispatch';\nimport { storeSelectors } from '../../../../common/selectors/storeSelectors';\nimport searchFlow from '../../../../search/flow/searchFlow';\nimport { useProductSectionsContext } from '../../../contexts/productSectionsContext';\nimport { useCurrentSectionParams } from '../../../hooks/useCurrentSectionParams';\nimport { useVerticalProductTeaserContainer } from '../../../hooks/useProductTeaserContainer';\nimport SectionBreadcrumbs from '../productSectionPage/SectionBreadcrumbs';\n\nconst NotFoundPage = (props: { type: 'product' | 'section' }) => {\n const currentProductionUnit = useAppSelector(storeSelectors.currentProductionUnit);\n\n const { sectionTree } = useProductSectionsContext();\n const { currentSectionId, currentSectionPath, currentSection, sectionTrail } =\n useCurrentSectionParams(sectionTree);\n const searchFunction = () => {\n if (currentSectionId || sectionTrail.length) {\n return searchFlow.searchProductsInSection(\n {\n name: 'categoryIds',\n value: (currentSectionId || sectionTrail.slice(-1)[0].id).toString(),\n },\n 24,\n 0,\n [],\n null,\n [],\n currentProductionUnit,\n true,\n currentSection\n ? {\n name: 'Subcategory',\n value: currentSection.name,\n details: currentSectionPath,\n }\n : undefined,\n );\n }\n return searchFlow.searchProductOffersLoop({\n page: 0,\n resultsPerPage: 24,\n storeId: currentProductionUnit,\n sortBy: [],\n facets: [],\n });\n };\n\n const { data: relatedProducts } = useQuery({\n queryKey: ['ProductNotFound:Replacements'],\n enabled: true,\n queryFn: searchFunction,\n maxPages: 0,\n retry: false,\n });\n const { gridAdditionalClasses, cellsInRow } = useVerticalProductTeaserContainer('list');\n\n return (\n <div>\n <PageProperties\n headData={{\n title: 'Produkten hittades ej',\n link: {},\n meta: {\n robots: 'noindex, nofollow',\n 'prerender-status-code': '404',\n },\n }}\n pageTypeNameForAnalytics=\"produktsida\"\n />\n <div className=\"u-marginBsm\">\n <SectionBreadcrumbs sectionTrail={sectionTrail} />\n </div>\n <div className=\"u-marginBlg u-paddingA u-bgGreenLight u-borderRadius20 u-flex u-flexAlignItemsCenter u-flexJustifyContentCenter u-flexGap16 u-flexJustifySpaceBetween\">\n <div>\n <h1>\n {props.type === 'product' ? 'Produkten' : 'Kategorin'} kunde inte hittas.\n </h1>\n <p>\n Vi kunde inte hitta sidan som du söker, kanske är den flyttad? Prova ladda\n om sidan om du tycker att något verkar helt fel.\n </p>\n </div>\n </div>\n {relatedProducts && relatedProducts.items?.length && (\n <ListBlock\n cellsInRow={cellsInRow}\n gridClasses={gridAdditionalClasses}\n items={relatedProducts.items}\n itemUniqueKey={(item) => item.identifier.toString()}\n renderItem={(item, _index) => (\n <BuyableProductTeaser\n product={item}\n isALink\n isAsyncLink\n analyticsOptions={{\n list: 'Product not found',\n listPosition: 0,\n position: _index,\n }}\n />\n )}\n isLoading={false}\n renderSkeleton={() => <BuyableProductTeaserSkeleton />}\n analyticsListName=\"\"\n useSwiper={false}\n horizontalHidden={false}\n />\n )}\n </div>\n );\n};\n\nexport default NotFoundPage;\n","import type { FC } from 'react';\n\nimport { appConfig } from '../../../../../appConfig';\nimport type { BreadcrumbItem } from '../../../../common/components/molecules/Breadcrumbs';\nimport Breadcrumbs from '../../../../common/components/molecules/Breadcrumbs/Breadcrumbs';\nimport { buildAbsoluteUrl, buildSubSectionUrl } from '../../../utils/urlEcommerceUtils';\nimport type { SectionTreeItem } from '../../SectionMenu';\n\ninterface SectionBreadcrumbsProps {\n sectionTrail: SectionTreeItem[];\n}\n\nconst SectionBreadcrumbs: FC<React.PropsWithChildren<SectionBreadcrumbsProps>> = (props) => {\n const breadcrumbs: BreadcrumbItem[] = [\n {\n name: 'Handla',\n url: buildAbsoluteUrl(appConfig.coopSettings.ecommerce.url),\n isLayoutRouterAsyncLink: true,\n },\n ...(props.sectionTrail?.map((b, index) => ({\n name: b.name,\n url: buildAbsoluteUrl(buildSubSectionUrl(props.sectionTrail, index)),\n isLayoutRouterAsyncLink: false,\n })) || []),\n ];\n return <Breadcrumbs items={breadcrumbs} />;\n};\n\nexport default SectionBreadcrumbs;\n","export const ecommerceQueryKeys = {\n settings: ['ecommerceSettings'],\n getSectionAds: (containerId: string | null) => ['sectionAds', containerId],\n};\n\nexport const storeQueryKeys = {\n byId: (storeId: string) => ['Ecommerce:Stores:', storeId],\n};\n","import { useQuery } from '@tanstack/react-query';\n\nimport { appConfig } from '../../../appConfig';\nimport { contentDeliveryApi } from '../../episerver/api/contentDeliveryApi';\nimport type { EpiEcommerceSettingsPageType } from '../../episerver/models/epiEcommerceSettingsPageType';\nimport { ecommerceQueryKeys } from '../ecommerceQueryKeys';\n\nconst useEcommerceSettings = () => {\n const query = useQuery<EpiEcommerceSettingsPageType>({\n queryKey: ecommerceQueryKeys.settings,\n queryFn: () =>\n contentDeliveryApi.getContentExtended<EpiEcommerceSettingsPageType>(\n appConfig.coopSettings.ecommerce.settingsContentId,\n ),\n staleTime: Infinity,\n });\n\n return query;\n};\n\nexport default useEcommerceSettings;\n"],"names":["props","ref","tryOpen","isOpen","close","id","name","isFavourite","onFavouriteRecipeToggleClick","isLoading","BaseRecipeTeaser","Wrapper","imageUrl","withBorder","topSlot","FavoriteRecipeToggle","isFavorite","onClick","disabled","Badges","Chip","theme","size","Content","Info","Heading","url","flexOrder","onLinkClick","e","click","buyableFoodbox","Actions","recipeId","recipeName","defaultPortions","buyText","onBuyClick","onRemoveClick","stopPropagation","buttonType","buttonFullWidth","analyticsListName","buyableRecipe","RatingContainer","RatingStars","rating","votes","ClimateImpact","co2ImpactKg","BreadcrumbsJsonLdSchema","items","item","itemListElement","filter","map","index","URL","window","location","origin","toString","undefined","position","wrapperClasses","small","push","useReactRouting","isBreadcumbActive","length","className","Icon","icon","style","marginRight","choices","condition","renderWrapper","children","href","preventDefault","eventCategory","eventAction","eventLabel","currentTarget","innerText","isLayoutRouterAsyncLink","pathname","handleLinkClick","Button","removeText","cartRecipe","state","cartRecipeSelectors","nonEmpty","selectById","dispatch","removeRecipeDispatcher","useAsyncDispatcher","cartThunks","removeRecipe","currentCartItems","cartItemsSelectors","selectAllCartItems","previousCartItems","useRef","currentProductionUnit","storeSelectors","useEffect","current","status","reset","changeCartItems","productId","cartItemData","variantId","quantity","list","useRecipeTracking","handleRecipeRemove","execute","onRecipeBuyClick","hasRecipeInCart","buttonRemoveText","buttonBuyText","EmphasizedButton","rightSlot","width","height","fullWidth","portions","Modal","additionalClasses","BuyableRecipeModalBody","tabToDisplay","Products","useRecipeModal","guid","useMemo","modalActions","RecipeModal","hasActiveStoreSelection","initCnc","ecommerce","recipes","interaction","open","generateOfferJsonLd","product","priceType","hostname","offer","price","priceData","getPrice","priceCurrency","availability","itemCondition","value","unitCode","description","shippingRate","maxValue","minValue","currency","shippingDestination","addressCountry","deliveryTime","handlingTime","transitTime","hasMerchantReturnPolicy","returnFees","returnPolicyCategory","applicableCountry","merchantReturnLink","coopSettings","myCoop","lastOrdersUrl","merchantReturnDays","customerRemorseReturnShippingFeesAmount","refundType","itemDefectReturnFees","customerRemorseReturnFees","generateProductJsonLd","jsonLd","brand","manufacturer","countryOfOrigin","details","countryOfOriginCodes","join","image","Boolean","offers","sku","identifier","isNicotineProduct","isAgeLimited","isPharmaceutical","pharmaceuticalData","ean","startsWith","gtin13","audience","requiredMinAge","generateItemListJsonLd","urls","optional","numberOfItems","sectionTree","currentSectionId","currentSectionPath","currentSection","sectionTrail","data","relatedProducts","queryKey","enabled","queryFn","searchProductsInSection","slice","searchProductOffersLoop","page","resultsPerPage","storeId","sortBy","facets","maxPages","retry","gridAdditionalClasses","cellsInRow","headData","title","link","meta","robots","pageTypeNameForAnalytics","type","gridClasses","itemUniqueKey","renderItem","_index","isALink","isAsyncLink","analyticsOptions","listPosition","renderSkeleton","useSwiper","horizontalHidden","breadcrumbs","b","ecommerceQueryKeys","settings","getSectionAds","containerId","storeQueryKeys","byId","getContentExtended","settingsContentId","staleTime","Infinity"],"sourceRoot":""}