import { Flex } from '@invoke-ai/ui-library'; import { useStore } from '@nanostores/react'; import { skipToken } from '@reduxjs/toolkit/query'; import { UploadImageButton } from 'common/hooks/useImageUploadButton'; import type { ImageWithDims } from 'features/controlLayers/store/types'; import type { setGlobalReferenceImageDndTarget, setRegionalGuidanceReferenceImageDndTarget } from 'features/dnd/dnd'; import { DndDropTarget } from 'features/dnd/DndDropTarget'; import { DndImage } from 'features/dnd/DndImage'; import { DndImageIcon } from 'features/dnd/DndImageIcon'; import { memo, useCallback, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { PiArrowCounterClockwiseBold } from 'react-icons/pi'; import { useGetImageDTOQuery } from 'services/api/endpoints/images'; import type { ImageDTO } from 'services/api/types'; import { $isConnected } from 'services/events/stores'; type Props = { image: ImageWithDims | null; onChangeImage: (imageDTO: ImageDTO | null) => void; dndTarget: T; dndTargetData: ReturnType; }; export const IPAdapterImagePreview = memo( ({ image, onChangeImage, dndTarget, dndTargetData, }: Props) => { const { t } = useTranslation(); const isConnected = useStore($isConnected); const { currentData: imageDTO, isError } = useGetImageDTOQuery(image?.image_name ?? skipToken); const handleResetControlImage = useCallback(() => { onChangeImage(null); }, [onChangeImage]); useEffect(() => { if (isConnected && isError) { handleResetControlImage(); } }, [handleResetControlImage, isError, isConnected]); const onUpload = useCallback( (imageDTO: ImageDTO) => { onChangeImage(imageDTO); }, [onChangeImage] ); return ( {!imageDTO && ( )} {imageDTO && ( <> } tooltip={t('common.reset')} /> )} ); } ); IPAdapterImagePreview.displayName = 'IPAdapterImagePreview';