useMouseDeltaHooks

    0

    0

    The useMouseDelta() function is used to animate the width of an element based on mouse movements. The function first initializes state variables to false values to indicate that no dragging is going on. Then, it uses useState() to store the current width of the element and the initial width. Using useRef(), the function stores the origin of the element as the currentWidth. The function then creates two callbacks, handleMouseDown and handleMouseUp. When a mouse event is received, the function sets the dragging state to true and calls the corresponding callback. The function then sets the result state to the currentWidth plus the mouse clientX position. Finally, the function returns the result state.

    const useMouseDelta = (initialWidth) => {
      // The distance the mouse has moved since `mousedown`.
      const [dragging, setDragging] = useState(false);
      const [result, setResult] = useState(initialWidth);
      const [currentWidth, setCurrentWidth] = useState(initialWidth);
    
      // Original position independent of any dragging.  Updated when done dragging.
      const origin = useRef(initialWidth);
    
      const handleMouseDown = useCallback((e) => {
        origin.current = e.clientX;
        setDragging(true);
      }, []);
    
      const handleMouseUp = useCallback(
        (e) => {
          setDragging(false);
          setCurrentWidth(result);
        },
        [result]
      );
    
      const handleMouseMove = useCallback(
        (e) => {
          if (!dragging) {
            return;
          }
          setResult(() => currentWidth + e.clientX - origin.current);
        },
        [currentWidth, dragging]
      );
    
      useEffect(() => {
        window.addEventListener("mousedown", handleMouseDown);
        window.addEventListener("mouseup", handleMouseUp);
        window.addEventListener("mousemove", handleMouseMove);
        return () => {
          window.removeEventListener("mousedown", handleMouseDown);
          window.removeEventListener("mouseup", handleMouseUp);
          window.removeEventListener("mousemove", handleMouseMove);
        };
      }, [dragging, handleMouseDown, handleMouseUp, handleMouseMove]);
    
      return result;
    };
    
    Codiga Logo
    Codiga Hub
    • Rulesets
    • Playground
    • Snippets
    • Cookbooks
    soc-2 icon

    We are SOC-2 Compliance Certified

    G2 high performer medal

    Codiga – All rights reserved 2022.