import { Button, Flex, IconButton, Popover, PopoverBody, PopoverContent, PopoverTrigger, Text, useDisclosure, } from '@invoke-ai/ui-library'; import { adHocPostProcessingRequested } from 'app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { setInstallModelsTabByName } from 'features/modelManagerV2/store/installModelsStore'; import ParamPostProcessingModel from 'features/parameters/components/PostProcessing/ParamPostProcessingModel'; import { selectPostProcessingModel } from 'features/parameters/store/upscaleSlice'; import { useIsQueueMutationInProgress } from 'features/queue/hooks/useIsQueueMutationInProgress'; import { setActiveTab } from 'features/ui/store/uiSlice'; import { memo, useCallback } from 'react'; import { Trans, useTranslation } from 'react-i18next'; import { PiFrameCornersBold } from 'react-icons/pi'; import type { ImageDTO } from 'services/api/types'; type Props = { imageDTO: ImageDTO | null; isDisabled: boolean }; export const PostProcessingPopover = memo((props: Props) => { const { imageDTO, isDisabled } = props; const dispatch = useAppDispatch(); const postProcessingModel = useAppSelector(selectPostProcessingModel); const inProgress = useIsQueueMutationInProgress(); const { t } = useTranslation(); const { isOpen, onOpen, onClose } = useDisclosure(); const handleClickUpscale = useCallback(() => { onClose(); if (!imageDTO) { return; } dispatch(adHocPostProcessingRequested({ imageDTO })); }, [dispatch, imageDTO, onClose]); return ( } aria-label={t('parameters.postProcessing')} variant="link" alignSelf="stretch" isDisabled={isDisabled} /> {!postProcessingModel && } ); }); PostProcessingPopover.displayName = 'PostProcessingPopover'; const MissingModelWarning = () => { const dispatch = useAppDispatch(); const handleGoToModelManager = useCallback(() => { dispatch(setActiveTab('models')); setInstallModelsTabByName('launchpad'); }, [dispatch]); return ( ), }} /> ); };