HOC → high order components

HOC for Cursor Position

Screenshot 2026-01-18 at 7.03.10 PM.png

// use **with** to express enhancing nature of technique
const withSomething = (WrappedComponent) => {
	return (props) => {
		<WrappedComponent {...props} />
	}
}

// define piece of local state to track mouse position
import {useState} from 'react';
// define global listener and window object for mouse move effect
import {useEffect} from 'react';

// HOC
const withMousePosition = (WrappedComponent) => {
	return (props) => {
		// track x + y coordinate of position using local **state**
		const [mousePosition, setMousePosition] = useState({
			x: 0,
			y: 0
		});
		// create window event listener to get x + y position using **effect**
		useEffect(() => {
			// define callback function
			const handleMousePositionChange = (e) => {
				setMousePosition({
					x: e.clientX;
					y: e.clientY;
				});
			};
			// **side effect** -> perform subscribe/unsubscribe logic
			// create event listener
			window.addEventListener("mousemove", handleMousePositionChange);
			//cleanup
			return () => {
				window.removeEventListener("mousemove", handleMousePositionChange);
			};
		}, []);
		// add new mousePosition prop
		return <WrappedComponent {...props} mousePosition={mousePosition} />
	};
};

// presentational components
// const logger = (prop) => {}
const PanelMouseLogger = ({mousePosition}) => {
	if (!mousePosition) return null;
	return (
		<div className="BasicTracker">
			<p>mouse position:</p>
			<div className="Row">
				<span>x: {mousePosition.x}</span>
				<span>y: {mousePosition.y}</span>
			</div>
		</div>
	);
};
const PointMouseLogger = ({mousePosition}) => {
	if (!mousePosition) return null;
	return (
		<p>
			({mousePosition.x}, {mousePosition.y})
		</p>
	);
};

// enhance both components using HOC
const PanelMouseTracker = withMousePosition(PanelMouseLogger);
const PointMouseTracker = withMousePosition(PointMouseLogger);

function App() {
	return (
		<div className="App">
			<header className="Header">HOC Cursor Position Example</header>
			<PanelMouseTracker />
			<PointMouseTracker />
		</div>
	);
}