Skip to content
Snippets Groups Projects
BlankOverlay.tsx 2.12 KiB
Newer Older
Grant's avatar
Grant committed
import { useEffect, useRef } from "react";
import { useAppContext } from "../../contexts/AppContext";
import { Canvas } from "../../lib/canvas";
import { KeybindManager } from "../../lib/keybinds";

Grant's avatar
Grant committed
export const BlankOverlay = () => {
  const { config, blankOverlay, setBlankOverlay } = useAppContext();
Grant's avatar
Grant committed
  const canvasRef = useRef<HTMLCanvasElement | null>(null);

  useEffect(() => {
    const handleKeybind = () => {
Grant's avatar
Grant committed
      setBlankOverlay((v) => ({ ...v, enabled: !v.enabled }));
Grant's avatar
Grant committed
    KeybindManager.on("TOGGLE_BLANK", handleKeybind);
Grant's avatar
Grant committed

    return () => {
Grant's avatar
Grant committed
      KeybindManager.off("TOGGLE_BLANK", handleKeybind);
Grant's avatar
Grant committed
    };
Grant's avatar
Grant committed
  }, [setBlankOverlay]);
Grant's avatar
Grant committed

  useEffect(() => {
    if (!config) {
Grant's avatar
Grant committed
      console.warn("[BlankOverlay] config is not defined");
Grant's avatar
Grant committed
      return;
    }
    if (!canvasRef.current) {
Grant's avatar
Grant committed
      console.warn("[BlankOverlay] canvasRef is not defined");
Grant's avatar
Grant committed
      return;
    }

    const [width, height] = config.canvas.size;

    canvasRef.current.width = width;
    canvasRef.current.height = height;
  }, [config]);

  useEffect(() => {
    if (!canvasRef.current) {
Grant's avatar
Grant committed
      console.warn("[BlankOverlay] canvasRef is not defined");
Grant's avatar
Grant committed
      return;
    }

    const updateVirginmap = () => {
      const ctx = canvasRef.current!.getContext("2d");
      if (!ctx) {
Grant's avatar
Grant committed
        console.warn("[BlankOverlay] canvas context cannot be aquired");
Grant's avatar
Grant committed
        return;
      }

      ctx.clearRect(0, 0, canvasRef.current!.width, canvasRef.current!.height);

      const pixels = Canvas.instance!.getAllPixels();
      for (const pixel of pixels) {
        if (pixel.color !== -1) continue;

        ctx.fillStyle = "rgba(0,140,0,0.5)";
        ctx.fillRect(pixel.x, pixel.y, 1, 1);
      }
    };

    var updateInterval = setInterval(updateVirginmap, 1000);

    return () => {
      clearInterval(updateInterval);
    };
  }, [canvasRef]);

  return (
    <canvas
Grant's avatar
Grant committed
      id="blank-overlay"
Grant's avatar
Grant committed
      className="board-overlay no-interact pixelate"
      ref={(r) => (canvasRef.current = r)}
      width="1000"
      height="1000"
      style={{
Grant's avatar
Grant committed
        display: blankOverlay.enabled ? "block" : "none",
        opacity: blankOverlay.opacity.toFixed(1),
Grant's avatar
Grant committed
      }}
    />
  );
};