{"version":3,"file":"index-CBdao850.js","sources":["../../src/scripts/modules/react-modules/Listings/ProgramsAndCertificatesListing/useGetProgramsAndCertsListing.ts","../../src/scripts/modules/react-modules/Listings/ProgramsAndCertificatesListing/index.tsx"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport { GraphQLClient } from 'graphql-request';\nimport { useEffect, useState, useMemo } from 'react';\nimport {\n ProgramListingDocument,\n ProgramListingQuery,\n ProgramDetailPageOutput\n} from '../../../../../codegenGenerated/optigraphql/generated';\nimport { getEnvGQLUrl } from '../../../../helpers';\nimport { ListingParams } from '../types';\nimport { getFacetValueById } from '../utils';\n\nconst graphQLClient = new GraphQLClient(getEnvGQLUrl());\n\nexport enum ProgramsAndCertificatesFacetTypes {\n ProgramTypeFacet = 'ProgramTypeFacet',\n AreaOfStudyFacet = 'AreaOfStudyFacet',\n CollegeOrSchoolFacet = 'CollegeOrSchoolFacet',\n CampusLocationFacet = 'CampusLocationFacet',\n LocationFacet = 'LocationFacet'\n}\n\ntype ProgramDetailItem = NonNullable<ProgramDetailPageOutput['items']>[number];\n\nexport const useGetProgramsAndCertsListing = (params?: ListingParams) => {\n const [accumulatedResults, setAccumulatedResults] = useState<ProgramDetailItem[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n\n const { orderBy, pagination, searchTerm, facets } = params || {};\n\n const orderByValue = useMemo(() => {\n if (!orderBy) return {};\n if (searchTerm !== '') return { _ranking: 'SEMANTIC' };\n\n switch (orderBy) {\n case 'RELEVANCE':\n return { _ranking: 'SEMANTIC' };\n case 'ASC':\n return { StartPublish: 'ASC', _ranking: 'SEMANTIC' };\n case 'DESC':\n return { StartPublish: 'DESC', _ranking: 'SEMANTIC' };\n case 'A-Z':\n return { ProgramSortableName: 'ASC', _ranking: 'SEMANTIC' };\n default:\n return {};\n }\n }, [orderBy, searchTerm]);\n\n const queryKey = useMemo(\n () => ['programs', facets, pagination?.skip, pagination?.limit, orderBy, searchTerm],\n [facets, pagination?.skip, pagination?.limit, orderBy, searchTerm]\n );\n\n const { isLoading, error, data } = useQuery({\n queryKey,\n queryFn: async () =>\n graphQLClient.request(ProgramListingDocument, {\n orderBy: orderByValue,\n numberOfResults: pagination?.limit,\n skip: pagination?.skip,\n searchTerm: searchTerm === '' ? null : searchTerm,\n searchTermBoost: searchTerm ? `%${searchTerm}%` : null,\n programTypeFacet: facets\n ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.ProgramTypeFacet)\n : null,\n areaOfStudyFacet: facets\n ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.AreaOfStudyFacet)\n : null,\n collegeOrSchoolFacet: facets\n ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.CollegeOrSchoolFacet)\n : null,\n campusLocationFacet: facets\n ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.CampusLocationFacet)\n : null,\n locationFacet: facets\n ? getFacetValueById(facets, ProgramsAndCertificatesFacetTypes.LocationFacet)\n : null\n }) as ProgramListingQuery,\n refetchOnWindowFocus: false\n });\n\n useEffect(() => {\n if (data?.ProgramDetailPage?.items) {\n const newItems = data.ProgramDetailPage.items.filter(\n (item): item is ProgramDetailItem => item !== null\n );\n\n // Reset results if any parameter except pagination.skip has changed\n const shouldReset = !pagination?.skip || pagination.skip === 0;\n\n if (shouldReset) {\n setAccumulatedResults(newItems);\n } else {\n setAccumulatedResults((prev: ProgramDetailItem[]) => [...prev, ...newItems]);\n }\n\n // Update total count when we get new data\n const total = data.ProgramDetailPage.total;\n if (typeof total === 'number') {\n setTotalCount(total);\n }\n }\n }, [data, pagination?.skip]);\n\n return {\n status: error ? 'error' : isLoading ? 'loading' : 'success',\n error: error as Error,\n results: accumulatedResults,\n total: totalCount,\n facets: data?.ProgramDetailPage?.facets ?? {}\n };\n};\n","import React, { useEffect, useState } from 'react';\nimport {\n FilterCategoryModelFacet,\n ResourceDetailPage\n} from '../../../../../codegenGenerated/optigraphql/generated';\nimport { PaginationType } from '../../../../components/react-components/Pagination';\nimport Facets from '../Facets/Facets';\nimport FacetsMobile from '../Facets/FacetsMobile';\nimport { Listing } from '../Listing';\nimport Search from '../Search';\nimport SearchTags from '../SearchTags';\nimport {\n FacetProps,\n FacetPropsItems,\n ListingCommonProps,\n ListingTypes,\n SortOptions\n} from '../types';\nimport { transformToFacetPropsItems } from '../utils';\nimport { useGetProgramsAndCertsListing } from './useGetProgramsAndCertsListing';\nimport { FacetData } from '../Facets/FacetAccordion';\n\ninterface OwnProps extends ListingCommonProps {\n facets: string;\n filterLabelProgramType: string;\n filterLabelAreaOfStudy: string;\n filterLabelCollegeOrSchool: string;\n filterLabelLocation: string;\n filterLabelLocationOnCampusId: string;\n filterLabelLearnMore: string;\n applyLabelFallback: string;\n applyLinkFallback: string;\n certificateId: string;\n modeOfStudyLabel: string;\n programTypeLabel: string;\n degreesOfferLabel: string;\n departmentOfferLabel: string;\n schoolLabel: string;\n defaultFilter: string;\n}\n\nconst ProgramAndCertificatesListingModule = ({\n facets,\n noResultsLabel,\n clearAllLabel,\n tagsNoResultsLabel,\n searchPlaceholder,\n resultsNumberLabel,\n resultsNumber,\n mobileShowResultsLabel,\n mobileFilterNarrowLabel,\n mobileAppliedFiltersLabel,\n filterLabelProgramType,\n showAllPaginationLabel,\n filterLabelAreaOfStudy,\n filterLabelCollegeOrSchool,\n filterLabelLocation,\n filterLabelLocationOnCampusId,\n filterLabelLearnMore,\n applyLabelFallback,\n applyLinkFallback,\n certificateId,\n modeOfStudyLabel,\n programTypeLabel,\n degreesOfferLabel,\n departmentOfferLabel,\n schoolLabel,\n defaultFilter\n}: OwnProps) => {\n const [isFirstLoad, setIsFirstLoad] = useState(true);\n const [additionalProps, setAdditionalProps] = useState({});\n const [prevProgramTypeFacet, setPrevProgramTypeFacet] = useState<FacetPropsItems[]>([]);\n\n // Get URL params and validate\n const urlParams = new URLSearchParams(window.location.search);\n const searchTermUrl = urlParams.get('search-term');\n const sortUrl = urlParams.get('sort') as SortOptions;\n const skipUrl = parseInt(urlParams.get('skip') || '0');\n const limitUrl = parseInt(urlParams.get('limit') || resultsNumber);\n\n // Initialize state\n const [searchTerm, setSearchTerm] = useState(searchTermUrl || '');\n const [orderBy, setOrderBy] = useState<SortOptions>(sortUrl || SortOptions.AZ);\n const [pagination, setPagination] = useState({\n skip: skipUrl,\n limit: limitUrl,\n total: 0\n });\n\n // Parse initial facets from props\n useEffect(() => {\n setPrevProgramTypeFacet(JSON.parse(facets));\n }, [facets]);\n\n const initialFacets = [\n {\n id: 'ProgramTypeFacet',\n type: 'custom-radio',\n title: filterLabelProgramType,\n items: prevProgramTypeFacet,\n value: defaultFilter ? [defaultFilter] : null\n },\n {\n id: 'AreaOfStudyFacet',\n type: 'custom-select',\n title: filterLabelAreaOfStudy,\n items: [],\n value: null\n },\n {\n id: 'CollegeOrSchoolFacet',\n type: 'custom-select',\n title: filterLabelCollegeOrSchool,\n items: [],\n value: null\n },\n {\n id: 'CampusLocationFacet',\n type: 'custom-select',\n title: filterLabelLocationOnCampusId,\n items: [],\n value: null\n },\n {\n id: 'LocationFacet',\n type: 'custom-select',\n title: filterLabelLocation,\n items: [],\n value: null\n }\n ];\n\n const [facetsStore, setFacetsStore] = useState<FacetProps[]>(initialFacets);\n\n // Clean up URL parameters on mount and when validation changes\n useEffect(() => {\n const cleanParams: {\n sort?: SortOptions;\n skip?: number;\n limit?: number;\n searchTerm?: string;\n } = {};\n\n // Clean up invalid sort\n if (sortUrl && !Object.values(SortOptions).includes(sortUrl)) {\n cleanParams.sort = SortOptions.AZ;\n }\n\n // Clean up invalid pagination\n if (skipUrl < 0) {\n cleanParams.skip = 0;\n }\n if (limitUrl <= 0) {\n cleanParams.limit = +resultsNumber;\n }\n\n // If any parameter needs cleaning, update the URL\n if (Object.keys(cleanParams).length > 0) {\n const newUrlParams = new URLSearchParams(window.location.search);\n\n if (cleanParams.sort !== undefined) {\n cleanParams.sort === SortOptions.AZ\n ? newUrlParams.delete('sort')\n : newUrlParams.set('sort', cleanParams.sort);\n }\n if (cleanParams.skip !== undefined) {\n cleanParams.skip > 0\n ? newUrlParams.set('skip', cleanParams.skip.toString())\n : newUrlParams.delete('skip');\n }\n if (cleanParams.limit !== undefined) {\n cleanParams.limit === +resultsNumber\n ? newUrlParams.delete('limit')\n : newUrlParams.set('limit', cleanParams.limit.toString());\n }\n\n window.history.replaceState(\n {},\n '',\n `${window.location.pathname}${newUrlParams.toString() ? '?' + newUrlParams.toString() : ''}`\n );\n }\n }, [sortUrl, skipUrl, limitUrl, resultsNumber]);\n\n // Update URL when state changes\n const updateUrl = (params: {\n searchTerm?: string;\n sort?: SortOptions;\n skip?: number;\n limit?: number;\n }) => {\n const urlParams = new URLSearchParams(window.location.search);\n\n if (params.searchTerm !== undefined) {\n params.searchTerm\n ? urlParams.set('search-term', params.searchTerm)\n : urlParams.delete('search-term');\n }\n if (params.sort !== undefined) {\n params.sort !== SortOptions.AZ\n ? urlParams.set('sort', params.sort)\n : urlParams.delete('sort');\n }\n if (params.skip !== undefined) {\n params.skip > 0 ? urlParams.set('skip', params.skip.toString()) : urlParams.delete('skip');\n }\n if (params.limit !== undefined) {\n params.limit !== +resultsNumber\n ? urlParams.set('limit', params.limit.toString())\n : urlParams.delete('limit');\n }\n\n window.history.replaceState(\n {},\n '',\n `${window.location.pathname}${urlParams.toString() ? '?' + urlParams.toString() : ''}`\n );\n };\n\n // Handlers\n const handleSearchTermChange = (newSearchTerm: string) => {\n setSearchTerm(newSearchTerm);\n setPagination(prev => ({ ...prev, skip: 0 }));\n updateUrl({ searchTerm: newSearchTerm, skip: 0 });\n };\n\n const handleFacetsChange = (newFacets: FacetProps[]) => {\n setFacetsStore(newFacets);\n setPagination(prev => ({ ...prev, skip: 0 }));\n\n // Update URL with facet selections\n const urlParams = new URLSearchParams(window.location.search);\n\n // Clear existing facet params\n Array.from(urlParams.keys()).forEach(key => {\n if (key.endsWith('-facet')) {\n urlParams.delete(key);\n }\n });\n\n // Add new facet params\n newFacets.forEach(facet => {\n if (facet.value && Array.isArray(facet.value) && facet.value.length > 0) {\n urlParams.set(`${facet.id.toLowerCase()}-facet`, facet.value.join(','));\n }\n });\n\n updateUrl({\n searchTerm: searchTerm,\n sort: orderBy,\n skip: 0,\n limit: pagination.limit\n });\n\n window.history.replaceState(\n {},\n '',\n `${window.location.pathname}${urlParams.toString() ? '?' + urlParams.toString() : ''}`\n );\n };\n\n const handleOrderByChange = (newOrderBy: string) => {\n setOrderBy(newOrderBy as SortOptions);\n setPagination(prev => ({ ...prev, skip: 0 }));\n updateUrl({ sort: newOrderBy as SortOptions, skip: 0 });\n };\n\n const handlePaginationChange = (newPagination: typeof pagination) => {\n setPagination(newPagination);\n updateUrl({ skip: newPagination.skip, limit: newPagination.limit });\n };\n\n const {\n status,\n results,\n error,\n facets: facetsData,\n total\n } = useGetProgramsAndCertsListing({\n pagination: isFirstLoad ? { skip: 0, limit: 0, total: 0 } : pagination,\n orderBy: !isFirstLoad ? orderBy : undefined,\n searchTerm: !isFirstLoad ? searchTerm : '',\n facets: !isFirstLoad ? facetsStore : []\n });\n\n // Update total when it changes\n useEffect(() => {\n if (total !== pagination.total) {\n setPagination(prev => ({ ...prev, total }));\n }\n }, [total]);\n\n useEffect(() => {\n if (!facetsData || !isFirstLoad) return;\n\n let hasChanges = false;\n let campusLocationFacetItems: FacetPropsItems[] = [];\n\n const updatedFacets = facetsStore.map(facet => {\n const facetData = facetsData[facet.id as keyof typeof facetsData];\n if (facetData) {\n const items = transformToFacetPropsItems(facetData as FilterCategoryModelFacet);\n\n // Get value from URL params if available\n const urlValue = new URLSearchParams(window.location.search).get(\n `${facet.id.toLowerCase()}-facet`\n );\n let validatedValue = urlValue ? urlValue.split(',') : facet.value;\n\n // Validate existing selections against new items\n if (validatedValue && Array.isArray(validatedValue)) {\n const validValues = validatedValue.filter(val =>\n items.some(item => item.id === val || item.value === val)\n );\n validatedValue = validValues.length ? validValues : null;\n }\n\n if (JSON.stringify(facet.items) !== JSON.stringify(items)) {\n hasChanges = true;\n return { ...facet, items, value: validatedValue };\n }\n return { ...facet, value: validatedValue };\n }\n return facet;\n });\n\n if (hasChanges) {\n const locationFacet = updatedFacets.find(facet => facet.id === 'LocationFacet');\n const campusLocationFacet = updatedFacets.find(facet => facet.id === 'CampusLocationFacet');\n const programTypeFacet = updatedFacets.find(facet => facet.id === 'ProgramTypeFacet');\n\n if (campusLocationFacet) {\n campusLocationFacetItems = [\n ...campusLocationFacet.items.map(item => ({\n ...item,\n id: `on-campus-${item.id}`\n }))\n ] as FacetPropsItems[];\n }\n\n if (locationFacet) {\n const { items } = locationFacet;\n let onCampusLabel: string | undefined;\n const onCampusIdLabel = filterLabelLocationOnCampusId.split('|');\n\n locationFacet.items = items.reduce(\n (acc, item) => {\n if (item.id === onCampusIdLabel[0]) {\n onCampusLabel = item.value;\n } else {\n acc.push(item);\n }\n return acc;\n },\n [] as typeof items\n );\n\n const shouldDisplayOnCampus = campusLocationFacetItems.length > 0 && !onCampusLabel;\n\n if (onCampusLabel || shouldDisplayOnCampus) {\n campusLocationFacetItems.unshift({\n id: 'on-campus-all',\n value: onCampusLabel ? onCampusLabel : onCampusIdLabel[1],\n count: 0\n });\n }\n }\n\n if (programTypeFacet) {\n programTypeFacet.items = prevProgramTypeFacet;\n if (defaultFilter && !programTypeFacet.value) {\n programTypeFacet.value = [defaultFilter];\n }\n }\n\n if (locationFacet) {\n locationFacet.items = [...campusLocationFacetItems, ...locationFacet.items];\n }\n\n setFacetsStore(updatedFacets);\n setIsFirstLoad(false);\n }\n }, [facetsData, isFirstLoad, prevProgramTypeFacet, defaultFilter, filterLabelLocationOnCampusId]);\n\n // Update additional props\n useEffect(() => {\n if (facetsStore && facetsStore.length > 0) {\n const programTypeFacet = facetsStore.find(facet => facet.id === 'ProgramTypeFacet');\n let selected = '';\n if (\n programTypeFacet?.value &&\n Array.isArray(programTypeFacet.value) &&\n programTypeFacet.value.length > 0\n ) {\n const selectedId = programTypeFacet.value[0];\n const filteredItems = programTypeFacet.items.filter(item => item.id === selectedId);\n selected = filteredItems.length > 0 ? filteredItems[0].value : '';\n }\n setAdditionalProps(prev => ({\n ...prev,\n listingHeadingTitle: `${selected} ${filterLabelProgramType}`,\n learnMore: filterLabelLearnMore,\n applyLabelFallback: applyLabelFallback,\n applyLinkFallback: applyLinkFallback,\n certificateId: certificateId\n }));\n }\n }, [\n facetsStore,\n filterLabelProgramType,\n filterLabelLearnMore,\n applyLabelFallback,\n applyLinkFallback,\n certificateId\n ]);\n\n return (\n <>\n <div className=\"listing-heading\">\n <div className=\"listing-heading__single-row\">\n <Search\n searchPlaceholder={searchPlaceholder}\n setStoreSearchTerm={handleSearchTermChange}\n searchTerm={searchTerm}\n pagination={pagination}\n setPagination={handlePaginationChange}\n ariaLabel=\"Enter Keyword for Programs and Certificates\"\n />\n </div>\n\n <div className=\"listing__facets listing__facets--programs\">\n {facetsStore.map(({ id, type, items, title, value }) => {\n let selectedCount = 0;\n if (id === 'LocationFacet') {\n const campusLocationFacet = facetsStore.find(\n facet => facet.id === 'CampusLocationFacet'\n );\n\n const locationFacetValuesLength = value?.length || 0;\n const campusLocationFacetValuesLength = campusLocationFacet?.value?.length || 0;\n\n selectedCount = locationFacetValuesLength + campusLocationFacetValuesLength;\n } else {\n selectedCount = value?.length || 0;\n }\n\n return (\n <Facets\n key={id}\n id={id}\n type={type}\n items={items}\n title={title}\n isMobile={false}\n facets={facetsStore}\n setFilters={handleFacetsChange}\n pagination={pagination}\n setPagination={handlePaginationChange}\n selectedCount={selectedCount}\n listingType={ListingTypes.PROGRAMS_CERTS_LISTING}\n defaultValue={defaultFilter}\n />\n );\n })}\n </div>\n\n <div className=\"listing-heading__results\">\n <SearchTags\n resultsNumberLabel={resultsNumberLabel}\n tagsNoResultsLabel={tagsNoResultsLabel}\n resultsNumber={results ? results.length : 0}\n pagination={pagination}\n facets={facetsStore}\n setFilters={handleFacetsChange}\n clearAllLabel={clearAllLabel}\n setPagination={handlePaginationChange}\n defaultFilter={defaultFilter}\n isFirstLoad={isFirstLoad}\n />\n </div>\n </div>\n\n <Listing\n id=\"programs-certs-listing\"\n noResultsLabel={noResultsLabel}\n resultsNumber={resultsNumber}\n status={status}\n results={results as ResourceDetailPage[]}\n error={error}\n searchTerm={searchTerm}\n imgFallback=\"\"\n showAllPaginationLabel={showAllPaginationLabel}\n setPagination={handlePaginationChange}\n pagination={pagination}\n paginationType={PaginationType.ShowMore}\n additionalProps={additionalProps}\n modeOfStudyLabel={modeOfStudyLabel}\n programTypeLabel={programTypeLabel}\n degreesOfferLabel={degreesOfferLabel}\n departmentOfferLabel={departmentOfferLabel}\n schoolLabel={schoolLabel}\n listingType={ListingTypes.PROGRAMS_CERTS_LISTING}\n />\n\n <FacetsMobile\n facetsData={facetsData as FacetData}\n mobileFilterNarrowLabel={mobileFilterNarrowLabel}\n mobileAppliedFiltersLabel={mobileAppliedFiltersLabel}\n mobileShowResultsLabel={mobileShowResultsLabel}\n facets={facetsStore}\n setFilters={handleFacetsChange}\n setOrderBy={handleOrderByChange}\n orderBy={orderBy}\n pagination={pagination}\n sortOptions={null}\n defaultSortValue={SortOptions.AZ}\n clearAllLabel={clearAllLabel}\n setPagination={handlePaginationChange}\n listingType={ListingTypes.PROGRAMS_CERTS_LISTING}\n searchPlaceholder={searchPlaceholder}\n setSearchTerm={handleSearchTermChange}\n searchTerm={searchTerm}\n defaultFilter={defaultFilter}\n isFirstLoad={isFirstLoad}\n />\n </>\n );\n};\n\nexport default ProgramAndCertificatesListingModule;\n"],"names":["graphQLClient","GraphQLClient","getEnvGQLUrl","useGetProgramsAndCertsListing","params","accumulatedResults","setAccumulatedResults","useState","totalCount","setTotalCount","orderBy","pagination","searchTerm","facets","orderByValue","useMemo","queryKey","isLoading","error","data","useQuery","ProgramListingDocument","getFacetValueById","useEffect","_a","newItems","item","shouldReset","prev","total","ProgramAndCertificatesListingModule","noResultsLabel","clearAllLabel","tagsNoResultsLabel","searchPlaceholder","resultsNumberLabel","resultsNumber","mobileShowResultsLabel","mobileFilterNarrowLabel","mobileAppliedFiltersLabel","filterLabelProgramType","showAllPaginationLabel","filterLabelAreaOfStudy","filterLabelCollegeOrSchool","filterLabelLocation","filterLabelLocationOnCampusId","filterLabelLearnMore","applyLabelFallback","applyLinkFallback","certificateId","modeOfStudyLabel","programTypeLabel","degreesOfferLabel","departmentOfferLabel","schoolLabel","defaultFilter","isFirstLoad","setIsFirstLoad","additionalProps","setAdditionalProps","prevProgramTypeFacet","setPrevProgramTypeFacet","urlParams","searchTermUrl","sortUrl","skipUrl","limitUrl","setSearchTerm","setOrderBy","SortOptions","setPagination","initialFacets","facetsStore","setFacetsStore","cleanParams","newUrlParams","updateUrl","handleSearchTermChange","newSearchTerm","handleFacetsChange","newFacets","key","facet","handleOrderByChange","newOrderBy","handlePaginationChange","newPagination","status","results","facetsData","hasChanges","campusLocationFacetItems","updatedFacets","facetData","items","transformToFacetPropsItems","urlValue","validatedValue","validValues","val","locationFacet","campusLocationFacet","programTypeFacet","onCampusLabel","onCampusIdLabel","acc","shouldDisplayOnCampus","selected","selectedId","filteredItems","React","Search","id","type","title","value","selectedCount","locationFacetValuesLength","campusLocationFacetValuesLength","Facets","ListingTypes","SearchTags","Listing","PaginationType","FacetsMobile"],"mappings":"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"}