refactor(agent-office): rewrite useOfficeCanvas hook for new renderer API
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,74 +1,59 @@
|
|||||||
|
// src/pages/agent-office/hooks/useOfficeCanvas.js
|
||||||
import { useRef, useEffect, useCallback } from 'react';
|
import { useRef, useEffect, useCallback } from 'react';
|
||||||
import { OfficeRenderer } from '../canvas/OfficeRenderer';
|
import { OfficeRenderer } from '../canvas/OfficeRenderer.js';
|
||||||
import officeMap from '../assets/office-map.json';
|
|
||||||
|
|
||||||
export function useOfficeCanvas(containerRef, onAgentClick, onCeoClick) {
|
export function useOfficeCanvas() {
|
||||||
|
const canvasRef = useRef(null);
|
||||||
const rendererRef = useRef(null);
|
const rendererRef = useRef(null);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!containerRef.current) return;
|
if (!canvasRef.current) return;
|
||||||
|
|
||||||
const canvas = document.createElement('canvas');
|
const renderer = new OfficeRenderer(canvasRef.current);
|
||||||
canvas.style.display = 'block';
|
|
||||||
canvas.style.width = '100%';
|
|
||||||
canvas.style.height = '100%';
|
|
||||||
canvas.style.imageRendering = 'pixelated';
|
|
||||||
containerRef.current.appendChild(canvas);
|
|
||||||
|
|
||||||
const renderer = new OfficeRenderer(canvas, officeMap);
|
|
||||||
rendererRef.current = renderer;
|
rendererRef.current = renderer;
|
||||||
|
|
||||||
const resize = () => {
|
|
||||||
const rect = containerRef.current.getBoundingClientRect();
|
|
||||||
renderer.resize(rect.width, rect.height);
|
|
||||||
};
|
|
||||||
|
|
||||||
resize();
|
|
||||||
renderer.start();
|
renderer.start();
|
||||||
|
|
||||||
renderer.setOnClick((agentId) => {
|
const handleResize = () => renderer.resize();
|
||||||
if (onAgentClick) onAgentClick(agentId);
|
window.addEventListener('resize', handleResize);
|
||||||
});
|
|
||||||
|
|
||||||
renderer.setOnCeoClick(() => {
|
|
||||||
if (onCeoClick) onCeoClick();
|
|
||||||
});
|
|
||||||
|
|
||||||
const handleClick = (e) => {
|
|
||||||
const rect = canvas.getBoundingClientRect();
|
|
||||||
const x = e.clientX - rect.left;
|
|
||||||
const y = e.clientY - rect.top;
|
|
||||||
renderer.handleClick(x, y);
|
|
||||||
};
|
|
||||||
|
|
||||||
canvas.addEventListener('click', handleClick);
|
|
||||||
window.addEventListener('resize', resize);
|
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
renderer.stop();
|
window.removeEventListener('resize', handleResize);
|
||||||
canvas.removeEventListener('click', handleClick);
|
renderer.destroy();
|
||||||
window.removeEventListener('resize', resize);
|
rendererRef.current = null;
|
||||||
if (containerRef.current && canvas.parentNode === containerRef.current) {
|
|
||||||
containerRef.current.removeChild(canvas);
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}, [containerRef, onAgentClick, onCeoClick]);
|
}, []);
|
||||||
|
|
||||||
const updateAgentState = useCallback((agentId, state, detail) => {
|
const updateAgentState = useCallback((agentId, state, detail) => {
|
||||||
rendererRef.current?.updateAgentState(agentId, state, detail);
|
rendererRef.current?.updateAgentState(agentId, state, detail);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const moveAgent = useCallback((agentId, target) => {
|
|
||||||
rendererRef.current?.moveAgent(agentId, target);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const setAgentNotification = useCallback((agentId, count) => {
|
const setAgentNotification = useCallback((agentId, count) => {
|
||||||
rendererRef.current?.setAgentNotification(agentId, count);
|
rendererRef.current?.setAgentNotification(agentId, count);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const setCeoDocBadge = useCallback((count) => {
|
const setTheme = useCallback((themeName) => {
|
||||||
rendererRef.current?.setCeoDocBadge(count);
|
rendererRef.current?.setTheme(themeName);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
return { updateAgentState, moveAgent, setAgentNotification, setCeoDocBadge };
|
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;
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return {
|
||||||
|
canvasRef,
|
||||||
|
updateAgentState,
|
||||||
|
setAgentNotification,
|
||||||
|
setTheme,
|
||||||
|
setZoom,
|
||||||
|
hitTest,
|
||||||
|
getZoom
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user