Skip to content
Snippets Groups Projects
CanvasWrapper.tsx 1.47 KiB
Newer Older
Grant's avatar
Grant committed
import React, { createRef, useContext, useEffect } from "react";
Grant's avatar
Grant committed
import { Canvas } from "../lib/canvas";
import { useAppContext } from "../contexts/AppContext";
import { PanZoomWrapper } from "@sc07-canvas/lib/src/renderer";
Grant's avatar
Grant committed
import { RendererContext } from "@sc07-canvas/lib/src/renderer/RendererContext";
Grant's avatar
Grant committed

export const CanvasWrapper = () => {
  // to prevent safari from blurring things, use the zoom css property
  return (
    <main>
      <PanZoomWrapper>
        <CanvasInner />
      </PanZoomWrapper>
Grant's avatar
Grant committed
    </main>
  );
};

const CanvasInner = () => {
  const canvasRef = createRef<HTMLCanvasElement>();
  const { config } = useAppContext();
Grant's avatar
Grant committed
  const PanZoom = useContext(RendererContext);
  // 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)
  // );
Grant's avatar
Grant committed

  useEffect(() => {
    if (!config.canvas || !canvasRef.current) return;
    const canvas = canvasRef.current!;
Grant's avatar
Grant committed
    const canvasInstance = new Canvas(config, canvas, PanZoom);
    // centerView();
Grant's avatar
Grant committed

    return () => {
      canvasInstance.destroy();
    };
  }, [canvasRef, config]);
Grant's avatar
Grant committed

  return (
    <canvas
      id="board"
      width="1000"
      height="1000"
      className="pixelate"
      ref={canvasRef}
    ></canvas>
  );
};