diff --git a/src/components/canvas/Canvas.tsx b/src/components/canvas/Canvas.tsx index 9f34ee6..0d9dc20 100644 --- a/src/components/canvas/Canvas.tsx +++ b/src/components/canvas/Canvas.tsx @@ -3,6 +3,7 @@ import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } import * as PIXI from "pixi.js"; import { Container, Stage } from "@pixi/react"; +import { CanvasContext } from "@/context/Canvas"; import { ImageContext } from "@/context/Image"; import { SettingsContext } from "@/context/Settings"; import { TexturesContext } from "@/context/Textures"; @@ -22,6 +23,7 @@ import welcomeBlocksData from "@/data/welcome.json"; PIXI.settings.SCALE_MODE = PIXI.SCALE_MODES.NEAREST; function Canvas() { + const { canvasSize, blocks, setBlocks } = useContext(CanvasContext); const { image, imageDimensions } = useContext(ImageContext); const { settings } = useContext(SettingsContext); const textures = useContext(TexturesContext); @@ -37,8 +39,6 @@ function Canvas() { const [mouseCoords, setMouseCoords] = useState({ x: 0, y: 0 }); const [dragging, setDragging] = useState(false); - const [blocks, setBlocks] = useState([]); - const [holdingAlt, setHoldingAlt] = useState(false); const [oldTool, setOldTool] = useState("hand"); @@ -46,27 +46,6 @@ function Canvas() { return blocks.filter((b) => !(b.x === mouseCoords.x && b.y === mouseCoords.y)); }, [blocks, mouseCoords]); - const canvasSize = useMemo(() => { - let minX = Infinity, - maxX = -Infinity; - let minY = Infinity, - maxY = -Infinity; - - blocks.forEach((coord) => { - if (coord.x < minX) minX = coord.x; - if (coord.x > maxX) maxX = coord.x; - if (coord.y < minY) minY = coord.y; - if (coord.y > maxY) maxY = coord.y; - }); - - return { - minX, - minY, - maxX: maxX + 1, - maxY: maxY + 1, - }; - }, [blocks]); - const visibleArea = useMemo(() => { const blockSize = 16 * scale; @@ -126,7 +105,7 @@ function Canvas() { setBlocks(updatedBlocks); break; } - }, [tool, mouseCoords, selectedBlock, updatedBlocks]); + }, [tool, mouseCoords, selectedBlock, updatedBlocks, setBlocks]); const onMouseMove = useCallback( (e: React.MouseEvent) => { diff --git a/src/context/Canvas.tsx b/src/context/Canvas.tsx new file mode 100644 index 0000000..db23b24 --- /dev/null +++ b/src/context/Canvas.tsx @@ -0,0 +1,38 @@ +import React, { createContext, ReactNode, useMemo, useState } from "react"; + +interface Props { + children: ReactNode; +} + +export const CanvasContext = createContext({ + canvasSize: { minX: 0, minY: 0, maxX: 0, maxY: 0 }, + blocks: [] as Block[], + setBlocks: ((blocks: Block[]) => {}) as React.Dispatch>, +}); + +export const CanvasProvider = ({ children }: Props) => { + const [blocks, setBlocks] = useState([]); + + const canvasSize = useMemo(() => { + let minX = Infinity, + maxX = -Infinity; + let minY = Infinity, + maxY = -Infinity; + + blocks.forEach((coord) => { + if (coord.x < minX) minX = coord.x; + if (coord.x > maxX) maxX = coord.x; + if (coord.y < minY) minY = coord.y; + if (coord.y > maxY) maxY = coord.y; + }); + + return { + minX, + minY, + maxX: maxX + 1, + maxY: maxY + 1, + }; + }, [blocks]); + + return {children}; +}; diff --git a/src/pages/AppPage.tsx b/src/pages/AppPage.tsx index a8469c9..1684d43 100644 --- a/src/pages/AppPage.tsx +++ b/src/pages/AppPage.tsx @@ -1,3 +1,4 @@ +import { CanvasProvider } from "@/context/Canvas"; import { ImageProvider } from "../context/Image"; import { SettingsProvider } from "../context/Settings"; import { TexturesProvider } from "../context/Textures"; @@ -9,19 +10,21 @@ import Canvas from "../components/canvas/Canvas"; function AppPage() { return ( - - - - -
- - - -
-
-
-
-
+ + + + + +
+ + + +
+
+
+
+
+
); }