import React from 'react'; import PropTypes from 'prop-types'; import bindAll from 'lodash.bindall'; import AudioTrimmerComponent from '../components/audio-trimmer/audio-trimmer.jsx'; import DragRecognizer from '../lib/drag-recognizer'; const MIN_LENGTH = 0.01; // Used to stop sounds being trimmed smaller than 1% class AudioTrimmer extends React.Component { constructor (props) { super(props); bindAll(this, [ 'handleTrimStartMouseDown', 'handleTrimEndMouseDown', 'handleTrimStartMouseMove', 'handleTrimEndMouseMove', 'storeRef' ]); this.trimStartDragRecognizer = new DragRecognizer({ onDrag: this.handleTrimStartMouseMove, touchDragAngle: 90, distanceThreshold: 0 }); this.trimEndDragRecognizer = new DragRecognizer({ onDrag: this.handleTrimEndMouseMove, touchDragAngle: 90, distanceThreshold: 0 }); } handleTrimStartMouseMove (currentOffset, initialOffset) { const dx = (currentOffset.x - initialOffset.x) / this.containerSize; const newTrim = Math.max(0, Math.min(this.props.trimEnd - MIN_LENGTH, this.initialTrim + dx)); this.props.onSetTrimStart(newTrim); } handleTrimEndMouseMove (currentOffset, initialOffset) { const dx = (currentOffset.x - initialOffset.x) / this.containerSize; const newTrim = Math.min(1, Math.max(this.props.trimStart + MIN_LENGTH, this.initialTrim + dx)); this.props.onSetTrimEnd(newTrim); } handleTrimStartMouseDown (e) { this.containerSize = this.containerElement.getBoundingClientRect().width; this.trimStartDragRecognizer.start(e); this.initialTrim = this.props.trimStart; } handleTrimEndMouseDown (e) { this.containerSize = this.containerElement.getBoundingClientRect().width; this.trimEndDragRecognizer.start(e); this.initialTrim = this.props.trimEnd; } storeRef (el) { this.containerElement = el; } render () { return ( ); } } AudioTrimmer.propTypes = { onSetTrimEnd: PropTypes.func, onSetTrimStart: PropTypes.func, playhead: PropTypes.number, trimEnd: PropTypes.number, trimStart: PropTypes.number }; export default AudioTrimmer;