import * as React from "react"; import ReactCursorPosition from "react-cursor-position"; import Vec from "@tldraw/vec"; import { _ } from "lodash"; function usePrevious(value) { const ref = React.useRef(); React.useEffect(() => { ref.current = value; }, [value]); return ref.current; } const renderCursor = ( name, color, x, y, currentPoint, pageState, owner = false ) => { const z = !owner ? 2 : 1; let _x = null; let _y = null; if (!currentPoint) { _x = (x + pageState?.camera?.point[0]) * pageState?.camera?.zoom; _y = (y + pageState?.camera?.point[1]) * pageState?.camera?.zoom; } return ( <>
{name}
); }; const PositionLabel = (props) => { const { position: { x = 0, y = 0 } = {}, currentUser, currentPoint, pageState, publishCursorUpdate, whiteboardId, } = props; const { name, color, userId, presenter } = currentUser; const prevCurrentPoint = usePrevious(currentPoint); React.useEffect(() => { try { const point = _.isEqual(currentPoint, prevCurrentPoint) ? [x, y] : currentPoint; publishCursorUpdate({ xPercent: point[0] / pageState?.camera?.zoom - pageState?.camera?.point[0], yPercent: point[1] / pageState?.camera?.zoom - pageState?.camera?.point[1], whiteboardId, }); } catch (e) { console.log(e); } }, [x, y]); return ( <>
{renderCursor(name, color, x, y, currentPoint, props.pageState)}
); }; export default function Cursors(props) { let cursorWrapper = React.useRef(null); const [active, setActive] = React.useState(false); React.useEffect(() => { !cursorWrapper.hasOwnProperty("mouseenter") && cursorWrapper?.addEventListener("mouseenter", (event) => { setActive(true); }); !cursorWrapper.hasOwnProperty("mouseleave") && cursorWrapper?.addEventListener("mouseleave", (event) => { props?.publishCursorUpdate({ xPercent: null, yPercent: null, whiteboardId: props?.whiteboardId, }); setActive(false); }); }, [cursorWrapper]); return ( (cursorWrapper = r)}> {active && ( )} {props.children} {props.otherCursors .filter((c) => c?.xPercent && c?.yPercent) .map((c) => { return ( c && props.currentUser.userId !== c?.userId && renderCursor( c?.userName, c?.presenter ? "#C70039" : "#AFE1AF", c?.xPercent, c?.yPercent, null, props.tldrawAPI?.getPageState(), true ) ); })} ); }