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