UNPKG

@jbrowse/core

Version:

JBrowse 2 core libraries used by plugins

68 lines (67 loc) 2.51 kB
import { jsx as _jsx } from "react/jsx-runtime"; import { useCallback, useEffect, useRef, useState } from 'react'; import { cx, makeStyles } from "../util/tss-react/index.js"; const useStyles = makeStyles()({ horizontalHandle: { cursor: 'row-resize', width: '100%', }, verticalHandle: { cursor: 'col-resize', height: '100%', }, flexbox_verticalHandle: { cursor: 'col-resize', alignSelf: 'stretch', }, flexbox_horizontalHandle: { cursor: 'row-resize', alignSelf: 'stretch', }, }); function ResizeHandle({ onDrag, vertical = false, flexbox = false, className: originalClassName, onMouseDown, ...props }) { const [mouseDragging, setMouseDragging] = useState(false); const initialPosition = useRef(0); const prevPos = useRef(0); const { classes } = useStyles(); const getPosition = useCallback((event) => vertical ? event.clientX : event.clientY, [vertical]); useEffect(() => { if (!mouseDragging) { return; } function mouseMove(event) { event.preventDefault(); const pos = getPosition(event); const totalDistance = initialPosition.current - pos; const lastFrameDistance = pos - prevPos.current; prevPos.current = pos; onDrag(lastFrameDistance, totalDistance); } function mouseUp() { setMouseDragging(false); } window.addEventListener('mousemove', mouseMove, true); window.addEventListener('mouseup', mouseUp, true); return () => { window.removeEventListener('mousemove', mouseMove, true); window.removeEventListener('mouseup', mouseUp, true); }; }, [mouseDragging, onDrag, getPosition]); const handleMouseDown = useCallback((event) => { event.preventDefault(); const pos = getPosition(event); initialPosition.current = pos; prevPos.current = pos; setMouseDragging(true); onMouseDown?.(event); }, [getPosition, onMouseDown]); const className = flexbox ? vertical ? classes.flexbox_verticalHandle : classes.flexbox_horizontalHandle : vertical ? classes.verticalHandle : classes.horizontalHandle; return (_jsx("div", { "data-resizer": "true", onMouseDown: handleMouseDown, className: cx(originalClassName, className), ...props })); } export default ResizeHandle;