construct-hub-webapp 0.1.273 → 0.1.277
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/asset-manifest.json +42 -42
- package/build/index.html +1 -1
- package/build/service-worker.js +1 -1
- package/build/static/js/{0.ef7efb94.chunk.js → 0.01076643.chunk.js} +2 -2
- package/build/static/js/{0.ef7efb94.chunk.js.map → 0.01076643.chunk.js.map} +1 -1
- package/build/static/js/{1.dde8e10e.chunk.js → 1.7efe2b06.chunk.js} +2 -2
- package/build/static/js/{1.dde8e10e.chunk.js.map → 1.7efe2b06.chunk.js.map} +1 -1
- package/build/static/js/10.e14dabc8.chunk.js +2 -0
- package/build/static/js/10.e14dabc8.chunk.js.map +1 -0
- package/build/static/js/{11.f85e5735.chunk.js → 11.4fa20ae6.chunk.js} +2 -2
- package/build/static/js/{11.f85e5735.chunk.js.map → 11.4fa20ae6.chunk.js.map} +1 -1
- package/build/static/js/{12.b2a97d43.chunk.js → 12.1f0d32c6.chunk.js} +2 -2
- package/build/static/js/{12.b2a97d43.chunk.js.map → 12.1f0d32c6.chunk.js.map} +1 -1
- package/build/static/js/{13.0f1dd29b.chunk.js → 13.a1af9f29.chunk.js} +2 -2
- package/build/static/js/{13.0f1dd29b.chunk.js.map → 13.a1af9f29.chunk.js.map} +1 -1
- package/build/static/js/{14.41ee632d.chunk.js → 14.a40917a3.chunk.js} +2 -2
- package/build/static/js/{14.41ee632d.chunk.js.map → 14.a40917a3.chunk.js.map} +1 -1
- package/build/static/js/{15.1b55dcee.chunk.js → 15.f6946442.chunk.js} +2 -2
- package/build/static/js/{15.1b55dcee.chunk.js.map → 15.f6946442.chunk.js.map} +1 -1
- package/build/static/js/{16.ae6e9b0c.chunk.js → 16.ad041986.chunk.js} +3 -3
- package/build/static/js/{16.ae6e9b0c.chunk.js.LICENSE.txt → 16.ad041986.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/{16.ae6e9b0c.chunk.js.map → 16.ad041986.chunk.js.map} +1 -1
- package/build/static/js/{17.818b672f.chunk.js → 17.cf0c8971.chunk.js} +2 -2
- package/build/static/js/{17.818b672f.chunk.js.map → 17.cf0c8971.chunk.js.map} +1 -1
- package/build/static/js/{2.99a11206.chunk.js → 2.b57d6cff.chunk.js} +2 -2
- package/build/static/js/{2.99a11206.chunk.js.map → 2.b57d6cff.chunk.js.map} +1 -1
- package/build/static/js/{3.a206d785.chunk.js → 3.2a95eb1f.chunk.js} +2 -2
- package/build/static/js/{3.a206d785.chunk.js.map → 3.2a95eb1f.chunk.js.map} +1 -1
- package/build/static/js/6.f20d821e.chunk.js +3 -0
- package/build/static/js/{6.0778b462.chunk.js.LICENSE.txt → 6.f20d821e.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/{6.0778b462.chunk.js.map → 6.f20d821e.chunk.js.map} +1 -1
- package/build/static/js/7.3ec0b9d4.chunk.js +3 -0
- package/build/static/js/{7.a2a41136.chunk.js.LICENSE.txt → 7.3ec0b9d4.chunk.js.LICENSE.txt} +0 -0
- package/build/static/js/7.3ec0b9d4.chunk.js.map +1 -0
- package/build/static/js/{8.d6dd5a26.chunk.js → 8.39dec1af.chunk.js} +2 -2
- package/build/static/js/{8.d6dd5a26.chunk.js.map → 8.39dec1af.chunk.js.map} +1 -1
- package/build/static/js/9.a5bd98cc.chunk.js +2 -0
- package/build/static/js/9.a5bd98cc.chunk.js.map +1 -0
- package/build/static/js/{main.5e31651c.chunk.js → main.a9b1d223.chunk.js} +2 -2
- package/build/static/js/main.a9b1d223.chunk.js.map +1 -0
- package/build/static/js/runtime-main.94050b24.js +2 -0
- package/build/static/js/{runtime-main.5c3bc050.js.map → runtime-main.94050b24.js.map} +1 -1
- package/package.json +5 -5
- package/build/static/js/10.850a3972.chunk.js +0 -2
- package/build/static/js/10.850a3972.chunk.js.map +0 -1
- package/build/static/js/6.0778b462.chunk.js +0 -3
- package/build/static/js/7.a2a41136.chunk.js +0 -3
- package/build/static/js/7.a2a41136.chunk.js.map +0 -1
- package/build/static/js/9.440de16a.chunk.js +0 -2
- package/build/static/js/9.440de16a.chunk.js.map +0 -1
- package/build/static/js/main.5e31651c.chunk.js.map +0 -1
- package/build/static/js/runtime-main.5c3bc050.js +0 -2
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["constants/pageInfo.ts","components/Page/Page.tsx","components/LanguageSupportTooltip/LanguageSupportTooltip.tsx","components/Time/Time.tsx","views/SearchResults/components/ShowingDetails.tsx","views/SearchResults/constants.ts","components/PackageCard/constants.ts","components/PackageCard/testIds.ts","components/PackageCard/Details.tsx","components/PackageCard/Heading.tsx","components/PackageLanguages/PackageLanguages.tsx","components/PackageCard/Languages.tsx","components/PackageCard/WideCard.tsx","components/PackageCard/PackageCard.tsx","components/PackageList/PackageList.tsx","components/PackageList/WideCardList.tsx","views/SearchResults/components/ArrowButton.tsx","views/SearchResults/components/GoToPage.tsx","views/SearchResults/components/NextPage.tsx","views/SearchResults/components/PageControls.tsx","../../../src/link-box.tsx","../../../src/ArrowForward.tsx","../../../src/ChevronLeft.tsx","../../../src/Question.tsx","views/SearchRedesign/Filter.tsx","views/SearchRedesign/AuthorFilter.tsx","views/SearchRedesign/util.ts","views/SearchRedesign/SearchState.tsx","views/SearchRedesign/CDKFilter.tsx","views/SearchRedesign/LanguageFilter.tsx","views/SearchRedesign/FilterPanel.tsx","views/SearchRedesign/SortedBy.tsx","views/SearchRedesign/SearchResults.tsx","views/SearchRedesign/SearchRedesign.tsx"],"names":["pageInfo","home","event","name","faq","packageProfile","search","siteTerms","notFound","page","pageType","Page","children","meta","pageName","trackPageView","usePageView","useEffect","suffix","title","description","formattedTitle","Helmet","process","content","charSet","property","LanguageSupportTooltip","language","TEMP_SUPPORTED_LANGUAGES","has","hasArrow","label","LANGUAGE_NAME_MAP","placement","Time","forwardRef","ref","date","formatString","format","boxProps","as","dateTime","toISOString","displayName","Em","color","fontWeight","ShowingDetails","limit","offset","count","filtered","first","last","LIMIT","PackageCardType","testIds","createTestIds","Detail","dataTestid","value","fontSize","Details","useLanguage","currentLanguage","usePackageCard","author","metadata","version","authorName","published","Date","NavLink","to","getSearchPath","query","Heading","comment","constructFramework","cdkType","cdkVersion","majorVersion","Link","getPackagePath","align","CDKTYPE_RENDER_MAP","alt","h","mr","src","imgsrc","w","zIndex","lineHeight","noOfLines","sizes","sm","md","lg","PackageLanguages","isRounded","languages","packageName","size","targets","Object","keys","entries","LANGUAGE_RENDER_MAP","sort","left","right","LANGUAGES","indexOf","map","lang","info","isSupportedByLibrary","Language","TypeScript","includes","isSupportedByConstructHub","Icon","icon","borderRadius","opacity","Languages","pkg","WideCard","_hover","bg","border","wideContainer","gap","p","templateColumns","base","templateRows","spacing","direction","alignSelf","PackageCardContext","createContext","useContext","PackageCard","variant","Wide","Provider","listViews","items","PackageList","memo","cardView","loading","View","ArrowButton","getPageUrl","props","borderColor","colorScheme","mx","undefined","disabled","GoToPage","pageLimit","useState","toString","inputValue","setInputValue","push","useHistory","onSubmit","e","preventDefault","parseInt","max","min","onChange","target","textAlign","type","ml","btnProps","rightIcon","ArrowForward","NextPage","nextPageUrl","PageControls","nextOffset","prevOffset","alignItems","pt","colStart","justifySelf","justify","py","ChevronLeftIcon","ChevronRightIcon","LinkOverlay","className","cx","rel","isExternal","__css","position","cursor","display","top","width","height","LinkBox","ArrowForwardIcon","createIcon","d","QuestionIcon","Filter","hint","options","checkedValues","values","onValueChange","getOnChange","px","isChecked","isTruncated","AuthorFilter","authors","setAuthors","filter","a","toNum","val","result","SearchStateContext","useSearchState","state","Error","SearchStateProvider","langQuery","queryParams","useQueryParams","get","QUERY_PARAMS","OFFSET","decodeURIComponent","SEARCH_QUERY","split","SORT","CDK_TYPE","cdkMajorParam","CDK_MAJOR","cdkMajor","searchAPI","useCatalogSearch","defaultCdkMajor","defaultCdkType","defaultLanguages","defaultQuery","defaultSort","setQuery","CDKFilter","setCdkType","setCdkMajor","useSearchContext","cdkOptions","useMemo","cdkTypes","constructFrameworks","reduce","opts","pkgCount","CDKTYPE_NAME_MAP","length","majorsOptions","majorVersions","b","cdk","major","majorNum","languageOptions","key","LanguageFilter","setLanguages","l","FilterPanel","Card","boxShadow","maxH","maxW","minW","overflow","SORT_RENDER_MAP","CatalogSearchSort","NameAsc","NameDesc","PublishDateAsc","PublishDateDesc","SortedBy","setSort","selected","Button","pl","pr","ChevronDown","onClick","SearchResults","isFirstRender","useRef","onSearch","useCatalogResults","results","getUrl","params","q","current","CatalogSearch","mt","pb","SearchRedesign"],"mappings":"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","file":"static/js/10.850a3972.chunk.js","sourcesContent":["export const pageInfo = {\n home: {\n event: {\n name: \"Home Load\",\n },\n },\n faq: {\n event: {\n name: \"Frequently Asked Questions Load\",\n },\n },\n packageProfile: {\n event: {\n name: \"Package Profile Load\",\n },\n },\n search: {\n event: {\n name: \"Search Load\",\n },\n },\n siteTerms: {\n event: {\n name: \"Site Terms Load\",\n },\n },\n notFound: {\n page: {\n pageType: \"errorPage\",\n },\n event: {\n name: \"404 Page Load\",\n },\n },\n} as const;\n","import { FunctionComponent, useEffect } from \"react\";\nimport { Helmet } from \"react-helmet\";\nimport { pageInfo } from \"../../constants/pageInfo\";\nimport { usePageView } from \"../../contexts/Analytics\";\n\nexport interface PageProps {\n pageName: keyof typeof pageInfo;\n meta: {\n suffix?: boolean;\n title: string;\n description: string;\n };\n}\n\nexport const Page: FunctionComponent<PageProps> = ({\n children,\n meta,\n pageName,\n}) => {\n const trackPageView = usePageView(pageInfo[pageName]);\n\n useEffect(() => {\n trackPageView();\n }, [trackPageView]);\n\n const { suffix = true, title, description } = meta;\n const formattedTitle = suffix ? `${title} - Construct Hub` : title;\n\n return (\n <>\n <Helmet>\n {process.env.NODE_ENV === \"development\" && (\n <meta\n content=\"default-src 'self' 'unsafe-inline' https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; connect-src 'self' https://*.shortbread.aws.dev ws://localhost:3000 https://*.awsstatic.com https://amazonwebservices.d2.sc.omtrdc.net; frame-src 'none'; img-src 'self' https://* http://*.omtrdc.net; object-src 'none'; style-src 'self' 'unsafe-inline';\"\n httpEquiv=\"Content-Security-Policy\"\n />\n )}\n\n <meta content=\"width=device-width, initial-scale=1\" name=\"viewport\" />\n <meta charSet=\"utf-8\" />\n\n <title>{formattedTitle}</title>\n <meta content={formattedTitle} property=\"og:title\" />\n <meta content={formattedTitle} name=\"twitter:title\" />\n <meta content=\"summary\" name=\"twitter:card\" />\n\n <meta content={description} name=\"description\" />\n <meta content={description} property=\"og:description\" />\n <meta content={description} name=\"twitter:description\" />\n </Helmet>\n {children}\n </>\n );\n};\n","import { Tooltip } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\n\nexport interface LanguageSupportTooltipProps {\n language: Language;\n}\n\nexport const LanguageSupportTooltip: FunctionComponent<LanguageSupportTooltipProps> =\n ({ children, language }) => {\n const isSupported = TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (isSupported) {\n return <>{children}</>;\n }\n\n return (\n <Tooltip\n hasArrow\n label={`Documentation support for ${LANGUAGE_NAME_MAP[language]} is coming soon!`}\n placement=\"top-start\"\n >\n <span>{children}</span>\n </Tooltip>\n );\n };\n","import { Box, BoxProps, forwardRef } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\n\nexport interface TimeOptions {\n date: Date;\n format: string;\n}\n\nexport interface TimeProps extends BoxProps, TimeOptions {}\n\nexport const Time = forwardRef<TimeProps, \"time\">(\n ({ date, format: formatString, ...boxProps }, ref) => {\n return (\n <Box as=\"time\" dateTime={date.toISOString()} ref={ref} {...boxProps}>\n {format(date, formatString)}\n </Box>\n );\n }\n);\n\nTime.displayName = \"Time\";\n","import { Text } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\n\nexport interface ShowingDetailsProps {\n limit: number;\n offset: number;\n count: number;\n filtered: boolean;\n}\n\nconst Em: FunctionComponent = ({ children }) => (\n <Text as=\"em\" color=\"blue.500\" fontWeight=\"bold\">\n {children}\n </Text>\n);\n\nexport const ShowingDetails: FunctionComponent<ShowingDetailsProps> = ({\n limit,\n offset,\n count,\n filtered,\n}) => {\n const first = limit * offset;\n const last = first + limit;\n return (\n <Text>\n Displaying{\" \"}\n <Em>\n {count ? first + 1 : count} - {last > count ? count : last}\n </Em>{\" \"}\n of <Em>{count}</Em> {filtered ? \"search results\" : \"constructs\"}.\n </Text>\n );\n};\n","import type { QueryParamKey } from \"../../constants/url\";\n\nexport const LIMITS = [25, 50, 75, 100];\nexport const LIMIT = LIMITS[0];\n\nexport type SearchQueryParam = Extract<QueryParamKey, \"offset\" | \"q\">;\n","export enum PackageCardType {\n Wide = \"wide\",\n}\n","import { createTestIds } from \"../../util/createTestIds\";\n\nconst testIds = createTestIds(\"packageCard\", [\n \"author\",\n \"description\",\n \"languages\",\n \"published\",\n \"title\",\n \"version\",\n \"comment\",\n \"wideContainer\",\n] as const);\n\nexport default testIds;\n","import { Text } from \"@chakra-ui/react\";\nimport type { FunctionComponent, ReactChild } from \"react\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getSearchPath } from \"../../util/url\";\nimport { NavLink } from \"../NavLink\";\nimport { Time } from \"../Time\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\ninterface DetailProps {\n \"data-testid\": string;\n label: string;\n value: ReactChild;\n}\n\nconst Detail: FunctionComponent<DetailProps> = ({\n \"data-testid\": dataTestid,\n label,\n value,\n}) => (\n <Text data-testid={dataTestid} fontSize=\"xs\">\n <strong>{label}</strong> {value}\n </Text>\n);\n\nexport const Details: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n\n const {\n author,\n metadata: { date },\n version,\n } = usePackageCard();\n\n const authorName = typeof author === \"string\" ? author : author.name;\n\n return (\n <>\n <Detail data-testid={testIds.version} label=\"Version\" value={version} />\n <Detail\n data-testid={testIds.published}\n label=\"Published\"\n value={\n <Time date={new Date(date)} fontSize=\"xs\" format=\"MMM dd, yyyy\" />\n }\n />\n <Detail\n data-testid={testIds.author}\n label=\"Author\"\n value={\n <NavLink\n to={getSearchPath({\n query: `\"${authorName}\"`,\n language: currentLanguage,\n })}\n >\n {authorName}\n </NavLink>\n }\n />\n </>\n );\n};\n","import {\n Flex,\n Image,\n Heading as ChakraHeading,\n LinkOverlay,\n Text,\n Tooltip,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport { CDKTYPE_RENDER_MAP } from \"../../constants/constructs\";\nimport { useLanguage } from \"../../hooks/useLanguage\";\nimport { getPackagePath } from \"../../util/url\";\nimport { usePackageCard } from \"./PackageCard\";\nimport testIds from \"./testIds\";\n\nexport const Heading: FunctionComponent = () => {\n const [currentLanguage] = useLanguage();\n const {\n comment,\n description,\n metadata: { constructFramework },\n name,\n version,\n } = usePackageCard();\n\n const cdkType = constructFramework?.name;\n const cdkVersion = constructFramework?.majorVersion;\n\n return (\n <>\n <LinkOverlay\n as={Link}\n to={getPackagePath({\n name,\n version,\n language: currentLanguage,\n })}\n >\n <Flex align=\"center\">\n {cdkType && (\n <Tooltip\n hasArrow\n label={\n CDKTYPE_RENDER_MAP[cdkType].name +\n (cdkVersion ? ` v${cdkVersion}` : \"\")\n }\n placement=\"top\"\n >\n <Image\n alt={`${CDKTYPE_RENDER_MAP[cdkType].name} icon`}\n h={5}\n mr={2}\n src={CDKTYPE_RENDER_MAP[cdkType].imgsrc}\n w={5}\n zIndex={1}\n />\n </Tooltip>\n )}\n <ChakraHeading\n as=\"h3\"\n color=\"blue.800\"\n data-testid={testIds.title}\n fontSize=\"md\"\n fontWeight=\"bold\"\n >\n {name}\n </ChakraHeading>\n </Flex>\n </LinkOverlay>\n <Text\n data-testid={testIds.description}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n {description || \"No description available.\"}\n </Text>\n {comment && (\n <Text\n data-testid={testIds.comment}\n fontSize=\"md\"\n lineHeight=\"tall\"\n noOfLines={4}\n >\n <Text\n as=\"span\"\n color=\"blue.500\"\n fontSize=\"md\"\n fontWeight=\"bold\"\n lineHeight=\"tall\"\n >\n Editor's note:{\" \"}\n </Text>\n {comment}\n </Text>\n )}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\nimport {\n Language,\n LANGUAGES,\n LANGUAGE_RENDER_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { getPackagePath } from \"../../util/url\";\nimport { LanguageSupportTooltip } from \"../LanguageSupportTooltip\";\n\nconst sizes = {\n sm: 5,\n md: 6,\n lg: 8,\n};\n\nexport interface PackageLanguagesProps {\n isRounded?: boolean;\n languages: Partial<Record<Language, unknown>>;\n name: string;\n size?: \"sm\" | \"md\" | \"lg\";\n version: string;\n}\n\nexport const PackageLanguages: FunctionComponent<PackageLanguagesProps> = ({\n isRounded = false,\n languages,\n name: packageName,\n size = \"md\",\n version,\n}) => {\n const targets = Object.keys(languages ?? {}) as Language[];\n return (\n <>\n {Object.entries(LANGUAGE_RENDER_MAP)\n // Ensure entries are always sorted in a stable way\n .sort(\n ([left], [right]) =>\n LANGUAGES.indexOf(left as Language) -\n LANGUAGES.indexOf(right as Language)\n )\n .map(([lang, info]) => {\n const language = lang as Language;\n\n const isSupportedByLibrary =\n language === Language.TypeScript || targets.includes(language);\n\n const isSupportedByConstructHub =\n language === Language.TypeScript || // TypeScript is always supported\n // Otherwise, the language must be supported by ConstructHub\n TEMP_SUPPORTED_LANGUAGES.has(language);\n\n if (!isSupportedByLibrary) return null;\n\n const { name, icon: Icon } = info;\n\n const icon = (\n <Icon\n aria-label={`Supports ${name}`}\n borderRadius={isRounded ? \"50%\" : 0}\n h={sizes[size]}\n opacity={isSupportedByConstructHub ? 1 : 0.2}\n w={sizes[size]}\n />\n );\n\n return (\n <LanguageSupportTooltip key={language} language={language}>\n {isSupportedByConstructHub ? (\n <Link\n aria-label={`View package docs for ${language}`}\n to={getPackagePath({ name: packageName, version, language })}\n >\n {icon}\n </Link>\n ) : (\n icon\n )}\n </LanguageSupportTooltip>\n );\n })}\n </>\n );\n};\n","import type { FunctionComponent } from \"react\";\nimport { PackageLanguages } from \"../PackageLanguages\";\nimport { usePackageCard } from \"./PackageCard\";\n\nexport const Languages: FunctionComponent = () => {\n const pkg = usePackageCard();\n return <PackageLanguages {...pkg} size=\"sm\" />;\n};\n","import { Grid, Stack, LinkBox } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Details } from \"./Details\";\nimport { Heading } from \"./Heading\";\nimport { Languages } from \"./Languages\";\nimport testIds from \"./testIds\";\n\nexport const WideCard: FunctionComponent = () => {\n return (\n <LinkBox\n _hover={{\n \"> article\": {\n bg: \"gray.50\",\n },\n }}\n >\n <Grid\n as=\"article\"\n bg=\"white\"\n border=\"base\"\n borderRadius=\"sm\"\n color=\"gray.600\"\n data-testid={testIds.wideContainer}\n gap={5}\n p={5}\n templateColumns={{ base: \"1fr\", md: \"2fr 1fr\" }}\n templateRows={{ base: \"auto\", md: \"1fr\" }}\n w=\"100%\"\n >\n {/* Name + Desc */}\n <Stack spacing={2}>\n <Heading />\n\n <Stack direction=\"row\" spacing={1}>\n <Languages />\n </Stack>\n </Stack>\n\n <Stack\n alignSelf=\"center\"\n data-testid={testIds.languages}\n fontSize=\"xs\"\n spacing={1}\n >\n <Details />\n </Stack>\n </Grid>\n </LinkBox>\n );\n};\n","import { createContext, FunctionComponent, useContext } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"./constants\";\nimport { WideCard } from \"./WideCard\";\n\nexport interface PackageCardProps {\n pkg: CatalogPackage;\n variant?: PackageCardType;\n}\n\nconst PackageCardContext = createContext<CatalogPackage | null>(null);\n\nexport const usePackageCard = () => useContext(PackageCardContext)!;\n\nexport const PackageCard: FunctionComponent<PackageCardProps> = ({\n pkg,\n variant = PackageCardType.Wide,\n}) => {\n return (\n <PackageCardContext.Provider value={pkg}>\n {variant === PackageCardType.Wide && <WideCard />}\n </PackageCardContext.Provider>\n );\n};\n","import { Center, Spinner } from \"@chakra-ui/react\";\nimport { FunctionComponent, memo } from \"react\";\nimport { CatalogPackage } from \"../../api/package/packages\";\nimport { PackageCardType } from \"../PackageCard\";\nimport { WideCardList } from \"./WideCardList\";\n\nconst listViews = {\n [PackageCardType.Wide]: WideCardList,\n};\n\nexport interface PackageListViewProps {\n items: CatalogPackage[];\n}\n\nexport interface PackageListProps extends Partial<PackageListViewProps> {\n cardView?: PackageCardType;\n loading?: boolean;\n title?: string;\n}\n\nexport const PackageList: FunctionComponent<PackageListProps> = memo(\n ({\n cardView = PackageCardType.Wide,\n items,\n loading,\n // title,\n }) => {\n if (loading || !items) {\n return (\n <Center>\n <Spinner size=\"xl\" />\n </Center>\n );\n }\n\n const View = listViews[cardView];\n\n return <View items={items} />;\n }\n);\n\nPackageList.displayName = \"PackageList\";\n","import { Stack } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { PackageCard, PackageCardType } from \"../PackageCard\";\nimport { PackageListViewProps } from \"./PackageList\";\n\nexport const WideCardList: FunctionComponent<PackageListViewProps> = ({\n items,\n}) => {\n return (\n <Stack spacing={4}>\n {items.map((pkg) => (\n <PackageCard\n key={`${pkg.name}-${pkg.version}`}\n pkg={pkg}\n variant={PackageCardType.Wide}\n />\n ))}\n </Stack>\n );\n};\n","import { IconButton, IconProps } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface ArrowButtonProps {\n icon: FunctionComponent<IconProps>;\n offset?: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const ArrowButton: FunctionComponent<ArrowButtonProps> = ({\n icon: Icon,\n offset,\n getPageUrl,\n}) => {\n const label = `Page ${offset} link`;\n\n const props = {\n \"aria-label\": label,\n borderRadius: \"md\",\n borderColor: \"blue.500\",\n colorScheme: \"blue\",\n icon: <Icon color=\"blue.500\" h={5} w={5} />,\n mx: 2,\n h: 10,\n w: 10,\n variant: \"outline\",\n };\n\n if (offset !== undefined) {\n return <IconButton {...props} as={Link} to={getPageUrl({ offset })} />;\n }\n\n return <IconButton {...props} disabled />;\n};\n","import { Flex, Input, Text } from \"@chakra-ui/react\";\nimport {\n FormEventHandler,\n FunctionComponent,\n SyntheticEvent,\n useEffect,\n useState,\n} from \"react\";\nimport { useHistory } from \"react-router-dom\";\n\nexport interface GoToPageProps {\n pageLimit: number;\n offset: number;\n getPageUrl: (params: { offset: number }) => string;\n}\n\nexport const GoToPage: FunctionComponent<GoToPageProps> = ({\n pageLimit,\n offset,\n getPageUrl,\n}) => {\n const [inputValue, setInputValue] = useState((offset + 1).toString());\n const { push } = useHistory();\n\n useEffect(() => {\n setInputValue((offset + 1).toString());\n }, [offset]);\n\n const onInputChange = (e: SyntheticEvent<HTMLInputElement>) => {\n e.preventDefault();\n setInputValue((e.target as HTMLInputElement).value);\n };\n\n const onSubmit: FormEventHandler<HTMLInputElement> = (e) => {\n e.preventDefault();\n push(getPageUrl({ offset: parseInt(inputValue) - 1 }));\n };\n\n return (\n <Flex align=\"center\" as=\"form\" mx={2} onSubmit={onSubmit}>\n <Input\n colorScheme=\"blue\"\n h={10}\n max={pageLimit + 1}\n min={1}\n name=\"page\"\n onChange={onInputChange}\n p={0}\n textAlign=\"center\"\n type=\"number\"\n value={inputValue}\n w={10}\n />\n <Text ml={2} w=\"max-content\">\n of {pageLimit + 1}\n </Text>\n </Flex>\n );\n};\n","import { ArrowForwardIcon } from \"@chakra-ui/icons\";\nimport { Button } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { Link } from \"react-router-dom\";\n\nexport interface NextPageProps {\n nextPageUrl?: string;\n}\n\nconst btnProps = {\n children: \"Next Page\",\n colorScheme: \"blue\",\n rightIcon: <ArrowForwardIcon color=\"white\" />,\n};\n\nexport const NextPage: FunctionComponent<NextPageProps> = ({ nextPageUrl }) => {\n if (!nextPageUrl) {\n return <Button {...btnProps} disabled />;\n }\n\n return <Button {...btnProps} as={Link} to={nextPageUrl} />;\n};\n","import { ChevronLeftIcon, ChevronRightIcon } from \"@chakra-ui/icons\";\nimport { Flex, Grid, GridItem } from \"@chakra-ui/react\";\nimport type { FunctionComponent } from \"react\";\nimport { ArrowButton } from \"./ArrowButton\";\nimport { GoToPage } from \"./GoToPage\";\nimport { NextPage } from \"./NextPage\";\n\nexport interface PageControlsProps {\n limit: number;\n offset: number;\n pageLimit: number;\n getPageUrl: (params: { offset?: number }) => string;\n}\n\nexport const PageControls: FunctionComponent<PageControlsProps> = ({\n offset,\n pageLimit,\n getPageUrl,\n}) => {\n const nextOffset = offset < pageLimit ? offset + 1 : undefined;\n const prevOffset = offset > 0 ? offset - 1 : undefined;\n\n return (\n <Grid\n alignItems=\"center\"\n pt={4}\n templateColumns=\"repeat(3, 1fr)\"\n templateRows=\"1fr\"\n >\n <GridItem colStart={2} justifySelf=\"center\">\n <NextPage\n nextPageUrl={\n nextOffset ? getPageUrl({ offset: nextOffset }) : undefined\n }\n />\n </GridItem>\n <GridItem colStart={3} justifySelf=\"end\">\n <Flex align=\"center\" justify=\"center\" py={4}>\n <GoToPage\n getPageUrl={getPageUrl}\n offset={offset}\n pageLimit={pageLimit}\n />\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronLeftIcon}\n offset={prevOffset}\n />\n <ArrowButton\n getPageUrl={getPageUrl}\n icon={ChevronRightIcon}\n offset={nextOffset}\n />\n </Flex>\n </GridItem>\n </Grid>\n );\n};\n","import { chakra, forwardRef, HTMLChakraProps } from \"@chakra-ui/system\"\nimport { cx } from \"@chakra-ui/utils\"\nimport * as React from \"react\"\n\nexport interface LinkOverlayProps extends HTMLChakraProps<\"a\"> {\n /**\n * If `true`, the link will open in new tab\n */\n isExternal?: boolean\n}\n\nexport const LinkOverlay = forwardRef<LinkOverlayProps, \"a\">((props, ref) => {\n const { isExternal, target, rel, className, ...rest } = props\n return (\n <chakra.a\n {...rest}\n ref={ref}\n className={cx(\"chakra-linkbox__overlay\", className)}\n rel={isExternal ? \"noopener noreferrer\" : rel}\n target={isExternal ? \"_blank\" : target}\n __css={{\n position: \"static\",\n \"&::before\": {\n content: \"''\",\n cursor: \"inherit\",\n display: \"block\",\n position: \"absolute\",\n top: 0,\n left: 0,\n zIndex: 0,\n width: \"100%\",\n height: \"100%\",\n },\n }}\n />\n )\n})\n\nexport interface LinkBoxProps extends HTMLChakraProps<\"div\"> {}\n\n/**\n * `LinkBox` is used to wrap content areas within a link while ensuring semantic html\n *\n * @see Docs https://chakra-ui.com/docs/navigation/link-overlay\n * @see Resources https://www.sarasoueidan.com/blog/nested-links\n */\nexport const LinkBox = forwardRef<LinkBoxProps, \"div\">((props, ref) => {\n const { className, ...rest } = props\n\n return (\n <chakra.div\n ref={ref}\n position=\"relative\"\n {...rest}\n className={cx(\"chakra-linkbox\", className)}\n __css={{\n /* Elevate the links and abbreviations up */\n \"a[href]:not(.chakra-linkbox__overlay), abbr[title]\": {\n position: \"relative\",\n zIndex: 1,\n },\n }}\n />\n )\n})\n","import { createIcon } from \"@chakra-ui/icon\"\n\nexport const ArrowForwardIcon = createIcon({\n d: \"M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z\",\n displayName: \"ArrowForwardIcon\",\n})\n","import { createIcon } from \"@chakra-ui/icon\"\n\nexport const ChevronLeftIcon = createIcon({\n d: \"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\",\n displayName: \"ChevronLeftIcon\",\n})\n","import { createIcon } from \"@chakra-ui/icon\"\n\nexport const QuestionIcon = createIcon({\n d:\n \"M12,0A12,12,0,1,0,24,12,12.013,12.013,0,0,0,12,0Zm0,19a1.5,1.5,0,1,1,1.5-1.5A1.5,1.5,0,0,1,12,19Zm1.6-6.08a1,1,0,0,0-.6.917,1,1,0,1,1-2,0,3,3,0,0,1,1.8-2.75A2,2,0,1,0,10,9.255a1,1,0,1,1-2,0,4,4,0,1,1,5.6,3.666Z\",\n displayName: \"QuestionIcon\",\n})\n","import { QuestionIcon } from \"@chakra-ui/icons\";\nimport {\n Checkbox,\n Flex,\n Heading,\n Stack,\n Text,\n Popover,\n IconButton,\n PopoverHeader,\n PopoverTrigger,\n PopoverBody,\n PopoverCloseButton,\n PopoverArrow,\n PopoverContent,\n} from \"@chakra-ui/react\";\nimport type { FunctionComponent, ReactChild } from \"react\";\n\nexport interface FilterProps {\n hint?: ReactChild;\n name: string;\n options: {\n display: string;\n value: string;\n }[];\n values: string[];\n onValueChange: (value: string) => void;\n}\n\nexport const Filter: FunctionComponent<FilterProps> = ({\n hint,\n name,\n options,\n values: checkedValues,\n onValueChange,\n}) => {\n const getOnChange = (value: string) => () => {\n onValueChange(value);\n };\n\n return (\n <Stack spacing={2}>\n <Flex align=\"center\" justify=\"space-between\">\n <Heading as=\"h4\" size=\"sm\" w=\"max-content\">\n {name}\n </Heading>\n {hint ? (\n <Popover placement=\"top-end\">\n <PopoverTrigger>\n <IconButton\n aria-label={`Hint: ${name}`}\n icon={<QuestionIcon h={4} w={4} />}\n ml={2}\n px={0}\n py={0}\n size=\"sm\"\n variant=\"ghost\"\n />\n </PopoverTrigger>\n <PopoverContent fontSize=\"sm\">\n <PopoverArrow />\n <PopoverCloseButton />\n <PopoverHeader>Hint: {name}</PopoverHeader>\n <PopoverBody>\n <Text>{hint}</Text>\n </PopoverBody>\n </PopoverContent>\n </Popover>\n ) : null}\n </Flex>\n {options.map(({ display, value }) => (\n <Checkbox\n isChecked={checkedValues.includes(value)}\n key={value}\n onChange={getOnChange(value)}\n >\n <Text color=\"gray.600\" fontSize=\"sm\" isTruncated>\n {display}\n </Text>\n </Checkbox>\n ))}\n </Stack>\n );\n};\n","import { FunctionComponent, useState } from \"react\";\nimport { Filter } from \"./Filter\";\n\nexport const AuthorFilter: FunctionComponent = () => {\n const [authors, setAuthors] = useState<string[]>([]);\n\n const onAuthorsChange = (author: string) => {\n setAuthors(\n authors.includes(author)\n ? authors.filter((a) => a !== author)\n : [...authors, author]\n );\n };\n\n return (\n <Filter\n name=\"Author\"\n onValueChange={onAuthorsChange}\n options={[\n {\n display: \"Community\",\n value: \"community\",\n },\n {\n display: \"AWS\",\n value: \"aws\",\n },\n ]}\n values={authors}\n />\n );\n};\n","import { Language } from \"../../constants/languages\";\n\nexport const toNum = (val: string) => {\n const result = parseInt(val);\n\n if (`${result}` === \"NaN\") {\n return 0;\n }\n\n return result;\n};\n\nexport const parseLangs = (langQuery: string | null) => {\n if (!langQuery) return [];\n\n const langs = decodeURIComponent(langQuery).split(\",\");\n return langs as Language[];\n};\n","/**\n * @fileoverview Exposes page-level state and setters to all components in the new SearchResults View.\n */\nimport { createContext, FunctionComponent, useContext, useEffect } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { CDKType } from \"../../constants/constructs\";\nimport { QUERY_PARAMS } from \"../../constants/url\";\nimport {\n UseCatalogSearchReturn,\n useCatalogSearch,\n} from \"../../hooks/useCatalogSearch\";\nimport { useQueryParams } from \"../../hooks/useQueryParams\";\nimport { LIMIT } from \"../SearchResults/constants\";\nimport { parseLangs, toNum } from \"./util\";\n\nexport interface SearchState {\n limit: number;\n offset: number;\n query: string;\n searchAPI: UseCatalogSearchReturn;\n}\n\nconst SearchStateContext = createContext<SearchState | undefined>(undefined);\n\n/**\n * A hook to access Search Page specific state. This can only be in descendants of the new Search Page\n * and will otherwise throw an error.\n */\nexport const useSearchState = () => {\n const state = useContext(SearchStateContext);\n\n if (!state) {\n throw new Error(\n `This hook must be called in a child of <SearchStateProvider />`\n );\n }\n\n return state;\n};\n\nexport const SearchStateProvider: FunctionComponent = ({ children }) => {\n const queryParams = useQueryParams();\n\n const offset = toNum(queryParams.get(QUERY_PARAMS.OFFSET) ?? \"0\");\n\n const query = decodeURIComponent(\n queryParams.get(QUERY_PARAMS.SEARCH_QUERY) ?? \"\"\n );\n\n const languages = parseLangs(queryParams.get(QUERY_PARAMS.LANGUAGES));\n\n const sort = (queryParams.get(QUERY_PARAMS.SORT) ?? undefined) as\n | CatalogSearchSort\n | undefined;\n\n const cdkType =\n (queryParams.get(QUERY_PARAMS.CDK_TYPE) as CDKType) ?? undefined;\n\n const cdkMajorParam = queryParams.get(QUERY_PARAMS.CDK_MAJOR);\n const cdkMajor = cdkMajorParam ? toNum(cdkMajorParam) : undefined;\n\n const searchAPI = useCatalogSearch({\n defaultCdkMajor: cdkMajor,\n defaultCdkType: cdkType,\n defaultLanguages: languages,\n defaultQuery: query,\n defaultSort: sort,\n });\n\n useEffect(() => {\n if (query !== searchAPI.query) {\n searchAPI.setQuery(query);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n return (\n <SearchStateContext.Provider\n value={{\n limit: LIMIT,\n offset,\n query,\n searchAPI,\n }}\n >\n {children}\n </SearchStateContext.Provider>\n );\n};\n","import { FunctionComponent, useMemo } from \"react\";\nimport { CatalogConstructFrameworkMeta } from \"../../api/catalog-search\";\nimport { CDKType, CDKTYPE_NAME_MAP } from \"../../constants/constructs\";\nimport { useSearchContext } from \"../../contexts/Search\";\nimport { Filter } from \"./Filter\";\nimport { useSearchState } from \"./SearchState\";\n\ntype CDKOptions = Partial<{\n [key in CDKType]: CatalogConstructFrameworkMeta & {\n display: string;\n value: key;\n };\n}>;\n\nexport const CDKFilter: FunctionComponent = () => {\n const { cdkType, setCdkType, cdkMajor, setCdkMajor } =\n useSearchState().searchAPI;\n const searchAPI = useSearchContext()!;\n\n // Options with less than one package will be omitted\n const cdkOptions = useMemo(() => {\n const cdkTypes = searchAPI.constructFrameworks;\n const options = Object.entries(cdkTypes).reduce((opts, [name, meta]) => {\n if (meta.pkgCount < 1) {\n return opts;\n }\n\n return {\n ...opts,\n [name]: {\n display: CDKTYPE_NAME_MAP[name as CDKType],\n value: name,\n ...meta,\n },\n };\n }, {});\n\n return Object.keys(options).length ? (options as CDKOptions) : undefined;\n }, [searchAPI]);\n\n const majorsOptions = useMemo(() => {\n if (!cdkOptions || !cdkType) return undefined;\n const majorVersions = cdkOptions[cdkType]?.majorVersions;\n\n if (!majorVersions) return undefined;\n\n return [...majorVersions]\n .sort((a, b) => a - b)\n .map((value) => ({\n value: value.toString(),\n display: `${CDKTYPE_NAME_MAP[cdkType]} v${value}`,\n }));\n }, [cdkOptions, cdkType]);\n\n if (!cdkOptions) {\n return null;\n }\n\n const onCdkTypeChange = (type: string) => {\n const cdk = type as CDKType;\n setCdkMajor(undefined);\n setCdkType(cdk === cdkType ? undefined : cdk);\n };\n\n const onCdkMajorChange = (major: string) => {\n const majorNum = parseInt(major, 10);\n\n setCdkMajor(majorNum === cdkMajor ? undefined : majorNum);\n };\n\n return (\n <>\n <Filter\n hint=\"Constructs support distinct output types: AWS CDK libraries output Cloudformation Templates, CDK8s libraries output Kubernetes manifests, and CDKtf libraries output Terraform Configuration. The Construct Hub attempts to detect the output type of each library, but results are not guaranteed to be completely accurate.\"\n name=\"CDK Type\"\n onValueChange={onCdkTypeChange}\n options={Object.values(cdkOptions)}\n values={cdkType ? [cdkType] : []}\n />\n {/* No point in showing major versions if only a single one is available */}\n {!!(majorsOptions && majorsOptions.length > 1) && (\n <Filter\n hint={`Allows you to filter by a major version of your selected CDK Type: (${\n CDKTYPE_NAME_MAP[cdkType!]\n })`}\n name=\"CDK Major Version\"\n onValueChange={onCdkMajorChange}\n options={majorsOptions}\n values={cdkMajor ? [cdkMajor.toString()] : []}\n />\n )}\n </>\n );\n};\n","import { FunctionComponent } from \"react\";\nimport {\n Language,\n LANGUAGE_NAME_MAP,\n TEMP_SUPPORTED_LANGUAGES,\n} from \"../../constants/languages\";\nimport { Filter } from \"./Filter\";\nimport { useSearchState } from \"./SearchState\";\n\nconst languageOptions = Object.entries(LANGUAGE_NAME_MAP)\n .filter(([key]) => TEMP_SUPPORTED_LANGUAGES.has(key as Language))\n .map(([key, value]) => ({\n display: value,\n value: key,\n }));\n\nexport const LanguageFilter: FunctionComponent = () => {\n const { languages, setLanguages } = useSearchState().searchAPI;\n\n const onLanguagesChange = (lang: string) => {\n const language = lang as Language;\n\n setLanguages(\n languages.includes(language)\n ? languages.filter((l) => l !== language)\n : [...languages, language]\n );\n };\n\n return (\n <Filter\n hint=\"Select one or more programming languages to filter by. Results will match at least one of the selected languages. If no languages are selected, results will not be filtered by langauges.\"\n name=\"Programming Language\"\n onValueChange={onLanguagesChange}\n options={languageOptions}\n values={languages}\n />\n );\n};\n","import { Heading, Stack } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Card } from \"../../components/Card\";\nimport { AuthorFilter } from \"./AuthorFilter\";\nimport { CDKFilter } from \"./CDKFilter\";\nimport { LanguageFilter } from \"./LanguageFilter\";\n\nexport interface FilterPanelProps {}\n\nexport const FilterPanel: FunctionComponent<FilterPanelProps> = () => {\n return (\n <Card\n borderRadius=\"none\"\n boxShadow=\"none\"\n maxH=\"full\"\n maxW=\"368px\"\n minW=\"100%\"\n overflow=\"hidden auto\"\n p={4}\n >\n <Stack color=\"blue.800\" spacing={6}>\n <Heading as=\"h3\" size=\"sm\">\n Filters\n </Heading>\n <CDKFilter />\n <LanguageFilter />\n <AuthorFilter />\n </Stack>\n </Card>\n );\n};\n","import { ChevronDownIcon } from \"@chakra-ui/icons\";\nimport {\n Flex,\n Text,\n Menu,\n MenuButton,\n MenuList,\n MenuItem,\n Button,\n} from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { CatalogSearchSort } from \"../../api/catalog-search/constants\";\nimport { useSearchState } from \"./SearchState\";\n\nconst SORT_RENDER_MAP = {\n [CatalogSearchSort.NameAsc]: \"A-Z\",\n [CatalogSearchSort.NameDesc]: \"Z-A\",\n [CatalogSearchSort.PublishDateAsc]: \"Oldest first\",\n [CatalogSearchSort.PublishDateDesc]: \"Newest first\",\n};\n\nexport const SortedBy: FunctionComponent = () => {\n const { searchAPI } = useSearchState();\n const { sort, setSort } = searchAPI;\n\n const selected = sort ? SORT_RENDER_MAP[sort] : \"Relevance\";\n\n return (\n <Flex align=\"center\">\n <Text>Sorted by</Text>\n <Menu>\n <MenuButton\n as={Button}\n color=\"blue.500\"\n ml={2}\n pl={2} // For some reason, the px shorthand doesn't work on this Button\n pr={2}\n py={1}\n rightIcon={<ChevronDownIcon />}\n variant=\"link\"\n >\n {selected}\n </MenuButton>\n <MenuList zIndex=\"sticky\">\n <MenuItem key=\"Relevance\" onClick={() => setSort(undefined)}>\n Relevance\n </MenuItem>\n {Object.entries(SORT_RENDER_MAP).map(([value, display]) => (\n <MenuItem\n key={value}\n onClick={() => setSort(value as CatalogSearchSort)}\n >\n {display}\n </MenuItem>\n ))}\n </MenuList>\n </Menu>\n </Flex>\n );\n};\n","import { Box, Divider, Flex } from \"@chakra-ui/react\";\nimport { FunctionComponent, useEffect, useRef } from \"react\";\nimport { useHistory } from \"react-router-dom\";\nimport { CatalogSearch } from \"../../components/CatalogSearch\";\nimport { PackageList } from \"../../components/PackageList\";\nimport { Page } from \"../../components/Page\";\nimport { useCatalogResults } from \"../../hooks/useCatalogResults\";\nimport { getSearchPath } from \"../../util/url\";\nimport { PageControls } from \"../SearchResults/components/PageControls\";\nimport { ShowingDetails } from \"../SearchResults/components/ShowingDetails\";\nimport { SearchQueryParam } from \"../SearchResults/constants\";\nimport { useSearchState } from \"./SearchState\";\nimport { SortedBy } from \"./SortedBy\";\n\nexport const SearchResults: FunctionComponent = () => {\n const isFirstRender = useRef(true);\n const { push } = useHistory();\n\n const { query, searchAPI, offset, limit } = useSearchState();\n const { languages, sort, cdkType, cdkMajor, onSearch } = searchAPI;\n\n const { page, pageLimit, results } = useCatalogResults({\n offset,\n limit,\n query,\n languages,\n cdkMajor,\n cdkType,\n sort,\n });\n\n const getUrl = (\n params: Partial<{ [key in SearchQueryParam]: number | string }>\n ) => {\n return getSearchPath({\n cdkMajor,\n cdkType,\n query: (params.q ?? query) as string,\n languages,\n sort,\n offset: params.offset ?? offset,\n });\n };\n\n useEffect(() => {\n // If the query has results but the page has nothing to show...\n if (results.length && (offset < 0 || offset > pageLimit)) {\n // Handle an out of bounds offset\n if (offset < 0) {\n push(getUrl({ offset: 0 }));\n } else {\n // Offset is too large, just take last page\n push(getUrl({ offset: pageLimit }));\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [results, offset, pageLimit]);\n\n // Reset offset and update url when filters & sort change\n // We want to avoid doing this on first render / when a user directly navigates to a search URL\n // so we keep a ref to prevent this\n useEffect(() => {\n if (isFirstRender.current) {\n isFirstRender.current = false;\n } else {\n onSearch();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sort, languages, cdkType, cdkMajor]);\n\n return (\n <Page\n meta={{\n title: query || \"Search\",\n description: query\n ? `${results.length} results for ${query} at Construct Hub`\n : \"Search reusable components for your cloud application\",\n }}\n pageName=\"search\"\n >\n <Flex direction=\"column\" maxW=\"100%\">\n <Box px={4}>\n <CatalogSearch {...searchAPI} />\n <Divider mt={4} />\n </Box>\n <Box p={4}>\n <Flex justify=\"space-between\" pb={4}>\n <ShowingDetails\n count={results.length}\n filtered={!!query}\n limit={limit}\n offset={offset}\n />\n <SortedBy />\n </Flex>\n <PackageList items={page} />\n <PageControls\n getPageUrl={getUrl}\n limit={limit}\n offset={offset}\n pageLimit={pageLimit}\n />\n </Box>\n </Flex>\n </Page>\n );\n};\n","import { Grid } from \"@chakra-ui/react\";\nimport { FunctionComponent } from \"react\";\nimport { Page } from \"../../components/Page\";\nimport { FilterPanel } from \"./FilterPanel\";\nimport { SearchResults } from \"./SearchResults\";\nimport { SearchStateProvider } from \"./SearchState\";\n\nexport const SearchRedesign: FunctionComponent = () => {\n return (\n <SearchStateProvider>\n <Page\n meta={{\n title: \"Search - Construct Hub\",\n description: \"This is a placeholder\",\n }}\n pageName=\"search\"\n >\n <Grid\n gap={4}\n h=\"full\"\n maxW=\"100%\"\n p={6}\n templateColumns=\"auto 1fr\"\n templateRows=\"1fr\"\n >\n {/* Filter Panel */}\n <FilterPanel />\n {/* Results, Info, and Controls */}\n\n <SearchResults />\n </Grid>\n </Page>\n </SearchStateProvider>\n );\n};\n"],"sourceRoot":""}
|