import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query" import { Skeleton, Table, Tag, Tooltip, notification, Modal, Input } from "antd" import { bytePerSecondFormatter } from "~/libs/byte-formater" import { deleteModel, getAllModels } from "~/services/ollama" import dayjs from "dayjs" import relativeTime from "dayjs/plugin/relativeTime" import { useState } from "react" import { useForm } from "@mantine/form" import { Download, RotateCcw, Trash2 } from "lucide-react" import { useTranslation } from "react-i18next" import { useStorage } from "@plasmohq/storage/hook" dayjs.extend(relativeTime) export const ModelsBody = () => { const queryClient = useQueryClient() const [open, setOpen] = useState(false) const { t } = useTranslation(["settings", "common"]) const [selectedModel, setSelectedModel] = useStorage("selectedModel") const form = useForm({ initialValues: { model: "" } }) const { data, status } = useQuery({ queryKey: ["fetchAllModels"], queryFn: () => getAllModels({ returnEmpty: true }) }) const { mutate: deleteOllamaModel } = useMutation({ mutationFn: deleteModel, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["fetchAllModels"] }) notification.success({ message: t("manageModels.notification.success"), description: t("manageModels.notification.successDeleteDescription") }) }, onError: (error) => { notification.error({ message: "Error", description: error?.message || t("manageModels.notification.someError") }) } }) const pullModel = async (modelName: string) => { notification.info({ message: t("manageModels.notification.pullModel"), description: t("manageModels.notification.pullModelDescription", { modelName }) }) setOpen(false) form.reset() browser.runtime.sendMessage({ type: "pull_model", modelName }) return true } const { mutate: pullOllamaModel } = useMutation({ mutationFn: pullModel }) return (
{/* Add new model button */}
{status === "pending" && } {status === "success" && ( ( {`${text?.slice(0, 5)}...${text?.slice(-4)}`} ) }, { title: t("manageModels.columns.modifiedAt"), dataIndex: "modified_at", key: "modified_at", render: (text: string) => dayjs(text).fromNow(true) }, { title: t("manageModels.columns.size"), dataIndex: "size", key: "size", render: (text: number) => bytePerSecondFormatter(text) }, { title: t("manageModels.columns.actions"), render: (_, record) => (
) } ]} expandable={{ expandedRowRender: (record) => (
), defaultExpandAllRows: false }} bordered dataSource={data} rowKey={(record) => `${record.model}-${record.digest}`} /> )} setOpen(false)}>
pullOllamaModel(values.model))}>
) }