{"version":3,"file":"coopse.script.2031.e07e1df2.chunk.js","mappings":"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","sources":["webpack:///./src/microApps/common/components/atoms/PageHead/PageHead.tsx","webpack:///./src/microApps/common/components/molecules/PageProperties/PageProperties.utils.ts","webpack:///./src/microApps/common/components/molecules/PageProperties/PageProperties.hooks.ts","webpack:///./src/microApps/common/components/molecules/PageProperties/PageProperties.tsx","webpack:///./src/microApps/common/components/molecules/RouterPagination.tsx","webpack:///./src/microApps/common/components/A11yAnnouncer/DebouncedA11yAnnouncer.tsx","webpack:///./src/microApps/common/components/A11yLoadingExperience/A11yLoadingExperience.tsx","webpack:///./src/microApps/common/components/A11yLoadingExperience/A11yLoadingExperience.hooks.ts","webpack:///./src/microApps/common/components/organisms/ProductResult.tsx","webpack:///./src/microApps/common/hooks/useDocumentHeadIsPreparedForReactHelmet.ts","webpack:///./src/microApps/common/hooks/useQuerySearchParams.ts","webpack:///./src/microApps/common/hooks/useSavedInRef.ts","webpack:///./src/microApps/common/utils/metaUtils.ts","webpack:///./src/microApps/ecommerce/hooks/useGridRerenderKey.ts","webpack:///./src/microApps/ecommerce/hooks/useProductTeaserContainer.ts","webpack:///../../packages/components/src/Pagination/PageNumber.tsx","webpack:///../../packages/components/src/Pagination/Pagination.module.scss","webpack:///../../packages/components/src/Pagination/Pagination.tsx","webpack:///../../packages/components/src/Pagination/Pagination.utils.ts"],"sourcesContent":["import type { FC } from 'react';\nimport Helmet from 'react-helmet';\n\nimport { isProductionEnvironment } from '../../../../../utility/environments';\nimport useDocumentHeadIsPreparedForReactHelmet from '../../../hooks/useDocumentHeadIsPreparedForReactHelmet';\nimport { getCanonical, getNextPage, getPrevPage } from '../../../utils/metaUtils';\nimport type { PageHeadData, PageHeadPagination } from './PageHead.types';\n\ninterface PageHeadProps {\n    data: PageHeadData;\n    pagination?: PageHeadPagination;\n}\n\nconst PageHead: FC<React.PropsWithChildren<PageHeadProps>> = (props) => {\n    const link = { ...props.data.link };\n    const meta = { ...props.data.meta };\n\n    if (link && link.canonical) {\n        link.canonical = getCanonical({\n            path: link.canonical,\n            page: props.pagination?.currentPage,\n        });\n    }\n\n    let hasPrevPage = false;\n    let hasNextPage = false;\n\n    if (props.pagination) {\n        hasPrevPage = props.pagination.currentPage !== 1;\n        if (props.pagination.totalItems) {\n            hasNextPage =\n                props.pagination.pageSize * props.pagination.currentPage <=\n                props.pagination.totalItems;\n        }\n    }\n\n    if (hasPrevPage && link && props.pagination) {\n        link.prevPage = getPrevPage(props.pagination.currentPage);\n    }\n\n    if (hasNextPage && link && props.pagination) {\n        link.nextPage = getNextPage(props.pagination.currentPage);\n    }\n\n    const linkData =\n        link &&\n        Object.entries(link).filter(\n            (item) => item[1] !== '' && item[1] !== undefined && item[1] !== null,\n        );\n\n    const metaData =\n        meta &&\n        Object.entries(meta).filter(\n            (item) => item[1] !== '' && item[1] !== undefined && item[1] !== null,\n        );\n\n    let options: Parameters<typeof useDocumentHeadIsPreparedForReactHelmet>[0] = {\n        link: linkData?.map(([key]) => ({ property: 'rel', value: key })),\n    };\n\n    if (metaData) {\n        options = {\n            ...options,\n            meta: metaData.map(([key]) => ({ property: 'name', value: key })),\n        };\n    }\n\n    const isDocumentHeadReadyForReactHelmet = useDocumentHeadIsPreparedForReactHelmet(options);\n\n    return (\n        // eslint-disable-next-line react/jsx-no-useless-fragment\n        <>\n            {isDocumentHeadReadyForReactHelmet && (\n                <Helmet>\n                    {props.data.title && (\n                        <title>\n                            {props.data.title +\n                                (!isProductionEnvironment ? ' - NOT FOR COMMERCIAL USE' : '')}\n                        </title>\n                    )}\n                    {metaData?.map(([property, value]) => (\n                        <meta key={property} name={property} content={value} />\n                    ))}\n\n                    {linkData?.map(([property, value]) => (\n                        <link key={property} rel={property} href={value} />\n                    ))}\n\n                    {props.children}\n                </Helmet>\n            )}\n        </>\n    );\n};\n\nexport default PageHead;\n","const defaultQueryKeys = ['page'];\n\n/**\n * Filter current query string to only contain certain keys that are relevant for GA's virtual page view\n * @param queryString The complete query string of a location\n * @param keys List of allowed query string keys\n */\nexport const getFilteredQueryStringForVirtualPageView = (\n    queryString: string,\n    keys: string[] = [],\n) => {\n    const triggerKeys = [...defaultQueryKeys, ...keys];\n\n    const searchParams = new URLSearchParams(queryString);\n\n    const filteredSearchParams = Array.from(searchParams.entries())\n        .filter(([key]) => triggerKeys.includes(key))\n        .reduce((acc, [key, value]) => {\n            acc.set(key, value.toString());\n            return acc;\n        }, new URLSearchParams());\n\n    return filteredSearchParams.toString();\n};\n","import { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { useSavedInRef } from '../../../hooks/useSavedInRef';\nimport { useAppDispatch } from '../../../hooks/useThunkDispatch';\nimport { currentPageActions } from '../../../store/slices/currentPage/currentPageSlice';\nimport { getFilteredQueryStringForVirtualPageView } from './PageProperties.utils';\n\ninterface GaVirtualPageParams {\n    pageTitle: string;\n    canonicalUrl?: string;\n    pageTypeName?: string;\n    /**\n     * Used to specify what key must have been changed in URL's query string to trigger Virtual Page View\n     * By defualt, pagination's \"page\" is always a trigger, rest of the triggers are set on page-to-page basis\n     */\n    queryStringTriggers?: string[];\n}\n\nexport const useGaVirtualPageView = (options?: GaVirtualPageParams) => {\n    const { search } = useLocation();\n    const dispatch = useAppDispatch();\n\n    const canonicalUrl =\n        options &&\n        options.canonicalUrl &&\n        new URL(options.canonicalUrl, window.location.origin).toString();\n\n    // used only in dependency array to trigger effect\n    const triggerString = getFilteredQueryStringForVirtualPageView(\n        search,\n        (options && options.queryStringTriggers) || [],\n    );\n\n    const enable = !!options;\n\n    const sendEvent = useSavedInRef(() => {\n        if (canonicalUrl) {\n            dispatch(\n                currentPageActions.setPageGaData({\n                    canonicalUrl,\n                    gaPageTypeName: options && options.pageTypeName,\n                    title: options && options.pageTitle,\n                    queryString: window.location.search,\n                }),\n            );\n        }\n    });\n\n    useEffect(() => {\n        if (enable && canonicalUrl) {\n            sendEvent.current();\n        }\n    }, [dispatch, enable, canonicalUrl, triggerString, sendEvent]);\n\n    return {\n        sendEvent,\n    };\n};\n","import { type FC, useEffect } from 'react';\n\nimport { useAppDispatch } from '../../../hooks/useThunkDispatch';\nimport { currentPageActions } from '../../../store/slices/currentPage/currentPageSlice';\nimport type { PageHeadData, PageHeadPagination } from '../../atoms/PageHead';\nimport PageHead from '../../atoms/PageHead';\nimport { useGaVirtualPageView } from './PageProperties.hooks';\n\ninterface PagePropertiesProps {\n    headData: PageHeadData;\n    headPagination?: PageHeadPagination;\n    pageTypeNameForAnalytics?: string;\n\n    /** @see useGaVirtualPageView comments */\n    virtualPageViewQueryStringTriggers?: string[];\n}\n\nconst PageProperties: FC<React.PropsWithChildren<PagePropertiesProps>> = (props) => {\n    useGaVirtualPageView({\n        canonicalUrl: props.headData.link?.canonical,\n        pageTitle: props.headData.title,\n        pageTypeName: props.pageTypeNameForAnalytics,\n        queryStringTriggers: props.virtualPageViewQueryStringTriggers,\n    });\n\n    const dispatch = useAppDispatch();\n    useEffect(() => {\n        dispatch(currentPageActions.setTitle(props.headData.title));\n    }, [dispatch, props.headData.title]);\n\n    return <PageHead data={props.headData} pagination={props.headPagination} />;\n};\n\nexport default PageProperties;\n","/* eslint-disable no-param-reassign */\n/* eslint-disable react/jsx-no-useless-fragment */\nimport { Pagination } from '@coop/components';\nimport { useLocation } from 'react-router-dom';\n\nimport { useQuerySearchParam, useQuerySearchParams } from '../../hooks/useQuerySearchParams';\n\ntype Page = Parameters<React.ComponentProps<typeof Pagination>['onPageChange']>[1];\n\ninterface RouterPaginationProps {\n    ariaLabel?: string;\n    totalResults: number;\n    resultsPerPage: number;\n    paginationRange: number;\n    hideIfOnlyOnePage?: boolean;\n    onPageChange?: (newPage: number, totalPages: number) => void;\n}\n\nexport const RouterPagination = (props: RouterPaginationProps) => {\n    const [page, setPage] = useQuerySearchParam('page', '1');\n    const currentPage = Number(page);\n\n    const location = useLocation();\n    const queryParams = useQuerySearchParams();\n\n    const onPageChange = (\n        e: React.MouseEvent<HTMLAnchorElement>,\n        _page: Page,\n        totalPages: number,\n    ) => {\n        e.preventDefault();\n        e.stopPropagation();\n\n        if (_page.pageNumber > 1) {\n            setPage(_page.pageNumber.toString());\n        } else {\n            setPage(null);\n        }\n\n        props.onPageChange?.(_page.pageNumber, totalPages);\n    };\n\n    return (\n        <Pagination\n            ariaLabel={props.ariaLabel}\n            currentPath={location.pathname}\n            currentSearchParams={queryParams}\n            currentPage={currentPage}\n            onPageChange={onPageChange}\n            totalResults={props.totalResults}\n            resultsPerPage={props.resultsPerPage}\n            paginationRange={props.paginationRange}\n            hideIfOnlyOnePage={props.hideIfOnlyOnePage}\n        />\n    );\n};\n\nexport default RouterPagination;\n","import { VisuallyHidden } from '@coop/components';\nimport { useDebounce } from '@coop/hooks';\nimport React from 'react';\n\nimport { useA11yLogInConsoleEffect } from '../../hooks/useA11yLogInConsole';\nimport { useTemporaryTextEffect } from './TemporaryA11yAnnouncer';\n\n/**\n * A debounced a11y announcer that will announce the text after a certain amount of time.\n */\nconst DebouncedA11yAnnouncer = (props: {\n    text: string | undefined;\n    announcerName: string;\n    debounceTime?: number;\n}) => {\n    const { debounceTime = 300 } = props;\n    const [debouncedText, setDebouncedText] = useDebounce(props.text, debounceTime);\n\n    useTemporaryTextEffect(props.text, setDebouncedText, 1000);\n    useA11yLogInConsoleEffect(props.announcerName, debouncedText);\n\n    return (\n        <VisuallyHidden role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n            {debouncedText}\n        </VisuallyHidden>\n    );\n};\n\nexport default React.memo(DebouncedA11yAnnouncer);\n","import DebouncedA11yAnnouncer from '../A11yAnnouncer/DebouncedA11yAnnouncer';\nimport {\n    type useA11yLoadingExperience,\n    defaultA11yLoadingExperienceDebounceTime,\n} from './A11yLoadingExperience.hooks';\n\n/**\n * Always use in conjunction with useA11yLoadingExperience\n */\nconst A11yLoadingExperience = (\n    props: {\n        isLoading: boolean | undefined;\n        announcerDebounceTime?: number;\n        /**\n         * For debugging purposes only when console logging is turned on in Coop Dev Tools\n         */\n        announcerName: string;\n    } & ReturnType<typeof useA11yLoadingExperience>,\n) => {\n    const loadingText = props.isLoading ? 'Hämtar data' : undefined;\n\n    return (\n        <>\n            <div\n                ref={props.focusTargetRef}\n                onBlurCapture={props.onBlurCapture}\n                className=\"u-hiddenVisually\"\n                tabIndex={-1}\n            >\n                {!props.isLoading ? props.textToFocus : undefined}\n            </div>\n\n            <DebouncedA11yAnnouncer\n                text={loadingText}\n                announcerName={props.announcerName}\n                debounceTime={\n                    props.announcerDebounceTime ?? defaultA11yLoadingExperienceDebounceTime\n                }\n            />\n        </>\n    );\n};\n\nexport default A11yLoadingExperience;\n","import { useRef } from 'react';\n\nimport { useSkipLinkTarget } from '../../../base/components/SkipLink';\n\nexport const defaultA11yLoadingExperienceDebounceTime = 200;\n\nexport const useA11yLoadingExperience = (announcerDebounceTime?: number) => {\n    const { ref, onBlurCapture, moveFocus } = useSkipLinkTarget();\n    const textToFocus = useRef<string | null>(null);\n\n    const trigger = (text: string) => {\n        textToFocus.current = text;\n        setTimeout(\n            moveFocus,\n            (announcerDebounceTime ?? defaultA11yLoadingExperienceDebounceTime) + 200, // offset time to make sure that the potential loading a11y indicator is announced first\n        );\n    };\n\n    return {\n        focusTargetRef: ref,\n        onBlurCapture,\n        textToFocus: textToFocus.current,\n        trigger,\n    };\n};\n","import { A11yOverlayLoader } from '@coop/components';\nimport { type ReactNode, type RefObject } from 'react';\n\nimport { A11yLoadingExperience, useA11yLoadingExperience } from '../A11yLoadingExperience';\nimport { RouterPagination } from '../molecules/RouterPagination';\n\ninterface ProductResultProps {\n    paginationAriaLabel?: `Sidnumrering${string}`;\n    productGridRender: (ref?: React.RefObject<HTMLUListElement>) => ReactNode;\n    productSkeletonGridRender?: () => ReactNode;\n    noProductsSlot?: ReactNode;\n    errorSlot?: ReactNode;\n    selectedPageSize: number;\n    totalResults?: number;\n    isLoading?: boolean;\n    hasError?: boolean;\n}\n\nconst ProductResult = (props: React.PropsWithChildren<ProductResultProps>) => {\n    const alreadyHasProducts = !!props.totalResults && props.totalResults > 0; // might have products due to SSR or switching page\n\n    const a11yLoadingState = useA11yLoadingExperience();\n\n    return (\n        <>\n            <A11yLoadingExperience\n                announcerName=\"ProductResult\"\n                isLoading={props.isLoading}\n                // eslint-disable-next-line react/jsx-props-no-spreading\n                {...a11yLoadingState}\n                announcerDebounceTime={250}\n            />\n            <A11yOverlayLoader isLoading={alreadyHasProducts && !!props.isLoading}>\n                <div className=\"ProductGrid Grid\">\n                    {props.isLoading && !alreadyHasProducts && props.productSkeletonGridRender && (\n                        <div className=\"Grid-cell\">{props.productSkeletonGridRender()}</div>\n                    )}\n                    {props.hasError && props.errorSlot}\n\n                    {!props.hasError &&\n                        props.totalResults !== undefined &&\n                        props.totalResults > 0 &&\n                        !!props.productGridRender && (\n                            <div className=\"Grid-cell\">{props.productGridRender()}</div>\n                        )}\n\n                    {!props.hasError &&\n                        props.totalResults !== undefined &&\n                        props.totalResults <= 0 &&\n                        !props.isLoading &&\n                        props.noProductsSlot}\n\n                    {props.children}\n                </div>\n                {props.totalResults !== undefined &&\n                    props.totalResults > props.selectedPageSize && (\n                        <div className=\"u-marginTmd\">\n                            <RouterPagination\n                                ariaLabel={props.paginationAriaLabel || 'Sidnumrering'}\n                                totalResults={props.totalResults}\n                                resultsPerPage={props.selectedPageSize}\n                                paginationRange={7}\n                                onPageChange={(newPage, totalPages) => {\n                                    a11yLoadingState.trigger(\n                                        `Visar sida ${newPage} av ${totalPages}`,\n                                    );\n                                }}\n                            />\n                        </div>\n                    )}\n            </A11yOverlayLoader>\n        </>\n    );\n};\n\nexport default ProductResult;\n","import { useEffect, useState } from 'react';\n\ninterface ElementsToUpdate {\n    [tag: string]: { property: string; value: string }[];\n}\n\n/**\n * React helmet only handles elements inside the head tag that contain data-react-helmet=\"true\"\n */\nconst useDocumentHeadIsPreparedForReactHelmet = (elementsToUpdateByTag: ElementsToUpdate) => {\n    const [readyForReactHelmet, setReadyForReactHelmet] = useState(false);\n\n    const stringifiedElements = JSON.stringify(elementsToUpdateByTag);\n\n    useEffect(() => {\n        const parsedElementsToUpdateByTag = JSON.parse(stringifiedElements) as ElementsToUpdate;\n        if (parsedElementsToUpdateByTag) {\n            const childrenOfHead = Array.from(document.getElementsByTagName('head')[0].children);\n\n            childrenOfHead.forEach((child) => {\n                const tagName = child?.tagName?.toLowerCase();\n\n                parsedElementsToUpdateByTag[tagName]?.forEach((tagEl) => {\n                    if (child.getAttribute(tagEl.property) === tagEl.value) {\n                        child.setAttribute('data-react-helmet', 'true');\n                    }\n                });\n            });\n\n            setReadyForReactHelmet(true);\n        }\n    }, [stringifiedElements]);\n\n    return readyForReactHelmet;\n};\n\nexport default useDocumentHeadIsPreparedForReactHelmet;\n","import { useCallback } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport useReactRouting from '../../ecommerce/hooks/useReactRouting';\n\nexport const useQuerySearchParams = () => {\n    return new URLSearchParams(useLocation().search);\n};\n\ntype QueryHistoryAction = 'push' | 'replace';\n\nexport const useQuerySearchParam = <TDefaultValue = null>(\n    key: string,\n    defaultValue: TDefaultValue,\n) => {\n    const location = useLocation();\n    const query = new URLSearchParams(location.search).get(key) || defaultValue;\n\n    const { pushLocation, replace } = useReactRouting();\n\n    const updateUrl = useCallback(\n        (newVal: string | null, historyAction: QueryHistoryAction = 'push') => {\n            const q = new URLSearchParams(location.search);\n\n            if (newVal?.trim()) {\n                q.set(key, newVal);\n            } else {\n                q.delete(key);\n            }\n\n            const newHistoryLocation = {\n                search: q?.toString(),\n            };\n\n            if (historyAction === 'push') {\n                pushLocation(newHistoryLocation);\n                return;\n            }\n\n            if (historyAction === 'replace') {\n                replace(newHistoryLocation);\n            }\n        },\n        // eslint-disable-next-line react-hooks/exhaustive-deps\n        [location, key],\n    );\n\n    return [query, updateUrl] as const;\n};\n","import { useLayoutEffect, useRef } from 'react';\n\nexport const useSavedInRef = <T>(value: T) => {\n    const ref = useRef<T>(value);\n\n    useLayoutEffect(() => {\n        ref.current = value;\n    });\n\n    return ref;\n};\n","import { addQueryParamsToUrl } from './urlUtils';\n\nexport const getRobotsContent = (noIndex?: boolean, noFollow?: boolean) => {\n    if (noIndex && noFollow) {\n        return 'NOINDEX,NOFOLLOW';\n    }\n\n    if (noIndex) {\n        return 'NOINDEX';\n    }\n\n    if (noFollow) {\n        return 'NOFOLLOW';\n    }\n\n    return undefined;\n};\n\nexport const getCanonical = ({ path, page }: { path: string; page?: number }) => {\n    const url = new URL(path, window.location.origin).toString();\n\n    return Number.isInteger(page) && page !== 1\n        ? addQueryParamsToUrl(url, { page: String(page) })\n        : url;\n};\n\nexport const getNextPage = (currentPage: number) => {\n    const searchParams = new URLSearchParams();\n    searchParams.set('page', (currentPage + 1).toString());\n\n    const newUrl = `${\n        window.location.origin + window.location.pathname\n    }?${searchParams.toString()}`;\n\n    return newUrl;\n};\n\nexport const getPrevPage = (currentPage: number) => {\n    const searchParams = new URLSearchParams();\n    const prevPage = currentPage - 1;\n    if (prevPage > 1) {\n        searchParams.set('page', prevPage.toString());\n    } else {\n        searchParams.delete('page');\n    }\n    const stringifiedParams = searchParams.toString();\n\n    const newUrl =\n        window.location.origin +\n        window.location.pathname +\n        (stringifiedParams ? `?${searchParams.toString()}` : '');\n\n    return newUrl;\n};\n","import { useMemo } from 'react';\nimport { v4 } from 'uuid';\n\n/**\n *   Creates a key for grid's items that forces them to remount when new grid items are loaded\n *   This is done to reset items' states of being visible in viewport, to properly trigger GA events\n */\nexport const useGridRerenderKey = (param: unknown) => {\n    const gridRerenderKey = useMemo(() => {\n        return v4();\n        // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [param]);\n\n    return gridRerenderKey;\n};\n","import classnames from 'classnames';\nimport { useMemo } from 'react';\nimport type { SwiperOptions } from 'swiper/types';\n\nimport type { SwiperBreakpointsCollection } from '../../../utility/coopSwiperBreakpoints';\nimport { CoopSwiperBreakpoints } from '../../../utility/coopSwiperBreakpoints';\nimport { useSwiperOverflowClasses } from '../../common/hooks/useSwiperOverflowClasses';\nimport { useBreakpointsSidebar } from './useBreakpoints';\n\nconst getProductTeaserContainerBreakpointAreaName = (\n    containerType: 'grid' | 'list',\n    hasBanner: boolean = false,\n): keyof SwiperBreakpointsCollection => {\n    if (containerType === 'grid') {\n        return CoopSwiperBreakpoints.AREA_NEW_PRODUCT_GRID;\n    }\n\n    if (hasBanner) {\n        return CoopSwiperBreakpoints.AREA_NEW_PRODUCT_LIST_WITH_BANNER;\n    }\n\n    return CoopSwiperBreakpoints.AREA_NEW_PRODUCT_LIST;\n};\n\nexport const useVerticalProductTeaserContainer = (\n    containerType: 'list' | 'grid',\n    hasBanner: boolean = false,\n) => {\n    const gridAdditionalClasses = classnames('Grid--gutterAxsm');\n\n    const breakpointAreaName = getProductTeaserContainerBreakpointAreaName(\n        containerType,\n        hasBanner,\n    );\n\n    const { cellsInRow, breakpoints } = useBreakpointsSidebar(breakpointAreaName);\n\n    const { mainSwiperClasses, spaceBetween } = useSwiperOverflowClasses();\n\n    const swiperOptions: SwiperOptions = useMemo(\n        () => ({ breakpoints, spaceBetween }),\n        [breakpoints, spaceBetween],\n    );\n    return {\n        gridAdditionalClasses,\n        swiperOptions,\n        swiperMainClass: mainSwiperClasses,\n        cellsInRow,\n    };\n};\n","/* eslint-disable no-param-reassign */\n/* eslint-disable react/jsx-no-useless-fragment */\nimport type { FC } from 'react';\n\nimport type { Page, PageResult } from './Pagination.types';\n\nexport interface PageNumberProps {\n    page: Page;\n    pagingResult: PageResult;\n}\n\nconst PageNumber: FC<React.PropsWithChildren<PageNumberProps>> = ({ page, pagingResult }) => {\n    if (!page) return null;\n\n    if (page.complementaryPageType && page.pageNumber === 1) {\n        if (pagingResult.pages.find((x) => x.pageNumber === page.pageNumber + 1)) {\n            return <>{page.pageNumber}</>;\n        }\n        return (\n            <>\n                {page.pageNumber} <span>...</span>\n            </>\n        );\n    }\n\n    if (page.complementaryPageType && page.pageNumber !== 1) {\n        if (pagingResult.pages.find((x) => x.pageNumber === page.pageNumber - 1)) {\n            return <>{page.pageNumber}</>;\n        }\n        return (\n            <>\n                <span>...</span> {page.pageNumber}\n            </>\n        );\n    }\n\n    if (!page.complementaryPageType) {\n        return <>{page.pageNumber}</>;\n    }\n\n    return null;\n};\n\nexport default PageNumber;\n","// extracted by mini-css-extract-plugin\nexport default {\"Pagination\":\"Pk_thyR9\",\"Pagination-page\":\"OCbXTjhT\",\"LeftComplementaryPage\":\"dowXTkJ0\",\"RightComplementaryPage\":\"BbAspxZt\",\"is-active\":\"pxSrp8xa\",\"Pagination-arrow\":\"Kr1thI9n\"};","import { ChevronLeftIcon, ChevronRightIcon } from '@coop/icons';\nimport classNames from 'classnames';\n/* eslint-disable no-param-reassign */\n/* eslint-disable react/jsx-no-useless-fragment */\nimport type * as React from 'react';\n\nimport { AccessibleIcon } from '../Icon';\nimport PageNumber from './PageNumber';\nimport styles from './Pagination.module.scss';\nimport type { Page } from './Pagination.types';\nimport { calculatePaging } from './Pagination.utils';\n\ninterface PaginationProps {\n    ariaLabel?: string;\n    currentPage: number;\n    totalResults: number;\n    resultsPerPage: number;\n    paginationRange: number;\n    currentPath: string;\n    currentSearchParams: URLSearchParams;\n    onPageChange: (e: React.MouseEvent<HTMLAnchorElement>, page: Page, totalPages: number) => void;\n    hideIfOnlyOnePage?: boolean;\n}\n\nconst Pagination = (props: React.PropsWithChildren<PaginationProps>) => {\n    const { currentPage } = props;\n    const pagingResult = calculatePaging(\n        currentPage,\n        props.totalResults,\n        props.resultsPerPage,\n        props.paginationRange,\n    );\n\n    const buildUrlWithPage = (page: Page) => {\n        const queryParams = new URLSearchParams(props.currentSearchParams);\n\n        if (page?.pageNumber > 1) {\n            queryParams.set('page', page.pageNumber.toString());\n        } else {\n            queryParams.delete('page');\n        }\n        const newUrl = `${props.currentPath}${\n            queryParams.toString() && `?${queryParams.toString()}`\n        }`;\n        return newUrl;\n    };\n\n    const getPage = (pageNumber: number) => {\n        return pagingResult.pages.find((page) => page.pageNumber === pageNumber);\n    };\n\n    const prevPage = getPage(currentPage - 1);\n    const nextPage = getPage(currentPage + 1);\n\n    if (pagingResult.totalPages === 0) {\n        return null;\n    }\n\n    if (pagingResult.totalPages === 1 && props.hideIfOnlyOnePage) {\n        return null;\n    }\n\n    return (\n        <nav className={classNames(styles.Pagination)} aria-label={props.ariaLabel}>\n            <ol>\n                {currentPage > 1 && prevPage && (\n                    <li>\n                        <a\n                            href={buildUrlWithPage(prevPage)}\n                            className={styles['Pagination-arrow']}\n                            onClick={(e) =>\n                                props.onPageChange(e, prevPage, pagingResult.totalPages)\n                            }\n                            rel=\"nofollow\"\n                        >\n                            <AccessibleIcon icon={ChevronLeftIcon} label=\"Föregående sida\" />\n                        </a>\n                    </li>\n                )}\n                {pagingResult.pages.map((page) => (\n                    <li>\n                        <a\n                            href={buildUrlWithPage(page)}\n                            key={page.pageNumber}\n                            className={classNames(\n                                styles['Pagination-page'],\n                                page.isCurrentPage && styles['is-active'],\n                                page.complementaryPageType === 'left' &&\n                                    styles.LeftComplementaryPage,\n                                page.complementaryPageType === 'right' &&\n                                    styles.RightComplementaryPage,\n                            )}\n                            onClick={(e) => props.onPageChange(e, page, pagingResult.totalPages)}\n                            rel={page?.pageNumber > 3 ? 'nofollow' : undefined}\n                            aria-label={`Sida ${page.pageNumber}`}\n                            aria-current={page.isCurrentPage}\n                        >\n                            <PageNumber page={page} pagingResult={pagingResult} />\n                        </a>\n                    </li>\n                ))}\n                {currentPage !== pagingResult.totalPages && nextPage && (\n                    <li>\n                        <a\n                            href={buildUrlWithPage(nextPage)}\n                            className={styles['Pagination-arrow']}\n                            onClick={(e) =>\n                                props.onPageChange(e, nextPage, pagingResult.totalPages)\n                            }\n                            rel=\"nofollow\"\n                        >\n                            <AccessibleIcon icon={ChevronRightIcon} label=\"Nästa sida\" />\n                        </a>\n                    </li>\n                )}\n            </ol>\n        </nav>\n    );\n};\n\nexport default Pagination;\n","/* eslint-disable no-param-reassign */\nimport type { Page, PageResult } from './Pagination.types';\n\nexport const calculatePaging = (\n    currentPage: number,\n    totalResults: number,\n    resultsPerPage: number,\n    range: number,\n): PageResult => {\n    const totalPages = Math.ceil(totalResults / resultsPerPage);\n    if (range === 0) range = 1;\n\n    // Since both sides of the pagenumber you are on needs to be same, the range number must be odd\n    if (range % 2 === 0) {\n        range += 1;\n    }\n\n    if (range > totalPages) range = totalPages;\n    if (currentPage <= 0) currentPage = 1;\n\n    const rangePerSide = Math.floor(range / 2);\n    let start = currentPage - rangePerSide;\n    start = Math.max(start, 1);\n    start = Math.min(start, 1 + totalPages - range);\n\n    const leftComplement = start > 1;\n    const rightComplement = start + range - 1 < totalPages;\n\n    const pages: Page[] = [];\n\n    for (let i = 0; i < range; i += 1) {\n        pages.push({\n            pageNumber: start + i,\n            isCurrentPage: start + i === currentPage,\n            resultsPerPage,\n            startIndex: (start + i - 1) * resultsPerPage,\n        });\n    }\n\n    if (leftComplement) {\n        pages.splice(0, rangePerSide - 1, {\n            pageNumber: 1,\n            isCurrentPage: false,\n            complementaryPageType: 'left',\n            resultsPerPage,\n            startIndex: 0,\n        });\n    }\n\n    if (rightComplement) {\n        pages.splice(pages.length - rangePerSide + 1, rangePerSide, {\n            pageNumber: totalPages,\n            isCurrentPage: false,\n            complementaryPageType: 'right',\n            resultsPerPage,\n            startIndex: (totalPages - 1) * resultsPerPage,\n        });\n    }\n\n    return {\n        pages,\n        totalPages,\n    };\n};\n"],"names":["props","link","data","meta","canonical","path","page","pagination","currentPage","hasPrevPage","hasNextPage","totalItems","pageSize","prevPage","nextPage","linkData","Object","entries","filter","item","undefined","metaData","options","map","key","property","value","isDocumentHeadReadyForReactHelmet","useDocumentHeadIsPreparedForReactHelmet","Helmet","title","name","content","rel","href","children","defaultQueryKeys","useGaVirtualPageView","search","dispatch","canonicalUrl","URL","window","location","origin","toString","triggerString","queryString","keys","triggerKeys","searchParams","URLSearchParams","Array","from","includes","reduce","acc","set","getFilteredQueryStringForVirtualPageView","queryStringTriggers","enable","sendEvent","useSavedInRef","c","setPageGaData","gaPageTypeName","pageTypeName","pageTitle","useEffect","current","headData","pageTypeNameForAnalytics","virtualPageViewQueryStringTriggers","setTitle","headPagination","RouterPagination","setPage","Number","queryParams","ariaLabel","currentPath","pathname","currentSearchParams","onPageChange","e","_page","totalPages","preventDefault","stopPropagation","pageNumber","totalResults","resultsPerPage","paginationRange","hideIfOnlyOnePage","debounceTime","debouncedText","setDebouncedText","text","useA11yLogInConsole","announcerName","VisuallyHidden","role","loadingText","isLoading","ref","focusTargetRef","onBlurCapture","className","tabIndex","textToFocus","announcerDebounceTime","alreadyHasProducts","a11yLoadingState","moveFocus","useRef","trigger","setTimeout","useA11yLoadingExperience","productSkeletonGridRender","hasError","errorSlot","productGridRender","noProductsSlot","selectedPageSize","paginationAriaLabel","newPage","elementsToUpdateByTag","readyForReactHelmet","setReadyForReactHelmet","useState","stringifiedElements","JSON","stringify","parsedElementsToUpdateByTag","parse","document","getElementsByTagName","forEach","child","tagName","toLowerCase","tagEl","getAttribute","setAttribute","useQuerySearchParams","useQuerySearchParam","defaultValue","query","get","pushLocation","replace","useCallback","newVal","historyAction","q","trim","delete","newHistoryLocation","useLayoutEffect","getRobotsContent","noIndex","noFollow","getCanonical","url","isInteger","String","getNextPage","getPrevPage","stringifiedParams","useGridRerenderKey","param","useMemo","useVerticalProductTeaserContainer","containerType","hasBanner","gridAdditionalClasses","breakpointAreaName","AREA_NEW_PRODUCT_GRID","AREA_NEW_PRODUCT_LIST_WITH_BANNER","AREA_NEW_PRODUCT_LIST","getProductTeaserContainerBreakpointAreaName","cellsInRow","breakpoints","mainSwiperClasses","spaceBetween","swiperOptions","swiperMainClass","pagingResult","complementaryPageType","pages","find","x","range","Math","ceil","rangePerSide","floor","start","max","min","leftComplement","rightComplement","i","push","isCurrentPage","startIndex","splice","length","calculatePaging","buildUrlWithPage","getPage","onClick","AccessibleIcon","A","icon","label"],"sourceRoot":""}