import React, { useMemo } from 'react' import { formatDownloadPercentage, toGigabytes } from '@/_utils/converter' import Image from 'next/image' import { Product } from '@/_models/Product' import useDownloadModel from '@/_hooks/useDownloadModel' import { modelDownloadStateAtom } from '@/_helpers/atoms/DownloadState.atom' import { atom, useAtomValue } from 'jotai' import { ModelVersion } from '@/_models/ModelVersion' import { useGetDownloadedModels } from '@/_hooks/useGetDownloadedModels' import SimpleTag from '../SimpleTag' import { RamRequired, UsecaseTag } from '../SimpleTag/TagType' type Props = { model: Product modelVersion: ModelVersion isRecommended: boolean } const ModelVersionItem: React.FC = ({ model, modelVersion, isRecommended, }) => { const { downloadModel } = useDownloadModel() const { downloadedModels } = useGetDownloadedModels() const isDownloaded = downloadedModels.find((model) => model._id === modelVersion._id) != null const downloadAtom = useMemo( () => atom((get) => get(modelDownloadStateAtom)[modelVersion._id ?? '']), [modelVersion._id] ) const downloadState = useAtomValue(downloadAtom) const onDownloadClick = () => { downloadModel(model, modelVersion) } let downloadButton = ( ) if (downloadState) { downloadButton = (
{formatDownloadPercentage(downloadState.percent)}
) } else if (isDownloaded) { downloadButton =
Downloaded
} const { maxRamRequired, usecase } = modelVersion return (
{modelVersion.name}
{toGigabytes(modelVersion.size)}
{downloadButton}
) } export default ModelVersionItem