From a8e52522413c1d37e23b716d70aacd26bd333b27 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 29 Mar 2026 09:47:21 +0800 Subject: [PATCH] fix: restore psd text layer inline editing --- .../agents/AgentPsdTemplateEditorDialog.tsx | 98 ++++++++++++++----- 1 file changed, 75 insertions(+), 23 deletions(-) diff --git a/components/agents/AgentPsdTemplateEditorDialog.tsx b/components/agents/AgentPsdTemplateEditorDialog.tsx index e647a4204..22cb28a64 100644 --- a/components/agents/AgentPsdTemplateEditorDialog.tsx +++ b/components/agents/AgentPsdTemplateEditorDialog.tsx @@ -200,6 +200,7 @@ export function AgentPsdTemplateEditorDialog({ const previewViewportRef = useRef(null); const uploadInputRef = useRef(null); + const inlineTextEditorRef = useRef(null); const selectedTemplate = useMemo( () => templates.find((template) => template.id === selectedTemplateId) || null, @@ -234,6 +235,20 @@ export function AgentPsdTemplateEditorDialog({ () => orderedPreviewLayers.filter((layer) => layer.isEditable), [orderedPreviewLayers] ); + const orderedEditableImageLayers = useMemo( + () => + orderedEditableLayers.filter( + (layer): layer is AgentPsdTemplateImageLayerSlot => isAgentPsdImageLayerSlot(layer) + ), + [orderedEditableLayers] + ); + const orderedEditableTextLayers = useMemo( + () => + orderedEditableLayers.filter( + (layer): layer is AgentPsdTemplateTextLayerSlot => isAgentPsdTextLayerSlot(layer) + ), + [orderedEditableLayers] + ); const shouldShowCompositeFallback = useMemo( () => orderedPreviewLayers.some((layer) => !String(layer.sourceUrl || "").trim()), [orderedPreviewLayers] @@ -329,6 +344,23 @@ export function AgentPsdTemplateEditorDialog({ }; }, [selectedTemplate]); + useEffect(() => { + if (!selectedTextLayer) { + return; + } + + const textarea = inlineTextEditorRef.current; + if (!textarea) { + return; + } + + requestAnimationFrame(() => { + textarea.focus(); + const valueLength = textarea.value.length; + textarea.setSelectionRange(valueLength, valueLength); + }); + }, [selectedTextLayer?.id]); + async function handleSlotUpload(slotId: string, event: ChangeEvent) { const file = event.target.files?.[0]; if (!file) return; @@ -628,11 +660,45 @@ export function AgentPsdTemplateEditorDialog({
- {orderedEditableLayers.map((layer) => { + {orderedEditableImageLayers.map((layer) => { + const isSelected = selectedLayerId === layer.id; + const frameStyle = getLayerFrameStyle(layer, isSelected); + const hasAssignedImage = Boolean( + String(effectiveImageAssignments[layer.id] || "").trim() + ); + + return ( + + ); + })} + + {orderedEditableTextLayers.map((layer) => { const isSelected = selectedLayerId === layer.id; const frameStyle = getLayerFrameStyle(layer, isSelected); - if (isAgentPsdTextLayerSlot(layer) && isSelected) { + if (isSelected) { return (