diff --git a/invokeai/frontend/web/src/features/controlLayers/components/CanvasMainPanelContent.tsx b/invokeai/frontend/web/src/features/controlLayers/components/CanvasMainPanelContent.tsx index 03f7844950..6097b15ac1 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/CanvasMainPanelContent.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/CanvasMainPanelContent.tsx @@ -9,6 +9,7 @@ import { Menu, MenuButton, MenuList, + Spacer, Text, } from '@invoke-ai/ui-library'; import { useStore } from '@nanostores/react'; @@ -47,14 +48,14 @@ import { } from 'features/controlLayers/store/canvasStagingAreaSlice'; import { newCanvasFromImageDndTarget } from 'features/dnd/dnd'; import { DndDropTarget } from 'features/dnd/DndDropTarget'; +import { DndImage } from 'features/dnd/DndImage'; import { newCanvasFromImage } from 'features/imageActions/actions'; -import type { ProgressImage } from 'features/nodes/types/common'; -import { memo, useCallback, useEffect, useMemo } from 'react'; +import { memo, useCallback, useMemo } from 'react'; import { useHotkeys } from 'react-hotkeys-hook'; import { Trans, useTranslation } from 'react-i18next'; import { PiDotsThreeOutlineVerticalFill, PiUploadBold } from 'react-icons/pi'; -import type { ImageDTO, S } from 'services/api/types'; -import { $lastCanvasProgressImage, $socket } from 'services/events/stores'; +import type { ImageDTO } from 'services/api/types'; +import { $lastCanvasProgressImage } from 'services/events/stores'; import type { Equals, Param0 } from 'tsafe'; import { assert } from 'tsafe'; @@ -281,39 +282,9 @@ const GenerateWithStartingImageAndInpaintMask = memo(() => { }); GenerateWithStartingImageAndInpaintMask.displayName = 'GenerateWithStartingImageAndInpaintMask'; -type EphemeralProgressImage = { sessionId: string; image: ProgressImage }; - const SimpleActiveSession = memo(() => { const dispatch = useAppDispatch(); const isStaging = useAppSelector(selectIsStaging); - const socket = useStore($socket); - - useEffect(() => { - if (!socket) { - return; - } - - const onQueueItemStatusChanged = (event: S['QueueItemStatusChangedEvent']) => { - const progressImage = $lastCanvasProgressImage.get(); - if (!progressImage) { - return; - } - if (progressImage.sessionId !== event.session_id) { - return; - } - if (event.status !== 'canceled' && event.status !== 'failed') { - return; - } - $lastCanvasProgressImage.set(null); - }; - console.log('SUB session preview image listeners'); - socket.on('queue_item_status_changed', onQueueItemStatusChanged); - - return () => { - console.log('UNSUB session preview image listeners'); - socket.off('queue_item_status_changed', onQueueItemStatusChanged); - }; - }, [dispatch, socket]); const onReset = useCallback(() => { dispatch(canvasReset()); @@ -332,7 +303,7 @@ const SimpleActiveSession = memo(() => { useHotkeys(['left'], selectPrev, { preventDefault: true }, [selectPrev]); return ( - + Simple Session (staging view) {isStaging && 'STAGING'} @@ -352,14 +323,13 @@ const SelectedImage = memo(() => { if (progressImage) { return ( - + ); @@ -367,18 +337,8 @@ const SelectedImage = memo(() => { if (selectedImage) { return ( - - { - console.log('onload'); - }} - /> + + ); } @@ -391,15 +351,26 @@ const SessionImages = memo(() => { const stagedImages = useAppSelector(selectStagedImages); return ( + {stagedImages.map(({ imageDTO }, index) => ( ))} + ); }); SessionImages.displayName = 'SessionImages'; const sx = { + objectFit: 'contain', + maxW: 'full', + maxH: 'full', + w: 'min-content', + borderRadius: 'base', + cursor: 'grab', + '&[data-is-dragging=true]': { + opacity: 0.3, + }, '&[data-is-selected="false"]': { opacity: 0.5, }, @@ -411,10 +382,9 @@ const SessionImage = memo(({ index, imageDTO }: { index: number; imageDTO: Image dispatch(stagingAreaImageSelected({ index })); }, [dispatch, index]); return ( -