import React, { useRef, useState, useContext, useCallback } from 'react'; import { ZOOM, Template, Schema, SchemaForUI, ChangeSchemas, DesignerProps, Size, isBlankPdf, px2mm, } from '@pdfme-tables/common'; import { DndContext } from '@dnd-kit/core'; import RightSidebar from './RightSidebar/index'; import LeftSidebar from './LeftSidebar'; import Canvas from './Canvas/index'; import { RULER_HEIGHT, RIGHT_SIDEBAR_WIDTH } from '../../constants'; import { I18nContext, PluginsRegistry } from '../../contexts'; import { schemasList2template, uuid, cloneDeep, template2SchemasList, getPagesScrollTopByIndex, changeSchemas as _changeSchemas, } from '../../helper'; import { useUIPreProcessor, useScrollPageCursor, useInitEvents } from '../../hooks'; import Root from '../Root'; import ErrorScreen from '../ErrorScreen'; import CtlBar from '../CtlBar'; /** * When the canvas scales there is a displacement of the starting position of the dragged schema. * It moves left or right from the top-left corner of the drag icon depending on the scale. * This function calculates the adjustment needed to compensate for this displacement. */ const scaleDragPosAdjustment = (adjustment: number, scale: number): number => { if (scale > 1) return adjustment * (scale - 1); if (scale < 1) return adjustment * -(1 - scale); return 0; }; const TemplateEditor = ({ template, size, onSaveTemplate, onChangeTemplate, onPageCursorChange, }: Omit & { size: Size; onSaveTemplate: (t: Template) => void; onChangeTemplate: (t: Template) => void; } & { onChangeTemplate: (t: Template) => void; onPageCursorChange: (newPageCursor: number) => void; }) => { const past = useRef([]); const future = useRef([]); const canvasRef = useRef(null); const paperRefs = useRef([]); const i18n = useContext(I18nContext); const pluginsRegistry = useContext(PluginsRegistry); const [hoveringSchemaId, setHoveringSchemaId] = useState(null); const [activeElements, setActiveElements] = useState([]); const [schemasList, setSchemasList] = useState([[]] as SchemaForUI[][]); const [pageCursor, setPageCursor] = useState(0); const [zoomLevel, setZoomLevel] = useState(1); const [sidebarOpen, setSidebarOpen] = useState(true); const [prevTemplate, setPrevTemplate] = useState