import react, { useState } from 'react'; import Viewport from './Viewport'; interface MouseHandlerProperties { boardSize: number; shift: { x: number; y: number }; zoom: number; } const MouseHandler: react.FC = ( props: MouseHandlerProperties ) => { const initialMouseState = { down: false, starting: { x: -1, y: -1 }, timestamp: 0, }; const [mouseState, setMouseState] = useState(initialMouseState); const [shift, setShift] = useState(props.shift); const [zoom, setZoom] = useState(props.zoom); console.log('MouseHandler, mouseState: ' + JSON.stringify(mouseState)); console.log( 'MouseHandler, shift: ' + JSON.stringify(shift) + ', zoom:' + zoom ); const genericHandler = (event: any) => { console.log(`Log - Event: ${event.type}`); if (event.pageX !== undefined) { console.log( `Mouse : ${event.pageX}, ${event.pageY}, target: ${event.target}` ); console.log( `mouseState: ' ${JSON.stringify(mouseState)} (+${ Date.now() - mouseState.timestamp }ms) ` ); return; } }; const mouseLeaveHandler = (event: any) => { genericHandler(event); setMouseState(initialMouseState); }; const mouseDownHandler = (event: any) => { genericHandler(event); setMouseState({ down: true, starting: { x: event.pageX, y: event.pageY }, timestamp: Date.now(), }); }; const mouseUpHandler = (event: any) => { genericHandler(event); setMouseState(initialMouseState); }; const mouseMoveHandler = (event: any) => { if (mouseState.down && Date.now() - mouseState.timestamp > 5) { genericHandler(event); console.log( `dispatch ${JSON.stringify({ x: event.pageX - mouseState.starting.x, y: event.pageY - mouseState.starting.y, })}` ); setShift({ x: shift.x + (event.pageX - mouseState.starting.x), y: shift.y + (event.pageY - mouseState.starting.y), }); setMouseState({ down: true, starting: { x: event.pageX, y: event.pageY, }, timestamp: Date.now(), }); } }; const doubleClickHandler = (event: any) => { genericHandler(event); const newZoom = zoom * Math.SQRT2; setShift({ x: shift.x + (shift.x - event.pageX) * (newZoom / zoom - 1), y: shift.y + (shift.y - event.pageY) * (newZoom / zoom - 1), }); setZoom(newZoom); }; return (
); }; export default MouseHandler;