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;