import { Box, Button, Flex, Heading } from '@invoke-ai/ui-library'; import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent'; import { toast } from 'features/toast/toast'; import { t } from 'i18next'; import { memo, useCallback, useMemo } from 'react'; import { useListModelInstallsQuery, usePruneCompletedModelInstallsMutation } from 'services/api/endpoints/models'; import { ModelInstallQueueItem } from './ModelInstallQueueItem'; export const ModelInstallQueue = memo(() => { const { data } = useListModelInstallsQuery(); const [_pruneCompletedModelInstalls] = usePruneCompletedModelInstallsMutation(); const pruneCompletedModelInstalls = useCallback(() => { _pruneCompletedModelInstalls() .unwrap() .then((_) => { toast({ id: 'MODEL_INSTALL_QUEUE_PRUNED', title: t('toast.prunedQueue'), status: 'success', }); }) .catch((error) => { if (error) { toast({ id: 'MODEL_INSTALL_QUEUE_PRUNE_FAILED', title: `${error.data.detail} `, status: 'error', }); } }); }, [_pruneCompletedModelInstalls]); const pruneAvailable = useMemo(() => { return data?.some( (model) => model.status === 'cancelled' || model.status === 'error' || model.status === 'completed' ); }, [data]); return ( {t('modelManager.installQueue')} {data?.map((model) => )} ); }); ModelInstallQueue.displayName = 'ModelInstallQueue';