'use client'; import { useRef, useState, useEffect } from 'react'; import { Stage, Layer, Text, Image as KonvaImage, Transformer } from 'react-konva'; import type Konva from 'konva'; import type { DesignElement } from '@/lib/types'; interface AdminDesignEditorProps { designId: string; designJson: string; designPreviewUrl: string; placementPreviewUrl?: string | null; onSave: (designJson: string, previewUrl: string) => void; } export default function AdminDesignEditor({ designId, designJson, designPreviewUrl, placementPreviewUrl, onSave, }: AdminDesignEditorProps) { const stageRef = useRef(null); const transformerRef = useRef(null); const nodeRefs = useRef>(new Map()); const [elements, setElements] = useState([]); const [selectedId, setSelectedId] = useState(null); const [saving, setSaving] = useState(false); useEffect(() => { try { const design = JSON.parse(designJson); setElements([...(design.front || []), ...(design.back || [])]); } catch (e) { console.error('Failed to parse design JSON:', e); } }, [designJson]); const handleDelete = () => { if (!selectedId) return; setElements((els) => els.filter((el) => el.id !== selectedId)); setSelectedId(null); }; const handleSave = async () => { setSaving(true); try { const stage = stageRef.current; if (!stage) return; const previewUrl = stage.toDataURL({ pixelRatio: 2 }); await fetch(`/api/designs/${designId}/modify`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ designJson: JSON.stringify({ front: elements, back: [] }), designPreviewUrl: previewUrl, }), }); onSave(JSON.stringify({ front: elements, back: [] }), previewUrl); } finally { setSaving(false); } }; const DISPLAY = 560; return (
{ if (e.target === e.target.getStage()) setSelectedId(null); }} > {elements.map((el) => { if (el.type === 'text') { return ( setSelectedId(el.id)} onTap={() => setSelectedId(el.id)} onDragEnd={(e) => { const updated = elements.map((elem) => elem.id === el.id ? { ...elem, x: e.target.x(), y: e.target.y() } : elem ); setElements(updated); }} onTransformEnd={() => { const node = nodeRefs.current.get(el.id); if (node instanceof Konva.Text) { const updated = elements.map((elem) => elem.id === el.id ? { ...elem, x: node.x(), y: node.y(), rotation: node.rotation(), } : elem ); setElements(updated); } }} ref={(node) => { if (node) nodeRefs.current.set(el.id, node); }} /> ); } return null; })} {selectedId && ( newBox} /> )}
{placementPreviewUrl && (

Design on product:

design on product
)}
); }