{"version":3,"sources":["atoms/submittedState.ts","../node_modules/jump.js/dist/jump.module.js","utils/persistDataLayer.ts","components/Results.tsx"],"names":["searchFormSubmittedState","atom","key","default","searchFormSubmitted","easeInOutQuad","t","b","c","d","_typeof","Symbol","iterator","obj","constructor","prototype","singleton","element","start","stop","offset","easing","a11y","distance","duration","timeStart","timeElapsed","next","callback","top","getBoundingClientRect","loop","timeCurrent","window","scrollTo","requestAnimationFrame","setAttribute","focus","done","target","options","arguments","length","undefined","scrollY","pageYOffset","document","querySelector","jumper","persistDataLayer","selectedFilters","keyword","subjectText","subject","text","locationText","location","qualifications","qualification","map","value","join","attendances","attendance","splitComma","split","shapeFeaturedCoursesString","pipe","filter","Boolean","parseInt","deriveParamsFromUrl","queryParam","paramsObject","searchParamsToObject","decodedFeaturedCoursesFromUrl","featuredCourses","decodeURIComponent","featuredCoursesFromUrl","_objectSpread","fetchResults","_ref","queryKey","pageParam","fromUrl","href","_ref2","_ref3","_slicedToArray","page","size","searchParams","selectedSubjectText","subjectParam","fetch","concat","API_BASE_URL","method","credentials","headers","Accept","body","JSON","stringify","filters","RESULTS_PER_PAGE","replace","then","resp","json","catch","error","Error","queryKeyName","coursesUpdater","id","existingResults","index","pages","findIndex","courses","course","courseUID","innerIndex","add","headerFaveCountElement","getElementsByClassName","item","faveCount","innerText","updateHeaderFavouriteCount","saved","_toConsumableArray","slice","jumpOptions","Results","_ref4","title","_ref4$searchData","searchData","_ref4$searchData$subj","setSearch","dataLayer","useRef","isMutation","searchForm","useRecoilValue","_useInfiniteQuery","useInfiniteQuery","suspense","refetchOnWindowFocus","getNextPageParam","lastGroup","currentPage","totalNumberOfResults","data","isFetchingNextPage","fetchNextPage","hasNextPage","status","dataRef","useLocation","prevLocation","usePrevious","queryClient","useQueryClient","mutation","useMutation","Axios","get","toggleSavedEndPoint","withCredentials","onMutate","_onMutate","_asyncToGenerator","_regeneratorRuntime","mark","_callee","previousResults","wrap","_context","prev","current","cancelQueries","getQueryData","setQueryData","abrupt","_x","apply","onError","err","variables","context","_useHistory","useHistory","historyAction","action","search","userLoggedIn","userLoggedInState","showMorePosition","titleElement","setSearchResultState","useSetRecoilState","searchResultState","resultsRef","useCallback","node","queryObject","substring","queryObjectHas","has","__","selectedCourse","sessionStorage","getItem","selectedCourseSessionStorageKey","itemId","getAttribute","newQueryObject","omit","newUrl","URLSearchParams","jump","removeItem","useEffect","isSameUrl","equals","pathname","selectedFiltersTexts","push","event","formType","courseSearchResults","courseNameOrSubject","pageRefresh","urlQueryParam","urlParamObject","headerNavAccess","newItem","createElement","innerHTML","insertBefore","childNodes","updateHeaderSkipLinks","newSearch","some","newSearchString","Object","entries","_ref5","_ref6","encodeURIComponent","__page","toString","maxItemsOnPage","NO_COURSES_FOUND","searchTitle","noOfCoursesInNextBatch","reduce","acc","curr","handleShowMoreClick","_ref7","_callee2","_context2","handleToggleSave","_ref8","_callee3","_context3","mutate","_x2","showMoreButtonText","handleCourseLinkClick","setItem","_jsxs","children","_jsx","Helmet","ref","CourseResultsSummary","total","Container","Row","Column","width","marginLeft","getGridOffset","_ref9","courseName","institutionSlug","institutionName","institutionProfile","departmentSlug","departmentName","departmentProfile","courseSlug","isFeatured","isNewFunding","startsJanuary","CourseSearchResultItem","courseUrl","tnr","departmentUrl","slug","tnrNumber","institutionUrl","loggedIn","passedRef","Flex","justifyContent","ButtonPrimaryNoIcon","onClick","activity","dataTestId","Heading4","as","textAlign","textColor","fontFamily"],"mappings":"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","file":"static/js/5.b23d04f5.chunk.js","sourcesContent":["import { atom } from 'recoil';\n\nexport interface SubmittedState {\n searchFormSubmitted: boolean;\n}\n\nexport const searchFormSubmittedState = atom({\n key: 'searchFormSubmittedState',\n default: {\n searchFormSubmitted: false,\n },\n});\n","// Robert Penner's easeInOutQuad\n\n// find the rest of his easing functions here: http://robertpenner.com/easing/\n// find them exported for ES6 consumption here: https://github.com/jaxgeller/ez.js\n\nvar easeInOutQuad = function easeInOutQuad(t, b, c, d) {\n t /= d / 2;\n if (t < 1) return c / 2 * t * t + b;\n t--;\n return -c / 2 * (t * (t - 2) - 1) + b;\n};\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar jumper = function jumper() {\n // private variable cache\n // no variables are created during a jump, preventing memory leaks\n\n var element = void 0; // element to scroll to (node)\n\n var start = void 0; // where scroll starts (px)\n var stop = void 0; // where scroll stops (px)\n\n var offset = void 0; // adjustment from the stop position (px)\n var easing = void 0; // easing function (function)\n var a11y = void 0; // accessibility support flag (boolean)\n\n var distance = void 0; // distance of scroll (px)\n var duration = void 0; // scroll duration (ms)\n\n var timeStart = void 0; // time scroll started (ms)\n var timeElapsed = void 0; // time spent scrolling thus far (ms)\n\n var next = void 0; // next scroll position (px)\n\n var callback = void 0; // to call when done scrolling (function)\n\n // scroll position helper\n\n function location() {\n return window.scrollY || window.pageYOffset;\n }\n\n // element offset helper\n\n function top(element) {\n return element.getBoundingClientRect().top + start;\n }\n\n // rAF loop helper\n\n function loop(timeCurrent) {\n // store time scroll started, if not started already\n if (!timeStart) {\n timeStart = timeCurrent;\n }\n\n // determine time spent scrolling so far\n timeElapsed = timeCurrent - timeStart;\n\n // calculate next scroll position\n next = easing(timeElapsed, start, distance, duration);\n\n // scroll to it\n window.scrollTo(0, next);\n\n // check progress\n timeElapsed < duration ? window.requestAnimationFrame(loop) // continue scroll loop\n : done(); // scrolling is done\n }\n\n // scroll finished helper\n\n function done() {\n // account for rAF time rounding inaccuracies\n window.scrollTo(0, start + distance);\n\n // if scrolling to an element, and accessibility is enabled\n if (element && a11y) {\n // add tabindex indicating programmatic focus\n element.setAttribute('tabindex', '-1');\n\n // focus the element\n element.focus();\n }\n\n // if it exists, fire the callback\n if (typeof callback === 'function') {\n callback();\n }\n\n // reset time for next jump\n timeStart = false;\n }\n\n // API\n\n function jump(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n // resolve options, or use defaults\n duration = options.duration || 1000;\n offset = options.offset || 0;\n callback = options.callback; // \"undefined\" is a suitable default, and won't be called\n easing = options.easing || easeInOutQuad;\n a11y = options.a11y || false;\n\n // cache starting position\n start = location();\n\n // resolve target\n switch (typeof target === 'undefined' ? 'undefined' : _typeof(target)) {\n // scroll from current position\n case 'number':\n element = undefined; // no element to scroll to\n a11y = false; // make sure accessibility is off\n stop = start + target;\n break;\n\n // scroll to element (node)\n // bounding rect is relative to the viewport\n case 'object':\n element = target;\n stop = top(element);\n break;\n\n // scroll to element (selector)\n // bounding rect is relative to the viewport\n case 'string':\n element = document.querySelector(target);\n stop = top(element);\n break;\n }\n\n // resolve scroll distance, accounting for offset\n distance = stop - start + offset;\n\n // resolve duration\n switch (_typeof(options.duration)) {\n // number in ms\n case 'number':\n duration = options.duration;\n break;\n\n // function passed the distance of the scroll\n case 'function':\n duration = options.duration(distance);\n break;\n }\n\n // start the loop\n window.requestAnimationFrame(loop);\n }\n\n // expose only the jump method\n return jump;\n};\n\n// export singleton\n\nvar singleton = jumper();\n\nexport default singleton;\n","//@ts-nocheck\nimport { SelectedFilters } from '@prospects/cl-prospects/lib/hooks/useCourseSearchForm';\n\nconst persistDataLayer = (selectedFilters: SelectedFilters) => {\n const keyword = selectedFilters.keyword;\n const subjectText = selectedFilters.subject.length ? selectedFilters.subject[0].text : keyword !== '' ? keyword : '';\n const locationText = selectedFilters.location.length ? selectedFilters.location[0].text : '';\n\n const qualifications = selectedFilters.qualification.length ? selectedFilters.qualification.map(value => value.text).join() : 'All';\n const attendances = selectedFilters.attendance.length ? selectedFilters.attendance.map(value => value.text).join() : 'All';\n\n return { subjectText, locationText, qualifications, attendances };\n};\n\nexport default persistDataLayer;","//@ts-nocheck\nimport React, { FC, useCallback, useEffect, useRef } from 'react';\nimport { API_BASE_URL, Course, SearchResult, selectedCourseSessionStorageKey, toggleSavedEndPoint } from '../App';\nimport { CourseResultsSummary, CourseSearchResultItem } from '@prospects/cl-prospects';\nimport { Column, Container, Flex, getGridOffset, Heading4, Row } from '@prospects/cl-core';\nimport { ButtonPrimaryNoIcon } from '@prospects/cl-button';\nimport { NO_COURSES_FOUND } from '../constants/taxonomy';\nimport { useRecoilValue, useSetRecoilState } from 'recoil';\nimport jump from 'jump.js';\nimport { userLoggedInState } from '../atoms/userState';\nimport Axios from 'axios';\nimport { useHistory, useLocation } from 'react-router';\nimport { searchParamsToObject } from '../utils/searchParamsToObject';\nimport { __, equals, filter, has, map, omit, pipe, split } from 'ramda';\nimport { Helmet } from 'react-helmet-async';\nimport { RESULTS_PER_PAGE } from '../constants/resultsPerPage';\nimport { InfiniteData, QueryFunction, useInfiniteQuery, useMutation, useQueryClient } from 'react-query';\nimport { searchResultState } from '../atoms/searchResultState';\nimport { searchFormSubmittedState } from '../atoms/submittedState';\nimport { usePrevious } from '../hooks/usePrevious';\nimport { SelectedFilters } from '@prospects/cl-prospects/lib/hooks/useCourseSearchForm';\nimport persistDataLayer from '../utils/persistDataLayer';\n\nexport interface SearchData {\n featuredCourses: number[] | null;\n selectedSubjectText: string;\n subjectParam: string;\n page: number;\n size: number;\n searchParams: number[] | null;\n}\n\nconst splitComma = split(',');\nconst shapeFeaturedCoursesString = pipe(\n splitComma,\n filter(Boolean),\n map(parseInt)\n);\n\nconst deriveParamsFromUrl = (queryParam: string): Record => {\n const paramsObject = searchParamsToObject(queryParam);\n const decodedFeaturedCoursesFromUrl = paramsObject.featuredCourses\n ? decodeURIComponent(paramsObject.featuredCourses)\n : undefined;\n const featuredCoursesFromUrl = decodedFeaturedCoursesFromUrl\n ? shapeFeaturedCoursesString(decodedFeaturedCoursesFromUrl)\n : null;\n\n return {\n ...paramsObject,\n featuredCourses: featuredCoursesFromUrl,\n };\n};\n\nexport const fetchResults: QueryFunction = ({\n queryKey,\n pageParam,\n}) => {\n const fromUrl = deriveParamsFromUrl(window.location.href.split('?')[1]);\n const [\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _key,\n page,\n size,\n searchParams,\n featuredCourses,\n selectedSubjectText,\n subjectParam,\n ] = queryKey as [\n string,\n number,\n number,\n string,\n number[] | null,\n string,\n string\n ];\n const getKeyword = () => {\n if (selectedSubjectText) {\n return selectedSubjectText.replace(/\\+/g, '%20');\n }\n if (subjectParam && fromUrl.keyword) {\n return subjectParam.replace(/\\+/g, '%20');\n }\n return undefined;\n };\n\n return fetch(`${API_BASE_URL}/api/search-courses`, {\n method: 'post',\n credentials: 'include',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n filters: searchParams,\n page: pageParam || page,\n size: pageParam !== undefined ? RESULTS_PER_PAGE : size,\n featuredCourses:\n pageParam && pageParam >= 1\n ? fromUrl.featuredCourses\n : featuredCourses,\n keyword: getKeyword(),\n }),\n })\n .then(resp => resp.json())\n .catch(error => {\n throw new Error(error);\n });\n};\n\nexport const queryKeyName = 'searchCourses';\n\nconst updateHeaderSkipLinks = () => {\n const headerNavAccess = document.querySelector(\n '.nav-access'\n ) as HTMLElement;\n\n if (!headerNavAccess) {\n return;\n }\n\n const newItem = document.createElement('LI') as HTMLElement;\n newItem.innerHTML = \"Skip to course search results\";\n headerNavAccess.insertBefore(newItem, headerNavAccess.childNodes[2]);\n};\n\nconst updateHeaderFavouriteCount = (add: boolean) => {\n const headerFaveCountElement: HTMLElement = document\n .getElementsByClassName('btn-favourites-count')\n .item(0) as HTMLElement;\n\n if (!headerFaveCountElement) {\n return;\n }\n\n let faveCount = parseInt(headerFaveCountElement.innerText, 10) as number;\n\n headerFaveCountElement.innerText = `${add ? faveCount + 1 : faveCount - 1}`;\n};\n\nconst coursesUpdater = (id: number) => (existingResults: any) => {\n const index = existingResults.pages.findIndex(\n (page: SearchResult) =>\n page.courses.filter((course: Course) => course.courseUID === id)\n .length\n );\n if (index < 0) {\n return existingResults;\n }\n const innerIndex = existingResults.pages[index].courses.findIndex(\n (course: Course) => course.courseUID === id\n );\n if (innerIndex < 0) {\n return existingResults;\n }\n\n updateHeaderFavouriteCount(\n !existingResults.pages[index].courses[innerIndex].saved\n );\n\n return {\n ...existingResults,\n pages: [\n ...existingResults.pages.slice(0, index),\n {\n ...existingResults.pages[index],\n courses: [\n ...existingResults.pages[index].courses.slice(\n 0,\n innerIndex\n ),\n {\n ...existingResults.pages[index].courses[innerIndex],\n saved: !existingResults.pages[index].courses[innerIndex]\n .saved,\n },\n ...existingResults.pages[index].courses.slice(\n innerIndex + 1\n ),\n ],\n },\n ...existingResults.pages.slice(index + 1),\n ],\n };\n};\n\nconst jumpOptions = {\n duration: 0,\n a11y: true,\n};\n\nconst Results: FC<{\n title: string | undefined;\n searchData: SearchData;\n setSearch: any;\n selectedFilters: SelectedFilters\n}> = ({\n title,\n searchData: {\n featuredCourses,\n selectedSubjectText,\n subjectParam = '',\n page,\n size,\n searchParams,\n },\n setSearch,\n selectedFilters\n}) => {\n const dataLayer = useRef();\n const isMutation = useRef(false);\n const queryKey = [\n queryKeyName,\n page,\n size,\n searchParams,\n featuredCourses,\n selectedSubjectText,\n subjectParam,\n ];\n const searchForm = useRecoilValue(searchFormSubmittedState);\n const {\n data,\n isFetchingNextPage,\n fetchNextPage,\n hasNextPage,\n status,\n } = useInfiniteQuery(queryKey, fetchResults, {\n suspense: true,\n refetchOnWindowFocus: false,\n getNextPageParam: lastGroup => {\n const fromUrl = deriveParamsFromUrl(\n window.location.href.split('?')[1]\n );\n const currentPage =\n typeof fromUrl.page !== 'undefined'\n ? parseInt(fromUrl.page, 10)\n : 0;\n\n if (!lastGroup || !lastGroup.totalNumberOfResults) {\n return undefined;\n }\n\n const isLastPage =\n (currentPage + 1) * 20 >= lastGroup.totalNumberOfResults;\n\n if (isLastPage) {\n return undefined;\n }\n return currentPage + 1;\n },\n });\n const dataRef = useRef>();\n const location = useLocation();\n const prevLocation = usePrevious(location);\n const queryClient = useQueryClient();\n const mutation = useMutation(\n (id: number) =>\n Axios.get(`${toggleSavedEndPoint}${id}`, {\n withCredentials: true,\n }),\n {\n onMutate: async id => {\n isMutation.current = true;\n await queryClient.cancelQueries(queryKey);\n\n const previousResults = queryClient.getQueryData(queryKey);\n\n queryClient.setQueryData(queryKey, coursesUpdater(id));\n\n return { previousResults };\n },\n onError: (err, variables, context) => {\n // @ts-ignore\n queryClient.setQueryData(queryKey, context.previousResults);\n },\n }\n );\n const {\n action: historyAction,\n replace,\n location: { search: queryParam },\n } = useHistory();\n const userLoggedIn = useRecoilValue(userLoggedInState);\n const showMorePosition = useRef();\n const titleElement = useRef(null);\n const setSearchResultState = useSetRecoilState(searchResultState);\n\n const resultsRef = useCallback(\n (node: HTMLElement) => {\n if (!node) {\n return;\n }\n const queryObject = searchParamsToObject(queryParam.substring(1));\n const queryObjectHas = has(__, queryObject);\n const selectedCourse = sessionStorage.getItem(\n selectedCourseSessionStorageKey\n );\n const id = queryObject.itemId;\n\n if (\n queryObjectHas('itemId') &&\n node.getAttribute('data-testid') === id\n ) {\n const newQueryObject = omit(['itemId'], queryObject);\n const newUrl = `${new URLSearchParams(newQueryObject)}`;\n\n if (id) {\n replace({\n search: newUrl,\n });\n jump(node, jumpOptions);\n }\n }\n if (\n selectedCourse &&\n node.getAttribute(`data-testid`) === selectedCourse\n ) {\n jump(node, jumpOptions);\n sessionStorage.removeItem(selectedCourseSessionStorageKey);\n }\n },\n [queryParam, replace]\n );\n\n useEffect(() => {\n window.dataLayer = window.dataLayer || [];\n dataLayer.current = window.dataLayer;\n }, []);\n\n const isSameUrl = useCallback(() => {\n return equals(location.pathname, prevLocation?.pathname);\n }, [location.pathname, prevLocation?.pathname]);\n\n // useEffect - handle completed search\n useEffect(() => {\n const selectedFiltersTexts = persistDataLayer(selectedFilters);\n // @ts-ignore\n dataLayer.current.push({\n event: 'courseSearch',\n formType: 'Course Search',\n courseSearchResults: data?.pages[0].totalNumberOfResults,\n courseNameOrSubject: selectedFiltersTexts.subjectText,\n location: selectedFiltersTexts.locationText,\n qualification: selectedFiltersTexts.qualifications,\n attendance: selectedFiltersTexts.attendances,\n });\n\n if (\n !data ||\n !data.pages ||\n isFetchingNextPage ||\n status !== 'success' ||\n typeof showMorePosition.current === 'number' ||\n isMutation.current ||\n (equals(data, dataRef.current) && isSameUrl())\n ) {\n return;\n }\n const pageRefresh = !searchForm.searchFormSubmitted;\n const urlQueryParam = window.location.href.split('?')[1];\n const urlParamObject = searchParamsToObject(urlQueryParam);\n const featuredCourses = data.pages[0].featuredCourses;\n updateHeaderSkipLinks();\n const getPage = () => {\n if (\n (pageRefresh && !urlParamObject.page) ||\n (!pageRefresh && historyAction !== 'POP')\n ) {\n return { page: '0' };\n }\n if (pageRefresh && urlParamObject.page) {\n return null;\n }\n return null;\n };\n const newSearch = {\n ...urlParamObject,\n ...(data.pages.some(page => page.courses.length)\n ? {\n featuredCourses: featuredCourses.join(',') || '',\n ...getPage(),\n }\n : null),\n };\n const newSearchString = Object.entries(newSearch)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(\n value as string\n )}`\n )\n .join('&');\n\n if (!pageRefresh) {\n if (titleElement.current) {\n jump(titleElement.current, jumpOptions);\n }\n }\n\n if (newSearchString === urlQueryParam) {\n return;\n }\n\n replace({\n search: newSearchString,\n });\n\n setSearchResultState({\n totalNumberOfResults: data.pages[0].totalNumberOfResults,\n });\n\n setSearch(false);\n\n dataRef.current = data;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n data,\n isFetchingNextPage,\n status,\n replace,\n setSearchResultState,\n setSearch,\n size,\n searchForm.searchFormSubmitted,\n ]);\n\n // useEffect - Update the url page query param when load more is successful\n useEffect(() => {\n if (\n isFetchingNextPage === false &&\n typeof showMorePosition.current === 'number' &&\n data\n ) {\n window.scrollTo(0, showMorePosition.current);\n const paramsObject = searchParamsToObject(queryParam.substring(1));\n\n replace({\n search: `${new URLSearchParams({\n ...paramsObject,\n page: (\n parseInt(paramsObject.page || window.__page, 10) + 1\n ).toString(),\n })}`,\n });\n showMorePosition.current = undefined;\n }\n }, [isFetchingNextPage, queryParam, replace, data]);\n\n if (!data || data.pages[0].totalNumberOfResults === null) {\n return null;\n }\n\n const maxItemsOnPage = RESULTS_PER_PAGE;\n\n if (data.pages[0].totalNumberOfResults === 0) {\n title = NO_COURSES_FOUND;\n }\n\n const searchTitle = title === NO_COURSES_FOUND ? '' : title;\n\n let noOfCoursesInNextBatch =\n data.pages[0].totalNumberOfResults -\n data.pages.reduce((acc, curr) => acc + curr.courses.length, 0);\n\n if (noOfCoursesInNextBatch > maxItemsOnPage) {\n noOfCoursesInNextBatch = maxItemsOnPage;\n }\n\n const handleShowMoreClick = async () => {\n isMutation.current = false;\n showMorePosition.current = window.pageYOffset;\n\n fetchNextPage();\n };\n\n const handleToggleSave = async (id: number) => {\n if (!userLoggedIn) {\n return (window.location.href = `${API_BASE_URL}/postgraduate-courses/saveItem/courses?itemId=${id}`);\n }\n mutation.mutate(id);\n };\n\n const showMoreButtonText = `Show next ${noOfCoursesInNextBatch} match${\n noOfCoursesInNextBatch > 1 ? 'es' : ''\n }`;\n\n const handleCourseLinkClick = (id: number): void =>\n sessionStorage.setItem(selectedCourseSessionStorageKey, id.toString());\n\n return (\n
\n \n {`${\n title !== '' ? title : 'Search postgraduate courses'\n } | Ä¢¹½ÊÓƵ»ÆƬ.ac.uk`}\n \n
\n {data.pages[0].totalNumberOfResults > 0 ? (\n \n ) : (\n \n )}\n
\n {data.pages[0].totalNumberOfResults ||\n data.pages.some(page => page.courses.length) ? (\n \n \n \n
    \n {data.pages.map(page =>\n page.courses.map(\n ({\n courseUID,\n courseName,\n institutionSlug,\n institutionName,\n institutionProfile,\n departmentSlug,\n departmentName,\n departmentProfile,\n courseSlug,\n isFeatured,\n isNewFunding,\n qualifications,\n saved,\n startsJanuary,\n }) => (\n \n )\n )\n )}\n
\n \n
\n
\n ) : null}\n\n \n {hasNextPage ? (\n \n {showMoreButtonText}\n \n ) : data.pages[0].totalNumberOfResults >= maxItemsOnPage ||\n (data.pages[0].totalNumberOfResults < maxItemsOnPage &&\n data.pages.some(page => page.courses.length)) ? (\n \n No more matching courses\n \n ) : null}\n \n
\n );\n};\n\nexport default Results;\n"],"sourceRoot":""}