From 7db61d853373aef989e53c486787d81f45e07357 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 2 Feb 2026 12:12:13 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=AF=86=E5=88=AB=E6=88=90=E5=8A=9F?= =?UTF-8?q?=E5=90=8E=E7=9B=B4=E6=8E=A5=E6=B7=BB=E5=8A=A0=E5=88=B0=E5=AF=B9?= =?UTF-8?q?=E8=AF=9D=E6=A1=86=EF=BC=8C=E5=8E=BB=E6=8E=89=E7=A1=AE=E8=AE=A4?= =?UTF-8?q?=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/canvas/ObjectPickerOverlay.tsx | 104 ++++------------------ 1 file changed, 19 insertions(+), 85 deletions(-) diff --git a/components/canvas/ObjectPickerOverlay.tsx b/components/canvas/ObjectPickerOverlay.tsx index 9b82ed576..0ed736cc2 100644 --- a/components/canvas/ObjectPickerOverlay.tsx +++ b/components/canvas/ObjectPickerOverlay.tsx @@ -2,7 +2,7 @@ import React, { useState, useRef, useCallback } from "react"; import { createPortal } from "react-dom"; -import { X, Loader2, Check, RefreshCw, Crosshair } from "lucide-react"; +import { X, Loader2, Crosshair } from "lucide-react"; import { Button } from "@/components/ui/button"; import { useCanvasStore, type PickedObject } from "@/store/canvas"; import { toast } from "sonner"; @@ -13,10 +13,8 @@ export function ObjectPickerOverlay() { const isPickerMode = useCanvasStore((state) => state.isPickerMode); const pickerTargetNodeId = useCanvasStore((state) => state.pickerTargetNodeId); const isPickerLoading = useCanvasStore((state) => state.isPickerLoading); - const pickedObject = useCanvasStore((state) => state.pickedObject); const setPickerMode = useCanvasStore((state) => state.setPickerMode); const setPickerLoading = useCanvasStore((state) => state.setPickerLoading); - const setPickedObject = useCanvasStore((state) => state.setPickedObject); const addPendingPickedObject = useCanvasStore((state) => state.addPendingPickedObject); const getNode = useCanvasStore((state) => state.getNode); @@ -27,7 +25,7 @@ export function ObjectPickerOverlay() { const targetNode = pickerTargetNodeId ? getNode(pickerTargetNodeId) : null; const imageUrl = targetNode?.type === 'image' ? (targetNode.data as any)?.src as string | undefined : undefined; - // 处理图片点击 + // 处理图片点击 - 识别成功后直接添加到对话框 const handleImageClick = useCallback(async (e: React.MouseEvent) => { if (isPickerLoading || !imageUrl || !pickerTargetNodeId) return; @@ -43,12 +41,12 @@ export function ObjectPickerOverlay() { setPickerLoading(true); try { - // 直接使用图片 URL 调用 API(不再压缩为 Base64) + // 直接使用原始图片 URL 调用 API(无任何标记) const response = await fetch('/api/pick-object', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ - imageUrl, // 直接发送图片 URL + imageUrl, // 原始图片 URL,无标记 clickX, clickY, }), @@ -61,7 +59,7 @@ export function ObjectPickerOverlay() { const result = await response.json(); if (result.success && result.object) { - // 设置识别结果 + // 构建拾取结果 const picked: PickedObject = { imageUrl, imageNodeId: pickerTargetNodeId, @@ -72,8 +70,14 @@ export function ObjectPickerOverlay() { confidence: result.object.confidence, boundingBox: result.object.boundingBox, }; - setPickedObject(picked); - toast.success(`识别成功: ${result.object.name}`); + + // 直接添加到对话框,不询问确认 + addPendingPickedObject(picked); + toast.success(`已添加: ${result.object.name}`); + + // 关闭拾取模式 + setPickerMode(false); + setClickPosition(null); } else { toast.error(result.error || '未能识别物品'); setClickPosition(null); @@ -85,23 +89,7 @@ export function ObjectPickerOverlay() { } finally { setPickerLoading(false); } - }, [imageUrl, isPickerLoading, pickerTargetNodeId, setPickerLoading, setPickedObject]); - - // 确认添加到对话 - const handleConfirm = useCallback(() => { - if (pickedObject) { - addPendingPickedObject(pickedObject); - toast.success('已添加到对话框'); - setPickerMode(false); - setClickPosition(null); - } - }, [pickedObject, addPendingPickedObject, setPickerMode]); - - // 重新选择 - const handleRetry = useCallback(() => { - setPickedObject(null); - setClickPosition(null); - }, [setPickedObject]); + }, [imageUrl, isPickerLoading, pickerTargetNodeId, setPickerLoading, addPendingPickedObject, setPickerMode]); // 关闭拾取模式 const handleClose = useCallback(() => { @@ -126,7 +114,7 @@ export function ObjectPickerOverlay() {
- {isPickerLoading ? '正在识别...' : pickedObject ? '识别完成' : '点击图片中的物品进行拾取'} + {isPickerLoading ? '正在识别...' : '点击图片中的物品进行拾取'} - -
- - )} , document.body );