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:
2026-04-27 08:38:07 +09:00
parent 22a37cf6d9
commit b03f438935

View File

@@ -1,74 +1,59 @@
// src/pages/agent-office/hooks/useOfficeCanvas.js
import { useRef, useEffect, useCallback } from 'react';
import { OfficeRenderer } from '../canvas/OfficeRenderer';
import officeMap from '../assets/office-map.json';
import { OfficeRenderer } from '../canvas/OfficeRenderer.js';
export function useOfficeCanvas(containerRef, onAgentClick, onCeoClick) {
export function useOfficeCanvas() {
const canvasRef = useRef(null);
const rendererRef = useRef(null);
useEffect(() => {
if (!containerRef.current) return;
if (!canvasRef.current) return;
const canvas = document.createElement('canvas');
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);
const renderer = new OfficeRenderer(canvasRef.current);
rendererRef.current = renderer;
const resize = () => {
const rect = containerRef.current.getBoundingClientRect();
renderer.resize(rect.width, rect.height);
};
resize();
renderer.start();
renderer.setOnClick((agentId) => {
if (onAgentClick) onAgentClick(agentId);
});
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);
const handleResize = () => renderer.resize();
window.addEventListener('resize', handleResize);
return () => {
renderer.stop();
canvas.removeEventListener('click', handleClick);
window.removeEventListener('resize', resize);
if (containerRef.current && canvas.parentNode === containerRef.current) {
containerRef.current.removeChild(canvas);
}
window.removeEventListener('resize', handleResize);
renderer.destroy();
rendererRef.current = null;
};
}, [containerRef, onAgentClick, onCeoClick]);
}, []);
const updateAgentState = useCallback((agentId, state, detail) => {
rendererRef.current?.updateAgentState(agentId, state, detail);
}, []);
const moveAgent = useCallback((agentId, target) => {
rendererRef.current?.moveAgent(agentId, target);
}, []);
const setAgentNotification = useCallback((agentId, count) => {
rendererRef.current?.setAgentNotification(agentId, count);
}, []);
const setCeoDocBadge = useCallback((count) => {
rendererRef.current?.setCeoDocBadge(count);
const setTheme = useCallback((themeName) => {
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
};
}