refactor: move cssCursor from context to canvas component

This commit is contained in:
trafficlunar 2025-01-29 21:04:07 +00:00
parent 8dd7fa684e
commit fd8f4aaca1
2 changed files with 16 additions and 17 deletions

View file

@ -38,7 +38,7 @@ function Canvas() {
const { settings } = useContext(SettingsContext); const { settings } = useContext(SettingsContext);
const { missingTexture } = useContext(TexturesContext); const { missingTexture } = useContext(TexturesContext);
const { isDark } = useContext(ThemeContext); const { isDark } = useContext(ThemeContext);
const { tool, radius, selectedBlock, cssCursor, setTool, setSelectedBlock, setCssCursor } = useContext(ToolContext); const { tool, radius, selectedBlock, setTool, setSelectedBlock } = useContext(ToolContext);
const textures = useTextures(version); const textures = useTextures(version);
const blockData = useBlockData(version); const blockData = useBlockData(version);
@ -53,6 +53,7 @@ function Canvas() {
const holdingAltRef = useRef(false); const holdingAltRef = useRef(false);
const holdingShiftRef = useRef(false); const holdingShiftRef = useRef(false);
const oldToolRef = useRef<Tool>(); const oldToolRef = useRef<Tool>();
const [cssCursor, setCssCursor] = useState("crosshair");
const visibleArea = useMemo(() => { const visibleArea = useMemo(() => {
const blockSize = 16 * scale; const blockSize = 16 * scale;
@ -487,6 +488,18 @@ function Canvas() {
[setCssCursor, setTool] [setCssCursor, setTool]
); );
// Tool cursor handler
useEffect(() => {
const cursorMapping: Partial<Record<Tool, string>> = {
hand: "grab",
move: "move",
zoom: "zoom-in",
};
setCssCursor(cursorMapping[tool] || "crosshair");
}, [tool]);
// Resize canvas handler
useEffect(() => { useEffect(() => {
const container = stageContainerRef.current; const container = stageContainerRef.current;
if (!container) return; if (!container) return;
@ -505,6 +518,7 @@ function Canvas() {
return () => resizeObserver.disconnect(); return () => resizeObserver.disconnect();
}, [stageContainerRef, setStageSize]); }, [stageContainerRef, setStageSize]);
// Window events handler
useEffect(() => { useEffect(() => {
window.addEventListener("keydown", onKeyDown); window.addEventListener("keydown", onKeyDown);
window.addEventListener("keyup", onKeyUp); window.addEventListener("keyup", onKeyUp);

View file

@ -1,14 +1,12 @@
import { createContext, ReactNode, useEffect, useState } from "react"; import { createContext, ReactNode, useState } from "react";
interface Context { interface Context {
tool: Tool; tool: Tool;
radius: number; radius: number;
selectedBlock: string; selectedBlock: string;
cssCursor: string;
setTool: React.Dispatch<React.SetStateAction<Tool>>; setTool: React.Dispatch<React.SetStateAction<Tool>>;
setRadius: React.Dispatch<React.SetStateAction<number>>; setRadius: React.Dispatch<React.SetStateAction<number>>;
setSelectedBlock: React.Dispatch<React.SetStateAction<string>>; setSelectedBlock: React.Dispatch<React.SetStateAction<string>>;
setCssCursor: React.Dispatch<React.SetStateAction<string>>;
} }
interface Props { interface Props {
@ -21,17 +19,6 @@ export const ToolProvider = ({ children }: Props) => {
const [tool, setTool] = useState<Tool>("hand"); const [tool, setTool] = useState<Tool>("hand");
const [radius, setRadius] = useState(1); const [radius, setRadius] = useState(1);
const [selectedBlock, setSelectedBlock] = useState("stone"); const [selectedBlock, setSelectedBlock] = useState("stone");
const [cssCursor, setCssCursor] = useState("crosshair");
useEffect(() => {
const cursorMapping: Partial<Record<Tool, string>> = {
hand: "grab",
move: "move",
zoom: "zoom-in",
};
setCssCursor(cursorMapping[tool] || "crosshair");
}, [tool]);
return ( return (
<ToolContext.Provider <ToolContext.Provider
@ -39,11 +26,9 @@ export const ToolProvider = ({ children }: Props) => {
tool, tool,
radius, radius,
selectedBlock, selectedBlock,
cssCursor,
setTool, setTool,
setRadius, setRadius,
setSelectedBlock, setSelectedBlock,
setCssCursor,
}} }}
> >
{children} {children}