merchi_product_editor
Version:
A React component for editing product images using Fabric.js
155 lines (139 loc) • 3.8 kB
text/typescript
import { fabric } from 'fabric';
/**
* @param fabricCanvas
* @param width
* @param height
* @param gridSize
* @param lineColor
* @param enabled
*/
export const drawGrid = (
fabricCanvas: fabric.Canvas,
width: number,
height: number,
gridSize = 20,
lineColor = '#e0e0e0',
enabled = true
) => {
// First, make sure fabricCanvas is not null
if (!fabricCanvas) {
console.warn('drawGrid: fabricCanvas is null or undefined');
return;
}
// Make sure the canvas element exists and is valid
try {
// This will throw an error if the canvas element is no longer in the DOM
if (!fabricCanvas.getElement() || !fabricCanvas.getElement().parentNode) {
console.warn('drawGrid: Canvas element is not in the DOM');
return;
}
} catch (e) {
console.warn('drawGrid: Error checking canvas element:', e);
return;
}
// remove all existing grid lines
const gridLines = fabricCanvas.getObjects().filter(obj => obj.data?.isGrid);
gridLines.forEach(line => fabricCanvas.remove(line));
if (!enabled) return;
// draw vertical lines
for (let i = 0; i <= width; i += gridSize) {
const line = new fabric.Line([i, 0, i, height], {
stroke: lineColor,
strokeWidth: 0.5,
opacity: 0.3,
selectable: false,
evented: false,
data: { isGrid: true }
});
fabricCanvas.add(line);
}
// draw horizontal lines
for (let i = 0; i <= height; i += gridSize) {
const line = new fabric.Line([0, i, width, i], {
stroke: lineColor,
strokeWidth: 0.5,
opacity: 0.3,
selectable: false,
evented: false,
data: { isGrid: true }
});
fabricCanvas.add(line);
}
try {
fabricCanvas.renderAll();
} catch (e) {
console.error('drawGrid: Error rendering grid:', e);
}
};
/**
* save the grid state on the canvas
* @param fabricCanvas
*/
export const saveGridState = (fabricCanvas: fabric.Canvas) => {
if (!fabricCanvas) {
console.warn('saveGridState: fabricCanvas is null or undefined');
return [];
}
try {
const objs = fabricCanvas.getObjects().filter(obj => obj);
return objs;
} catch (e) {
console.warn('saveGridState: Error getting grid objects:', e);
return [];
}
};
/**
* bring grid lines to front of the canvas
* @param fabricCanvas
* @param gridLines
*/
export const bringGridToFront = (fabricCanvas: fabric.Canvas, gridLines: fabric.Object[]) => {
if (!fabricCanvas) {
console.warn('bringGridToFront: fabricCanvas is null or undefined');
return;
}
if (gridLines && gridLines.length > 0) {
try {
gridLines.forEach(line => fabricCanvas.bringToFront(line));
} catch (e) {
console.warn('bringGridToFront: Error bringing grid to front:', e);
}
}
};
/**
* send grid lines to back of the canvas
* @param fabricCanvas
* @param gridLines
*/
export const sendGridToBack = (fabricCanvas: fabric.Canvas, gridLines: fabric.Object[]) => {
if (!fabricCanvas) {
console.warn('sendGridToBack: fabricCanvas is null or undefined');
return;
}
if (gridLines && gridLines.length > 0) {
try {
gridLines.forEach(line => fabricCanvas.sendToBack(line));
} catch (e) {
console.warn('sendGridToBack: Error sending grid to back:', e);
}
}
};
/**
* clear all objects except the grid on the canvas
* @param fabricCanvas
*/
export const clearCanvasExceptGrid = (fabricCanvas: fabric.Canvas) => {
if (!fabricCanvas) {
console.warn('clearCanvasExceptGrid: fabricCanvas is null or undefined');
return;
}
try {
fabricCanvas.getObjects().forEach(obj => {
if (!obj.data?.isGrid) {
fabricCanvas.remove(obj);
}
});
} catch (e) {
console.warn('clearCanvasExceptGrid: Error clearing canvas:', e);
}
};