import { Box, Flex, Spinner, SystemStyleObject } from '@chakra-ui/react'; import { createSelector } from '@reduxjs/toolkit'; import { skipToken } from '@reduxjs/toolkit/dist/query'; import { TypesafeDraggableData, TypesafeDroppableData, } from 'app/components/ImageDnd/typesafeDnd'; import { stateSelector } from 'app/store/store'; import { useAppDispatch, useAppSelector } from 'app/store/storeHooks'; import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; import IAIDndImage from 'common/components/IAIDndImage'; import { memo, useCallback, useMemo, useState } from 'react'; import { useGetImageDTOQuery } from 'services/api/endpoints/images'; import { controlNetImageChanged } from '../store/controlNetSlice'; import { PostUploadAction } from 'services/api/types'; type Props = { controlNetId: string; height: SystemStyleObject['h']; }; const ControlNetImagePreview = (props: Props) => { const { height, controlNetId } = props; const dispatch = useAppDispatch(); const selector = useMemo( () => createSelector( stateSelector, ({ controlNet }) => { const { pendingControlImages } = controlNet; const { controlImage, processedControlImage, processorType, isEnabled, } = controlNet.controlNets[controlNetId]; return { controlImageName: controlImage, processedControlImageName: processedControlImage, processorType, isEnabled, pendingControlImages, }; }, defaultSelectorOptions ), [controlNetId] ); const { controlImageName, processedControlImageName, processorType, pendingControlImages, isEnabled, } = useAppSelector(selector); const [isMouseOverImage, setIsMouseOverImage] = useState(false); const { currentData: controlImage, isLoading: isLoadingControlImage, isError: isErrorControlImage, isSuccess: isSuccessControlImage, } = useGetImageDTOQuery(controlImageName ?? skipToken); const { currentData: processedControlImage, isLoading: isLoadingProcessedControlImage, isError: isErrorProcessedControlImage, isSuccess: isSuccessProcessedControlImage, } = useGetImageDTOQuery(processedControlImageName ?? skipToken); const handleResetControlImage = useCallback(() => { dispatch(controlNetImageChanged({ controlNetId, controlImage: null })); }, [controlNetId, dispatch]); const handleMouseEnter = useCallback(() => { setIsMouseOverImage(true); }, []); const handleMouseLeave = useCallback(() => { setIsMouseOverImage(false); }, []); const draggableData = useMemo(() => { if (controlImage) { return { id: controlNetId, payloadType: 'IMAGE_DTO', payload: { imageDTO: controlImage }, }; } }, [controlImage, controlNetId]); const droppableData = useMemo( () => ({ id: controlNetId, actionType: 'SET_CONTROLNET_IMAGE', context: { controlNetId }, }), [controlNetId] ); const postUploadAction = useMemo( () => ({ type: 'SET_CONTROLNET_IMAGE', controlNetId }), [controlNetId] ); const shouldShowProcessedImage = controlImage && processedControlImage && !isMouseOverImage && !pendingControlImages.includes(controlNetId) && processorType !== 'none'; return ( {pendingControlImages.includes(controlNetId) && ( )} ); }; export default memo(ControlNetImagePreview);