- Pathfinder.setBlocked: remove blocked.clear() to preserve wall tiles set by setWalls() - Pathfinder.findPath: fix dead-code goal exception — remove redundant isBlocked check, keep goal-tile exception in single guard - OfficeRenderer: track mouseDownPos/_wasDragging; expose wasDragging() method for click-after-drag suppression - OfficeRenderer._render: track _lastDpr to detect monitor DPR changes; use setTransform instead of scale to avoid accumulation - TileMap.render: use clientWidth/clientHeight for viewport culling (CSS space, not buffer pixels) - TaskTab: wrap JSON.parse in try/catch to prevent crash on malformed result_data Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
65 lines
1.7 KiB
JavaScript
65 lines
1.7 KiB
JavaScript
// src/pages/agent-office/hooks/useOfficeCanvas.js
|
|
import { useRef, useEffect, useCallback } from 'react';
|
|
import { OfficeRenderer } from '../canvas/OfficeRenderer.js';
|
|
|
|
export function useOfficeCanvas() {
|
|
const canvasRef = useRef(null);
|
|
const rendererRef = useRef(null);
|
|
|
|
useEffect(() => {
|
|
if (!canvasRef.current) return;
|
|
|
|
const renderer = new OfficeRenderer(canvasRef.current);
|
|
rendererRef.current = renderer;
|
|
renderer.start();
|
|
|
|
const handleResize = () => renderer.resize();
|
|
window.addEventListener('resize', handleResize);
|
|
|
|
return () => {
|
|
window.removeEventListener('resize', handleResize);
|
|
renderer.destroy();
|
|
rendererRef.current = null;
|
|
};
|
|
}, []);
|
|
|
|
const updateAgentState = useCallback((agentId, state, detail) => {
|
|
rendererRef.current?.updateAgentState(agentId, state, detail);
|
|
}, []);
|
|
|
|
const setAgentNotification = useCallback((agentId, count) => {
|
|
rendererRef.current?.setAgentNotification(agentId, count);
|
|
}, []);
|
|
|
|
const setTheme = useCallback((themeName) => {
|
|
rendererRef.current?.setTheme(themeName);
|
|
}, []);
|
|
|
|
const setZoom = useCallback((level) => {
|
|
rendererRef.current?.setZoom(level);
|
|
}, []);
|
|
|
|
const hitTest = useCallback((clientX, clientY) => {
|
|
return rendererRef.current?.hitTest(clientX, clientY) || { type: 'empty' };
|
|
}, []);
|
|
|
|
const getZoom = useCallback(() => {
|
|
return rendererRef.current?.zoom || 2;
|
|
}, []);
|
|
|
|
const wasDragging = useCallback(() => {
|
|
return rendererRef.current?.wasDragging?.() || false;
|
|
}, []);
|
|
|
|
return {
|
|
canvasRef,
|
|
updateAgentState,
|
|
setAgentNotification,
|
|
setTheme,
|
|
setZoom,
|
|
hitTest,
|
|
getZoom,
|
|
wasDragging
|
|
};
|
|
}
|