diff --git a/.gitignore b/.gitignore index d9787d87b..543a3e40e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .vscode .env +.idea # Jan inference error.log @@ -35,4 +36,4 @@ extensions/*-extension/bin/vulkaninfo # Turborepo -.turbo \ No newline at end of file +.turbo diff --git a/web/screens/ExploreModels/ExploreModelList/index.tsx b/web/screens/ExploreModels/ExploreModelList/index.tsx index ddd474b53..c0c71669e 100644 --- a/web/screens/ExploreModels/ExploreModelList/index.tsx +++ b/web/screens/ExploreModels/ExploreModelList/index.tsx @@ -1,50 +1,46 @@ +import { useMemo } from 'react' + import { Model } from '@janhq/core' +import { useAtomValue } from 'jotai' + import ExploreModelItem from '@/screens/ExploreModels/ExploreModelItem' +import { downloadedModelsAtom } from '@/helpers/atoms/Model.atom' + type Props = { models: Model[] } const ExploreModelList: React.FC = ({ models }) => { - const takenModelIds: string[] = [] - const featuredModels = models - .filter((m) => { + const downloadedModels = useAtomValue(downloadedModelsAtom) + const sortedModels: Model[] = useMemo(() => { + const featuredModels: Model[] = [] + const remoteModels: Model[] = [] + const localModels: Model[] = [] + const remainingModels: Model[] = [] + models.forEach((m) => { if (m.metadata?.tags?.includes('Featured')) { - takenModelIds.push(m.id) - return m + featuredModels.push(m) + } else if (m.format === 'api') { + remoteModels.push(m) + } else if (downloadedModels.map((m) => m.id).includes(m.id)) { + localModels.push(m) + } else { + remainingModels.push(m) } }) - .sort((m1, m2) => m1.metadata.size - m2.metadata.size) - - const recommendedModels = models - .filter((m) => { - if (m.metadata?.tags?.includes('Recommended')) { - takenModelIds.push(m.id) - return m - } - }) - .sort((m1, m2) => m1.metadata.size - m2.metadata.size) - - const openAiModels = models - .filter((m) => { - if (m.engine === 'openai') { - takenModelIds.push(m.id) - return m - } - }) - .sort((m1: Model, m2: Model) => m1.name.localeCompare(m2.name)) - - const remainingModels = models - .filter((m) => !takenModelIds.includes(m.id)) - .sort((m1, m2) => m1.metadata.size - m2.metadata.size) - - const sortedModels: Model[] = [ - ...featuredModels, - ...recommendedModels, - ...openAiModels, - ...remainingModels, - ] + featuredModels.sort((m1, m2) => m1.name.localeCompare(m2.name)) + remoteModels.sort((m1, m2) => m1.name.localeCompare(m2.name)) + localModels.sort((m1, m2) => m1.name.localeCompare(m2.name)) + remainingModels.sort((m1, m2) => m1.name.localeCompare(m2.name)) + return [ + ...featuredModels, + ...remoteModels, + ...localModels, + ...remainingModels, + ] + }, [models, downloadedModels]) return (