Compare commits
No commits in common. "86bff774e652557cb942d3941d93321fb18c636d" and "41777c9440ccf36b7fb30f802bcbfe5a9822891c" have entirely different histories.
86bff774e6
...
41777c9440
@ -5,7 +5,6 @@ import { useEditor } from "@/features/editor/hooks/use-editor";
|
|||||||
import { useEffect, useRef } from "react";
|
import { useEffect, useRef } from "react";
|
||||||
|
|
||||||
export const Editor = () => {
|
export const Editor = () => {
|
||||||
|
|
||||||
const { init } = useEditor();
|
const { init } = useEditor();
|
||||||
|
|
||||||
const canvasRef = useRef(null);
|
const canvasRef = useRef(null);
|
||||||
|
@ -1,79 +0,0 @@
|
|||||||
import { useCallback, useEffect } from "react";
|
|
||||||
import { fabric } from "fabric";
|
|
||||||
|
|
||||||
interface UseAutoResizeProps {
|
|
||||||
canvas: fabric.Canvas | null;
|
|
||||||
container: HTMLDivElement | null;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const useAutoResize = ({canvas,container}:
|
|
||||||
UseAutoResizeProps) => {
|
|
||||||
const autoZoom = useCallback(() => {
|
|
||||||
if(!canvas || !container) return;
|
|
||||||
|
|
||||||
const width = container.offsetWidth;
|
|
||||||
const height = container.offsetHeight;
|
|
||||||
|
|
||||||
canvas.setWidth(width);
|
|
||||||
canvas.setHeight(height);
|
|
||||||
|
|
||||||
const center = canvas.getCenter();
|
|
||||||
|
|
||||||
const zoomRatio = 0.85;
|
|
||||||
const localWorkspace = canvas.getObjects()
|
|
||||||
.find((object) => object.name === "clip");
|
|
||||||
|
|
||||||
//@ts-ignore
|
|
||||||
const scale = fabric.util.findScaleToFit(localWorkspace, {
|
|
||||||
width : width,
|
|
||||||
height: height,
|
|
||||||
});
|
|
||||||
|
|
||||||
const zoom = zoomRatio * scale;
|
|
||||||
|
|
||||||
canvas.setViewportTransform(fabric.iMatrix.concat());
|
|
||||||
canvas.zoomToPoint(new fabric.Point(center.left,center.top),zoom);
|
|
||||||
|
|
||||||
if (!localWorkspace) return;
|
|
||||||
|
|
||||||
const workspaceCenter = localWorkspace.getCenterPoint();
|
|
||||||
const viewportTransform = canvas.viewportTransform;
|
|
||||||
|
|
||||||
if( canvas.width === undefined ||
|
|
||||||
canvas.height === undefined ||
|
|
||||||
!viewportTransform) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
viewportTransform[4] = canvas.width / 2 - workspaceCenter.x *
|
|
||||||
viewportTransform[0];
|
|
||||||
|
|
||||||
viewportTransform[5] = canvas.height / 2 - workspaceCenter.y *
|
|
||||||
viewportTransform[3];
|
|
||||||
|
|
||||||
canvas.setViewportTransform(viewportTransform);
|
|
||||||
|
|
||||||
localWorkspace.clone((cloned: fabric.Rect) => {
|
|
||||||
canvas.clipPath = cloned;
|
|
||||||
canvas.requestRenderAll();
|
|
||||||
});
|
|
||||||
},[canvas, container]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
let resizeObserver: ResizeObserver | null = null;
|
|
||||||
|
|
||||||
if (canvas && container) {
|
|
||||||
resizeObserver = new ResizeObserver(() => {
|
|
||||||
autoZoom();
|
|
||||||
});
|
|
||||||
|
|
||||||
resizeObserver.observe(container);
|
|
||||||
}
|
|
||||||
|
|
||||||
return () => {
|
|
||||||
if (resizeObserver) {
|
|
||||||
resizeObserver.disconnect();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}, [canvas,container,autoZoom]);
|
|
||||||
};
|
|
@ -1,23 +1,14 @@
|
|||||||
import { fabric } from "fabric";
|
import { fabric } from "fabric";
|
||||||
import { useCallback, useState } from "react";
|
import { useCallback } from "react";
|
||||||
import { useAutoResize } from "./use-auto-resize";
|
|
||||||
|
|
||||||
|
|
||||||
interface UseEditorProps {
|
|
||||||
initialCanvas: fabric.Canvas;
|
|
||||||
initialContainer: HTMLDivElement;
|
|
||||||
}
|
|
||||||
export const useEditor = () => {
|
export const useEditor = () => {
|
||||||
const[canvas, setCanvas] = useState<fabric.Canvas | null>(null);
|
const init = useCallback(({
|
||||||
const[container, setContatiner] = useState<HTMLDivElement | null>(null);
|
initialCanvas,
|
||||||
|
initialContainer,
|
||||||
useAutoResize({
|
}: {
|
||||||
canvas,
|
initialCanvas: fabric.Canvas;
|
||||||
container,
|
initialContainer: HTMLDivElement,
|
||||||
});
|
}) => {
|
||||||
|
|
||||||
const init = useCallback(
|
|
||||||
({initialCanvas,initialContainer}: UseEditorProps) => {
|
|
||||||
fabric.Object.prototype.set({
|
fabric.Object.prototype.set({
|
||||||
cornerColor: "#FFF",
|
cornerColor: "#FFF",
|
||||||
cornerStyle: "circle",
|
cornerStyle: "circle",
|
||||||
@ -26,8 +17,7 @@ export const useEditor = () => {
|
|||||||
transparentCorners: false,
|
transparentCorners: false,
|
||||||
borderOpacityWhenMoving: 1,
|
borderOpacityWhenMoving: 1,
|
||||||
cornerStrokeColor: "#3b82f6",
|
cornerStrokeColor: "#3b82f6",
|
||||||
}
|
})
|
||||||
)
|
|
||||||
|
|
||||||
const initialWorkspace = new fabric.Rect({
|
const initialWorkspace = new fabric.Rect({
|
||||||
width: 900,
|
width: 900,
|
||||||
@ -38,7 +28,7 @@ export const useEditor = () => {
|
|||||||
hasControls: false,
|
hasControls: false,
|
||||||
shadow: new fabric.Shadow({
|
shadow: new fabric.Shadow({
|
||||||
color: "rgba(0,0,0,0.8)",
|
color: "rgba(0,0,0,0.8)",
|
||||||
blur: 5
|
blur: 5,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -49,9 +39,6 @@ export const useEditor = () => {
|
|||||||
initialCanvas.centerObject(initialWorkspace);
|
initialCanvas.centerObject(initialWorkspace);
|
||||||
initialCanvas.clipPath = initialWorkspace; // clip the canvas to the workspace
|
initialCanvas.clipPath = initialWorkspace; // clip the canvas to the workspace
|
||||||
|
|
||||||
setCanvas(initialCanvas);
|
|
||||||
setContatiner(initialContainer);
|
|
||||||
|
|
||||||
const test = new fabric.Rect({
|
const test = new fabric.Rect({
|
||||||
height: 100,
|
height: 100,
|
||||||
width: 100,
|
width: 100,
|
||||||
@ -61,7 +48,8 @@ export const useEditor = () => {
|
|||||||
initialCanvas.add(test);
|
initialCanvas.add(test);
|
||||||
initialCanvas.centerObject(test);
|
initialCanvas.centerObject(test);
|
||||||
},
|
},
|
||||||
[]);
|
[]
|
||||||
|
);
|
||||||
|
|
||||||
return { init };
|
return { init };
|
||||||
};
|
};
|
Loading…
Reference in New Issue
Block a user