feat: canvasLoading
This commit is contained in:
parent
f29e7dbce7
commit
5de978918d
|
@ -32,8 +32,8 @@ const TransformMenu = () => {
|
||||||
const {
|
const {
|
||||||
canvasRef,
|
canvasRef,
|
||||||
originalSizeCanvasRef,
|
originalSizeCanvasRef,
|
||||||
cropLoading,
|
canvasLoading,
|
||||||
setCropLoading,
|
setCanvasLoading,
|
||||||
// setNonFilteredFileURL
|
// setNonFilteredFileURL
|
||||||
setTransformationPerformed,
|
setTransformationPerformed,
|
||||||
} = useContext(ImageEditorOverlayContext);
|
} = useContext(ImageEditorOverlayContext);
|
||||||
|
@ -71,8 +71,6 @@ const TransformMenu = () => {
|
||||||
|
|
||||||
context.clearRect(0, 0, canvas.width, canvas.height);
|
context.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
setCropLoading(true);
|
|
||||||
|
|
||||||
canvas.width = newWidth;
|
canvas.width = newWidth;
|
||||||
canvas.height = newHeight;
|
canvas.height = newHeight;
|
||||||
|
|
||||||
|
@ -88,8 +86,6 @@ const TransformMenu = () => {
|
||||||
newHeight
|
newHeight
|
||||||
);
|
);
|
||||||
|
|
||||||
setCropLoading(false);
|
|
||||||
|
|
||||||
// setNonFilteredFileURL(canvas.toDataURL());
|
// setNonFilteredFileURL(canvas.toDataURL());
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -102,7 +98,6 @@ const TransformMenu = () => {
|
||||||
context.resetTransform();
|
context.resetTransform();
|
||||||
context.imageSmoothingEnabled = false;
|
context.imageSmoothingEnabled = false;
|
||||||
const img = new Image();
|
const img = new Image();
|
||||||
// img.src = fileURL;
|
|
||||||
img.src = canvas.toDataURL();
|
img.src = canvas.toDataURL();
|
||||||
|
|
||||||
img.onload = () => {
|
img.onload = () => {
|
||||||
|
@ -173,11 +168,13 @@ const TransformMenu = () => {
|
||||||
marginBottom: '0.5rem',
|
marginBottom: '0.5rem',
|
||||||
}}>
|
}}>
|
||||||
<EnteMenuItem
|
<EnteMenuItem
|
||||||
disabled={cropLoading}
|
disabled={canvasLoading}
|
||||||
startIcon={<CropSquareIcon />}
|
startIcon={<CropSquareIcon />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
setCanvasLoading(true);
|
||||||
cropCanvas(canvasRef.current, 1, 1);
|
cropCanvas(canvasRef.current, 1, 1);
|
||||||
cropCanvas(originalSizeCanvasRef.current, 1, 1);
|
cropCanvas(originalSizeCanvasRef.current, 1, 1);
|
||||||
|
setCanvasLoading(false);
|
||||||
setTransformationPerformed(true);
|
setTransformationPerformed(true);
|
||||||
}}
|
}}
|
||||||
label={'Square (1:1)'}
|
label={'Square (1:1)'}
|
||||||
|
@ -189,10 +186,12 @@ const TransformMenu = () => {
|
||||||
}}>
|
}}>
|
||||||
{PRESET_ASPECT_RATIOS.map((ratio, index) => (
|
{PRESET_ASPECT_RATIOS.map((ratio, index) => (
|
||||||
<EnteMenuItem
|
<EnteMenuItem
|
||||||
disabled={cropLoading}
|
disabled={canvasLoading}
|
||||||
key={index}
|
key={index}
|
||||||
startIcon={ratio.icon}
|
startIcon={ratio.icon}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
setCanvasLoading(true);
|
||||||
|
|
||||||
cropCanvas(
|
cropCanvas(
|
||||||
canvasRef.current,
|
canvasRef.current,
|
||||||
ratio.width,
|
ratio.width,
|
||||||
|
@ -203,6 +202,7 @@ const TransformMenu = () => {
|
||||||
ratio.width,
|
ratio.width,
|
||||||
ratio.height
|
ratio.height
|
||||||
);
|
);
|
||||||
|
setCanvasLoading(false);
|
||||||
setTransformationPerformed(true);
|
setTransformationPerformed(true);
|
||||||
}}
|
}}
|
||||||
label={`${ratio.width}:${ratio.height}`}
|
label={`${ratio.width}:${ratio.height}`}
|
||||||
|
@ -215,10 +215,11 @@ const TransformMenu = () => {
|
||||||
}}>
|
}}>
|
||||||
{PRESET_ASPECT_RATIOS.map((ratio, index) => (
|
{PRESET_ASPECT_RATIOS.map((ratio, index) => (
|
||||||
<EnteMenuItem
|
<EnteMenuItem
|
||||||
disabled={cropLoading}
|
disabled={canvasLoading}
|
||||||
key={index}
|
key={index}
|
||||||
startIcon={ratio.icon}
|
startIcon={ratio.icon}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
setCanvasLoading(true);
|
||||||
cropCanvas(
|
cropCanvas(
|
||||||
canvasRef.current,
|
canvasRef.current,
|
||||||
ratio.height,
|
ratio.height,
|
||||||
|
@ -229,6 +230,7 @@ const TransformMenu = () => {
|
||||||
ratio.height,
|
ratio.height,
|
||||||
ratio.width
|
ratio.width
|
||||||
);
|
);
|
||||||
|
setCanvasLoading(false);
|
||||||
setTransformationPerformed(true);
|
setTransformationPerformed(true);
|
||||||
}}
|
}}
|
||||||
label={`${ratio.height}:${ratio.width}`}
|
label={`${ratio.height}:${ratio.width}`}
|
||||||
|
@ -241,22 +243,26 @@ const TransformMenu = () => {
|
||||||
marginBottom: '1rem',
|
marginBottom: '1rem',
|
||||||
}}>
|
}}>
|
||||||
<EnteMenuItem
|
<EnteMenuItem
|
||||||
disabled={cropLoading}
|
disabled={canvasLoading}
|
||||||
startIcon={<RotateLeftIcon />}
|
startIcon={<RotateLeftIcon />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
setCanvasLoading(true);
|
||||||
rotateCanvas(canvasRef.current, -90);
|
rotateCanvas(canvasRef.current, -90);
|
||||||
rotateCanvas(originalSizeCanvasRef.current, -90);
|
rotateCanvas(originalSizeCanvasRef.current, -90);
|
||||||
|
setCanvasLoading(false);
|
||||||
setTransformationPerformed(true);
|
setTransformationPerformed(true);
|
||||||
}}
|
}}
|
||||||
label="Rotate Left 90˚"
|
label="Rotate Left 90˚"
|
||||||
/>
|
/>
|
||||||
<EnteMenuItem
|
<EnteMenuItem
|
||||||
disabled={cropLoading}
|
disabled={canvasLoading}
|
||||||
startIcon={<RotateRightIcon />}
|
startIcon={<RotateRightIcon />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
setCanvasLoading(true);
|
||||||
rotateCanvas(canvasRef.current, 90);
|
rotateCanvas(canvasRef.current, 90);
|
||||||
rotateCanvas(originalSizeCanvasRef.current, 90);
|
rotateCanvas(originalSizeCanvasRef.current, 90);
|
||||||
setTransformationPerformed(true);
|
setTransformationPerformed(true);
|
||||||
|
setCanvasLoading(false);
|
||||||
}}
|
}}
|
||||||
label="Rotate Right 90˚"
|
label="Rotate Right 90˚"
|
||||||
/>
|
/>
|
||||||
|
@ -267,21 +273,25 @@ const TransformMenu = () => {
|
||||||
marginBottom: '1rem',
|
marginBottom: '1rem',
|
||||||
}}>
|
}}>
|
||||||
<EnteMenuItem
|
<EnteMenuItem
|
||||||
disabled={cropLoading}
|
disabled={canvasLoading}
|
||||||
startIcon={<FlipIcon />}
|
startIcon={<FlipIcon />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
setCanvasLoading(true);
|
||||||
flipCanvas(canvasRef.current, 'vertical');
|
flipCanvas(canvasRef.current, 'vertical');
|
||||||
flipCanvas(originalSizeCanvasRef.current, 'vertical');
|
flipCanvas(originalSizeCanvasRef.current, 'vertical');
|
||||||
|
setCanvasLoading(false);
|
||||||
setTransformationPerformed(true);
|
setTransformationPerformed(true);
|
||||||
}}
|
}}
|
||||||
label="Flip Vertically"
|
label="Flip Vertically"
|
||||||
/>
|
/>
|
||||||
<EnteMenuItem
|
<EnteMenuItem
|
||||||
disabled={cropLoading}
|
disabled={canvasLoading}
|
||||||
startIcon={<FlipIcon />}
|
startIcon={<FlipIcon />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
|
setCanvasLoading(true);
|
||||||
flipCanvas(canvasRef.current, 'horizontal');
|
flipCanvas(canvasRef.current, 'horizontal');
|
||||||
flipCanvas(originalSizeCanvasRef.current, 'horizontal');
|
flipCanvas(originalSizeCanvasRef.current, 'horizontal');
|
||||||
|
setCanvasLoading(false);
|
||||||
setTransformationPerformed(true);
|
setTransformationPerformed(true);
|
||||||
}}
|
}}
|
||||||
label="Flip Horizontally"
|
label="Flip Horizontally"
|
||||||
|
|
|
@ -40,10 +40,10 @@ export const ImageEditorOverlayContext = createContext(
|
||||||
{} as {
|
{} as {
|
||||||
canvasRef: MutableRefObject<HTMLCanvasElement>;
|
canvasRef: MutableRefObject<HTMLCanvasElement>;
|
||||||
originalSizeCanvasRef: MutableRefObject<HTMLCanvasElement>;
|
originalSizeCanvasRef: MutableRefObject<HTMLCanvasElement>;
|
||||||
cropLoading: boolean;
|
|
||||||
setCropLoading: Dispatch<SetStateAction<boolean>>;
|
|
||||||
// setNonFilteredFileURL: Dispatch<SetStateAction<string>>;
|
// setNonFilteredFileURL: Dispatch<SetStateAction<string>>;
|
||||||
setTransformationPerformed: Dispatch<SetStateAction<boolean>>;
|
setTransformationPerformed: Dispatch<SetStateAction<boolean>>;
|
||||||
|
setCanvasLoading: Dispatch<SetStateAction<boolean>>;
|
||||||
|
canvasLoading: boolean;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -56,8 +56,6 @@ const ImageEditorOverlay = (props: IProps) => {
|
||||||
|
|
||||||
const [fileURL, setFileURL] = useState<string>('');
|
const [fileURL, setFileURL] = useState<string>('');
|
||||||
|
|
||||||
const [cropLoading, setCropLoading] = useState<boolean>(false);
|
|
||||||
|
|
||||||
const [currentRotationAngle, setCurrentRotationAngle] = useState(0);
|
const [currentRotationAngle, setCurrentRotationAngle] = useState(0);
|
||||||
|
|
||||||
const [currentTab, setCurrentTab] = useState<'transform' | 'colours'>(
|
const [currentTab, setCurrentTab] = useState<'transform' | 'colours'>(
|
||||||
|
@ -73,6 +71,8 @@ const ImageEditorOverlay = (props: IProps) => {
|
||||||
const [transformationPerformed, setTransformationPerformed] =
|
const [transformationPerformed, setTransformationPerformed] =
|
||||||
useState(false);
|
useState(false);
|
||||||
|
|
||||||
|
const [canvasLoading, setCanvasLoading] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!canvasRef.current || !originalSizeCanvasRef.current) {
|
if (!canvasRef.current || !originalSizeCanvasRef.current) {
|
||||||
return;
|
return;
|
||||||
|
@ -122,6 +122,7 @@ const ImageEditorOverlay = (props: IProps) => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const loadCanvas = async () => {
|
const loadCanvas = async () => {
|
||||||
|
setCanvasLoading(true);
|
||||||
setTransformationPerformed(false);
|
setTransformationPerformed(false);
|
||||||
resetFilters();
|
resetFilters();
|
||||||
setCurrentRotationAngle(0);
|
setCurrentRotationAngle(0);
|
||||||
|
@ -142,7 +143,6 @@ const ImageEditorOverlay = (props: IProps) => {
|
||||||
img.src = fileURL;
|
img.src = fileURL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// setNonFilteredFileURL(img.src);
|
|
||||||
img.onload = () => {
|
img.onload = () => {
|
||||||
const scale = Math.min(
|
const scale = Math.min(
|
||||||
parentRef.current?.clientWidth / img.width,
|
parentRef.current?.clientWidth / img.width,
|
||||||
|
@ -162,6 +162,8 @@ const ImageEditorOverlay = (props: IProps) => {
|
||||||
const oSCtx = originalSizeCanvasRef.current.getContext('2d');
|
const oSCtx = originalSizeCanvasRef.current.getContext('2d');
|
||||||
|
|
||||||
oSCtx?.drawImage(img, 0, 0, img.width, img.height);
|
oSCtx?.drawImage(img, 0, 0, img.width, img.height);
|
||||||
|
|
||||||
|
setCanvasLoading(false);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -213,7 +215,10 @@ const ImageEditorOverlay = (props: IProps) => {
|
||||||
display="flex"
|
display="flex"
|
||||||
alignItems="center"
|
alignItems="center"
|
||||||
justifyContent="center">
|
justifyContent="center">
|
||||||
{fileURL === null && <CircularProgress />}
|
{(fileURL === null || canvasLoading) && (
|
||||||
|
<CircularProgress />
|
||||||
|
)}
|
||||||
|
|
||||||
<canvas
|
<canvas
|
||||||
ref={canvasRef}
|
ref={canvasRef}
|
||||||
// height={originalHeight}
|
// height={originalHeight}
|
||||||
|
@ -223,7 +228,9 @@ const ImageEditorOverlay = (props: IProps) => {
|
||||||
// maxWidth: '100%',
|
// maxWidth: '100%',
|
||||||
// maxHeight: '1000px',
|
// maxHeight: '1000px',
|
||||||
display:
|
display:
|
||||||
fileURL === null ? 'none' : 'block',
|
fileURL === null || canvasLoading
|
||||||
|
? 'none'
|
||||||
|
: 'block',
|
||||||
position: 'absolute',
|
position: 'absolute',
|
||||||
// transform: `translate(${cropOffsetX}px, ${cropOffsetY}px)`,
|
// transform: `translate(${cropOffsetX}px, ${cropOffsetY}px)`,
|
||||||
}}
|
}}
|
||||||
|
@ -274,7 +281,7 @@ const ImageEditorOverlay = (props: IProps) => {
|
||||||
marginBottom: '0.5rem',
|
marginBottom: '0.5rem',
|
||||||
}}>
|
}}>
|
||||||
<EnteMenuItem
|
<EnteMenuItem
|
||||||
disabled={cropLoading}
|
disabled={canvasLoading}
|
||||||
startIcon={<CropOriginalIcon />}
|
startIcon={<CropOriginalIcon />}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
loadCanvas();
|
loadCanvas();
|
||||||
|
@ -288,8 +295,8 @@ const ImageEditorOverlay = (props: IProps) => {
|
||||||
value={{
|
value={{
|
||||||
originalSizeCanvasRef,
|
originalSizeCanvasRef,
|
||||||
canvasRef,
|
canvasRef,
|
||||||
cropLoading,
|
setCanvasLoading,
|
||||||
setCropLoading,
|
canvasLoading,
|
||||||
// setNonFilteredFileURL,
|
// setNonFilteredFileURL,
|
||||||
setTransformationPerformed,
|
setTransformationPerformed,
|
||||||
}}>
|
}}>
|
||||||
|
|
Loading…
Reference in a new issue