mirror of
https://github.com/invoke-ai/InvokeAI
synced 2024-08-30 20:32:17 +00:00
* Auto-format frontend * Update lint-frontend GA workflow node and checkout * Fix linter error in ThemeChanger * Add a `on: pull_request` to lint-frontend workflow Co-authored-by: Lincoln Stein <lincoln.stein@gmail.com>
61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
import { createSelector } from '@reduxjs/toolkit';
|
|
import { RootState } from 'app/store';
|
|
import { useAppSelector } from 'app/storeHooks';
|
|
import { GalleryState } from 'features/gallery/store/gallerySlice';
|
|
import { ImageConfig } from 'konva/lib/shapes/Image';
|
|
import _ from 'lodash';
|
|
import { useEffect, useState } from 'react';
|
|
import { Image as KonvaImage } from 'react-konva';
|
|
|
|
const selector = createSelector(
|
|
[(state: RootState) => state.gallery],
|
|
(gallery: GalleryState) => {
|
|
return gallery.intermediateImage ? gallery.intermediateImage : null;
|
|
},
|
|
{
|
|
memoizeOptions: {
|
|
resultEqualityCheck: _.isEqual,
|
|
},
|
|
}
|
|
);
|
|
|
|
type Props = Omit<ImageConfig, 'image'>;
|
|
|
|
const IAICanvasIntermediateImage = (props: Props) => {
|
|
const { ...rest } = props;
|
|
const intermediateImage = useAppSelector(selector);
|
|
|
|
const [loadedImageElement, setLoadedImageElement] =
|
|
useState<HTMLImageElement | null>(null);
|
|
|
|
useEffect(() => {
|
|
if (!intermediateImage) return;
|
|
const tempImage = new Image();
|
|
|
|
tempImage.onload = () => {
|
|
setLoadedImageElement(tempImage);
|
|
};
|
|
tempImage.src = intermediateImage.url;
|
|
}, [intermediateImage]);
|
|
|
|
if (!intermediateImage?.boundingBox) return null;
|
|
|
|
const {
|
|
boundingBox: { x, y, width, height },
|
|
} = intermediateImage;
|
|
|
|
return loadedImageElement ? (
|
|
<KonvaImage
|
|
x={x}
|
|
y={y}
|
|
width={width}
|
|
height={height}
|
|
image={loadedImageElement}
|
|
listening={false}
|
|
{...rest}
|
|
/>
|
|
) : null;
|
|
};
|
|
|
|
export default IAICanvasIntermediateImage;
|