import { ArrowDownIcon, ArrowLongDownIcon, ArrowLongUpIcon, ClockIcon, StarIcon, } from '@heroicons/react/24/outline'; import { MagnifyingGlassIcon } from '@heroicons/react/24/solid'; import { PluginCard, SectionHeading } from '@nx/nx-dev/ui-common'; import { useState } from 'react'; interface Plugin { description: string; name: string; url: string; isOfficial: boolean; lastPublishedDate?: string; npmDownloads?: string; githubStars?: string; nxVersion?: string; } type OrderByStatus = | 'lastPublishDate' | 'npmDownloads' | 'githubStars' | 'nxVersion' | undefined; interface Modifiers { term: string; officialStatus: 'official' | 'community' | undefined; minimumDownloads: number | undefined; minimumStars: number | undefined; minimumNxVersion: string | undefined; orderBy: OrderByStatus; orderDirection: 'ASC' | 'DESC'; } export function PluginDirectory({ pluginList, }: { pluginList: Plugin[]; }): JSX.Element { const [modifiers, setModifiers] = useState({ term: '', officialStatus: undefined, minimumDownloads: undefined, minimumStars: undefined, minimumNxVersion: undefined, orderBy: undefined, orderDirection: 'ASC', }); function setOrderBy(status: OrderByStatus) { if (modifiers.orderBy === status) { setModifiers({ ...modifiers, orderDirection: modifiers.orderDirection === 'ASC' ? 'DESC' : 'ASC', }); } else { setModifiers({ ...modifiers, orderBy: status, }); } } return (
Nx Plugins Registry
setModifiers({ ...modifiers, term: event.target.value }) } type="search" />
Order by:
{pluginList .filter((plugin) => !!modifiers.term ? plugin.name .toLowerCase() .includes(modifiers.term.toLowerCase()) || plugin.description .toLowerCase() .includes(modifiers.term.toLowerCase()) : true ) .sort((a, b) => { if (modifiers.orderBy === 'lastPublishDate') { return ( (modifiers.orderDirection === 'ASC' ? 1 : -1) * (new Date(a.lastPublishedDate || '').getTime() - new Date(b.lastPublishedDate || '').getTime()) ); } else if (modifiers.orderBy === 'npmDownloads') { return ( (modifiers.orderDirection === 'ASC' ? 1 : -1) * (Number.parseInt(a.npmDownloads || '0') - Number.parseInt(b.npmDownloads || '0')) ); } else if (modifiers.orderBy === 'githubStars') { return ( (modifiers.orderDirection === 'ASC' ? 1 : -1) * (Number.parseInt(a.githubStars || '0') - Number.parseInt(b.githubStars || '0')) ); } else if (modifiers.orderBy === 'nxVersion') { const versionValueMap: Record = { unknown: 0, '12': 12, '13': 13, '14': 14, '15': 15, '16': 16, '17': 17, '18': 18, '>= 15': 17, '>= 14': 16, '>= 13': 15, official: 1000, }; function getValueFromVersion(version: string = 'unknown') { const mapKey = Object.keys(versionValueMap).find((key) => version.startsWith(key) ) || 'unknown'; return versionValueMap[mapKey]; } return ( (modifiers.orderDirection === 'ASC' ? 1 : -1) * (getValueFromVersion(a.nxVersion) - getValueFromVersion(b.nxVersion)) ); } return 0; }) .map((plugin) => ( ))}
); }