{"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":""}