sandbox/background-move/src/components/viewport.tsx

103 lines
2.5 KiB
TypeScript
Raw Normal View History

2022-09-08 13:00:36 +00:00
import react, { useCallback, useMemo, useState } from 'react';
2022-09-07 21:19:42 +00:00
import _ from 'lodash';
import Background from './background';
import '../theme/viewport.css';
const Viewport: react.FC<{}> = (props: {}) => {
2022-09-08 13:00:36 +00:00
console.log(`--- Rendering viewport, props: ${JSON.stringify(props)} ---`);
2022-09-07 21:19:42 +00:00
const [shift, setShift] = useState({ x: 1000, y: 1000 });
const initialMouseState = {
down: false,
starting: { x: -1, y: -1 },
};
const [mouseState, setMouseState] = useState(initialMouseState);
2022-09-08 13:00:36 +00:00
console.log('viewport, mouseState: ' + JSON.stringify(mouseState));
2022-09-07 21:19:42 +00:00
const genericHandler = (event: any) => {
console.log('Log - Event: ' + event.type);
2022-09-08 13:00:36 +00:00
console.log(`Mouse : ${event.pageX}, ${event.pageY}`);
console.log('mouseState: ' + JSON.stringify(mouseState));
2022-09-07 21:19:42 +00:00
};
2022-09-08 13:35:39 +00:00
// TODO: implement resize event
2022-09-08 13:00:36 +00:00
// TODO: check boundaries
2022-09-07 21:19:42 +00:00
const mouseDownHandler = (event: any) => {
2022-09-08 13:00:36 +00:00
genericHandler(event);
2022-09-07 21:19:42 +00:00
event.preventDefault();
setMouseState({
down: true,
starting: { x: event.pageX, y: event.pageY },
});
};
2022-09-08 13:35:39 +00:00
const mouseLeaveHandler = (event: any) => {
genericHandler(event);
event.preventDefault();
throtteledMouseMoveHandler.cancel();
setMouseState(initialMouseState);
};
2022-09-07 21:19:42 +00:00
const mouseUpHandler = (event: any) => {
2022-09-08 13:00:36 +00:00
genericHandler(event);
2022-09-07 21:19:42 +00:00
event.preventDefault();
setMouseState(initialMouseState);
};
const mouseMoveHandler = (event: any) => {
event.preventDefault();
if (mouseState.down) {
genericHandler(event);
2022-09-08 13:00:36 +00:00
// setShift((shift) => ({
// x: shift.x + (mouseState.starting.x - event.pageX),
// y: shift.y + (mouseState.starting.y - event.pageY),
// }));
// setMouseState((mouseState) => ({
// down: true,
// starting: {
// x: event.pageX,
// y: event.pageY,
// },
// }));
setShift({
2022-09-07 21:19:42 +00:00
x: shift.x + (mouseState.starting.x - event.pageX),
y: shift.y + (mouseState.starting.y - event.pageY),
2022-09-08 13:00:36 +00:00
});
setMouseState({
2022-09-07 21:19:42 +00:00
down: true,
starting: {
x: event.pageX,
y: event.pageY,
},
2022-09-08 13:00:36 +00:00
});
2022-09-07 21:19:42 +00:00
}
};
2022-09-08 13:00:36 +00:00
const throtteledMouseMoveHandler = useCallback(
_.throttle(mouseMoveHandler, 50),
[mouseState.down]
2022-09-07 21:19:42 +00:00
);
return (
<div
className='viewport'
onMouseDown={mouseDownHandler}
onMouseMove={throtteledMouseMoveHandler}
onMouseUp={mouseUpHandler}
2022-09-08 13:35:39 +00:00
onMouseLeave={mouseLeaveHandler}
2022-09-07 21:19:42 +00:00
>
<Background shift={shift} />
</div>
);
};
export default Viewport;