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 { 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
};
} }