import { FunctionComponent, useMemo } from "react"; import { RadioFilter } from "./RadioFilter"; import testIds from "./testIds"; import { useCdkMajor, useCdkType } from "./useSearchParam"; import { useUpdateSearchParam } from "./useUpdateSearchParam"; import { CatalogConstructFrameworkMeta } from "../../api/catalog-search"; import { CDKType, CDKTYPE_NAME_MAP } from "../../constants/constructs"; import { useSearchContext } from "../../contexts/Search"; type CDKOptions = Partial<{ [key in CDKType]: CatalogConstructFrameworkMeta & { display: string; value: key; }; }>; export const CDKFilter: FunctionComponent = () => { const cdkType = useCdkType(); const cdkMajor = useCdkMajor(); const updateSearch = useUpdateSearchParam(); const searchAPI = useSearchContext()!; // Options with less than one package will be omitted const cdkOptions = useMemo(() => { const cdkTypes = searchAPI.constructFrameworks; const options = Object.entries(cdkTypes).reduce((opts, [name, meta]) => { if (meta.pkgCount < 1) { return opts; } return { ...opts, [name]: { display: CDKTYPE_NAME_MAP[name as CDKType], value: name, ...meta, }, }; }, {}); return Object.keys(options).length ? (options as CDKOptions) : undefined; }, [searchAPI]); const majorsOptions = useMemo(() => { if (!cdkOptions || !cdkType) return undefined; const majorVersions = cdkOptions[cdkType]?.majorVersions; if (!majorVersions) return undefined; return [...majorVersions] .sort((a, b) => a - b) .map((value) => ({ value: value.toString(), display: `${CDKTYPE_NAME_MAP[cdkType]} v${value}`, })); }, [cdkOptions, cdkType]); if (!cdkOptions) { return null; } const onCdkTypeChange = (type: string) => { const cdk = type as CDKType; updateSearch({ cdkType: type ? cdk : undefined, cdkMajor: undefined }); }; const onCdkMajorChange = (major: string) => { let majorNum: number | undefined = undefined; if (major) { majorNum = parseInt(major, 10); } updateSearch({ cdkMajor: majorNum }); }; return ( <> {/* No point in showing major versions if only a single one is available */} {!!(majorsOptions && majorsOptions.length > 1) && ( )} ); };