|
|
@ -1,12 +1,16 @@ |
|
|
import React, { useRef, useEffect, useState, useCallback } from "react"; |
|
|
import React, { useRef, useEffect, useState, useCallback } from "react"; |
|
|
import { useWebSocket } from "../actions/websocket.jsx"; |
|
|
import { useWebSocket } from "../actions/websocket.jsx"; |
|
|
import { message } from "antd"; |
|
|
import { message } from "antd"; |
|
|
import { useTargetStorage } from "../hooks/useTargetStorage.js"; |
|
|
// import { useTargetStorage } from "../hooks/useTargetStorage.js"; |
|
|
|
|
|
|
|
|
const CameraView = ({ |
|
|
const CameraView = ({ |
|
|
selectedTargetId, |
|
|
selectedTargetId, |
|
|
onClearSelection, |
|
|
onClearSelection, |
|
|
onRectangleClick, |
|
|
onRectangleClick, |
|
|
selectedTemplate, |
|
|
selectedTemplate, |
|
|
|
|
|
targets = [], |
|
|
|
|
|
targetsLoading = false, |
|
|
|
|
|
onRefreshTargets, |
|
|
}) => { |
|
|
}) => { |
|
|
const imgRef = useRef(null); |
|
|
const imgRef = useRef(null); |
|
|
const canvasRef = useRef(null); |
|
|
const canvasRef = useRef(null); |
|
|
@ -43,8 +47,8 @@ const CameraView = ({ |
|
|
// 使用WebSocket连接 |
|
|
// 使用WebSocket连接 |
|
|
const { isConnected, sendMessage } = useWebSocket(); |
|
|
const { isConnected, sendMessage } = useWebSocket(); |
|
|
|
|
|
|
|
|
// 使用标靶数据管理Hook |
|
|
// 从 props 接收标靶数据,而不是调用 Hook |
|
|
const { targets, loading, refreshTargets } = useTargetStorage(); |
|
|
// const { targets, loading, refreshTargets } = useTargetStorage(); |
|
|
|
|
|
|
|
|
const minScale = 0.2; |
|
|
const minScale = 0.2; |
|
|
const maxScale = 4.0; |
|
|
const maxScale = 4.0; |
|
|
@ -797,7 +801,9 @@ const CameraView = ({ |
|
|
|
|
|
|
|
|
// 保存成功后刷新标靶列表数据 |
|
|
// 保存成功后刷新标靶列表数据 |
|
|
setTimeout(() => { |
|
|
setTimeout(() => { |
|
|
refreshTargets(); |
|
|
if (onRefreshTargets) { |
|
|
|
|
|
onRefreshTargets(); |
|
|
|
|
|
} |
|
|
}, 500); // 延迟500ms确保服务器处理完成 |
|
|
}, 500); // 延迟500ms确保服务器处理完成 |
|
|
|
|
|
|
|
|
// 清除选中状态 |
|
|
// 清除选中状态 |
|
|
@ -822,7 +828,7 @@ const CameraView = ({ |
|
|
rectangles, |
|
|
rectangles, |
|
|
isConnected, |
|
|
isConnected, |
|
|
sendMessage, |
|
|
sendMessage, |
|
|
refreshTargets, |
|
|
onRefreshTargets, |
|
|
onClearSelection, |
|
|
onClearSelection, |
|
|
isSaving, |
|
|
isSaving, |
|
|
]); |
|
|
]); |
|
|
@ -882,12 +888,12 @@ const CameraView = ({ |
|
|
useEffect(() => { |
|
|
useEffect(() => { |
|
|
// console.log("targets 或 loading 状态变化:", { |
|
|
// console.log("targets 或 loading 状态变化:", { |
|
|
// targets, |
|
|
// targets, |
|
|
// loading, |
|
|
// targetsLoading, |
|
|
// targetsLength: targets?.length, |
|
|
// targetsLength: targets?.length, |
|
|
// }); |
|
|
// }); |
|
|
|
|
|
|
|
|
if ( |
|
|
if ( |
|
|
!loading && |
|
|
!targetsLoading && |
|
|
targets && |
|
|
targets && |
|
|
targets.length > 0 && |
|
|
targets.length > 0 && |
|
|
videoNaturalWidth > 0 && |
|
|
videoNaturalWidth > 0 && |
|
|
@ -943,7 +949,7 @@ const CameraView = ({ |
|
|
redrawAllRectangles(); |
|
|
redrawAllRectangles(); |
|
|
}, 100); |
|
|
}, 100); |
|
|
return () => clearTimeout(timeoutId); |
|
|
return () => clearTimeout(timeoutId); |
|
|
} else if (!loading && (!targets || targets.length === 0)) { |
|
|
} else if (!targetsLoading && (!targets || targets.length === 0)) { |
|
|
// 如果没有标靶数据,清空矩形框 |
|
|
// 如果没有标靶数据,清空矩形框 |
|
|
// console.log( |
|
|
// console.log( |
|
|
// "标靶数据为空,准备清空矩形框,当前矩形框数量:", |
|
|
// "标靶数据为空,准备清空矩形框,当前矩形框数量:", |
|
|
@ -952,7 +958,7 @@ const CameraView = ({ |
|
|
setRectangles([]); |
|
|
setRectangles([]); |
|
|
// console.log("标靶数据为空,已清空矩形框"); |
|
|
// console.log("标靶数据为空,已清空矩形框"); |
|
|
} |
|
|
} |
|
|
}, [targets, loading, videoNaturalWidth, videoNaturalHeight]); // 只依赖targets和loading状态 |
|
|
}, [targets, targetsLoading, videoNaturalWidth, videoNaturalHeight]); |
|
|
|
|
|
|
|
|
// 专门监听rectangles变化并重绘 |
|
|
// 专门监听rectangles变化并重绘 |
|
|
useEffect(() => { |
|
|
useEffect(() => { |
|
|
|