fix: element creation fails with empty layer_id (FOREIGN KEY constraint)
Three fixes: 1. interaction/index.ts: Add layerId to created element in confirmDraw() 2. CanvasArea.tsx: Sync layers to LayerManager via layerManagerRef 3. App.tsx: Fallback to activeLayerId in handleElementCreated if layerId missing Root cause: LayerManager.activeLayerId was empty because layers were never synced from React state to the interaction layer LayerManager. New elements got layer_id="" which failed SQLite FOREIGN KEY constraint. Also includes Yjs sync race condition fix from previous commit.
This commit is contained in:
@@ -29,6 +29,7 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
|
||||
const renderEngineRef = useRef<RenderEngine | null>(null);
|
||||
const interactionRef = useRef<InteractionEngine | null>(null);
|
||||
const spatialIndexRef = useRef<SpatialIndex | null>(null);
|
||||
const layerManagerRef = useRef<LayerManager | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
const canvas = canvasRef.current;
|
||||
@@ -48,6 +49,7 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
|
||||
renderEngineRef.current = renderEngine;
|
||||
interactionRef.current = interaction;
|
||||
spatialIndexRef.current = spatialIndex;
|
||||
layerManagerRef.current = layerManager;
|
||||
|
||||
interaction.setCallbacks({
|
||||
onElementCreated,
|
||||
@@ -68,6 +70,7 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
|
||||
renderEngineRef.current = null;
|
||||
interactionRef.current = null;
|
||||
spatialIndexRef.current = null;
|
||||
layerManagerRef.current = null;
|
||||
};
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
@@ -133,7 +136,12 @@ const CanvasArea: React.FC<CanvasAreaProps> = ({
|
||||
// Sync layers to LayerManager + render
|
||||
useEffect(() => {
|
||||
const renderEngine = renderEngineRef.current;
|
||||
const layerManager = layerManagerRef.current;
|
||||
if (!renderEngine) return;
|
||||
if (layerManager) {
|
||||
layerManager.clear();
|
||||
layers.forEach(l => layerManager.addLayer(l));
|
||||
}
|
||||
renderEngine.setLayers(layers);
|
||||
renderEngine.render();
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
|
||||
Reference in New Issue
Block a user