Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import React, { createRef, useEffect } from "react";
import {
TransformComponent,
TransformWrapper,
useControls,
useTransformEffect,
} from "react-zoom-pan-pinch";
import { Canvas } from "../lib/canvas";
import { useAppContext } from "../contexts/AppContext";
import throttle from "lodash.throttle";
export const CanvasWrapper = () => {
// to prevent safari from blurring things, use the zoom css property
return (
<main>
<TransformWrapper
centerOnInit
limitToBounds={false}
centerZoomedOut={false}
minScale={0.5}
maxScale={50}
wheel={{
step: 0.05,
smoothStep: 0.05,
}}
initialScale={5}
panning={{
velocityDisabled: true,
}}
doubleClick={{
disabled: true,
}}
>
<TransformComponent wrapperStyle={{ width: "100%", height: "100%" }}>
<CanvasInner />
</TransformComponent>
</TransformWrapper>
</main>
);
};
const CanvasInner = () => {
const canvasRef = createRef<HTMLCanvasElement>();
const { config } = useAppContext();
const { centerView } = useControls();
useTransformEffect(
throttle(({ state, instance }) => {
const params = new URLSearchParams();
params.set("x", state.positionX + "");
params.set("y", state.positionY + "");
params.set("zoom", state.scale + "");
window.location.hash = params.toString();
}, 1000)
);
useEffect(() => {
if (!config.canvas || !canvasRef.current) return;
const canvas = canvasRef.current!;
const canvasInstance = new Canvas(config, canvas);
centerView();
return () => {
canvasInstance.destroy();
};
}, [canvasRef, centerView, config]);
return (
<canvas
id="board"
width="1000"
height="1000"
className="pixelate"
ref={canvasRef}
></canvas>
);
};