/** * TrackHeightAdjuster - Компонент для изменения высоты трека * * Добавляет возможность изменения высоты трека перетаскиванием нижней границы */ import React, { useCallback, useRef, useState } from "react" import { cn } from "@/lib/utils" interface TrackHeightAdjusterProps { trackId: string currentHeight: number onHeightChange: (trackId: string, newHeight: number) => void className?: string } export function TrackHeightAdjuster({ trackId, currentHeight, onHeightChange, className }: TrackHeightAdjusterProps) { const [isDragging, setIsDragging] = useState(false) const dragStateRef = useRef({ isDragging: false, startY: 0, startHeight: 0, }) const handleMouseDown = useCallback( (e: React.MouseEvent) => { e.preventDefault() e.stopPropagation() setIsDragging(true) dragStateRef.current = { isDragging: true, startY: e.clientY, startHeight: currentHeight, } const handleMouseMove = (e: MouseEvent) => { if (!dragStateRef.current.isDragging) return const deltaY = e.clientY - dragStateRef.current.startY const newHeight = Math.max(40, Math.min(300, dragStateRef.current.startHeight + deltaY)) onHeightChange(trackId, newHeight) } const handleMouseUp = () => { dragStateRef.current.isDragging = false setIsDragging(false) document.removeEventListener("mousemove", handleMouseMove) document.removeEventListener("mouseup", handleMouseUp) } document.addEventListener("mousemove", handleMouseMove) document.addEventListener("mouseup", handleMouseUp) }, [trackId, currentHeight, onHeightChange], ) return (