soiz1's picture
Upload 2891 files
6bcb42f verified
import bindAll from 'lodash.bindall';
import PropTypes from 'prop-types';
import React from 'react';
import VM from 'scratch-vm';
import { connect } from 'react-redux';
import { encodeAndAddSoundToVM } from '../lib/audio/audio-util.js';
import RecordModalComponent from '../components/record-modal/record-modal.jsx';
import {
closeSoundRecorder
} from '../reducers/modals';
class RecordModal extends React.Component {
constructor (props) {
super(props);
bindAll(this, [
'handleRecord',
'handleStopRecording',
'handlePlay',
'handleStopPlaying',
'handleBack',
'handleSubmit',
'handleCancel',
'handleSetPlayhead',
'handleSetTrimStart',
'handleSetTrimEnd'
]);
this.state = {
samples: null,
encoding: false,
levels: null,
playhead: null,
playing: false,
recording: false,
sampleRate: null,
trimStart: 0,
trimEnd: 1
};
}
handleRecord () {
this.setState({recording: true});
}
handleStopRecording (samples, sampleRate, levels, trimStart, trimEnd) {
if (samples.length > 0) {
this.setState({samples, sampleRate, levels, trimStart, trimEnd, recording: false});
}
}
handlePlay () {
this.setState({playing: true});
}
handleStopPlaying () {
this.setState({playing: false, playhead: null});
}
handleBack () {
this.setState({playing: false, samples: null});
}
handleSetTrimEnd (trimEnd) {
this.setState({trimEnd});
}
handleSetTrimStart (trimStart) {
this.setState({trimStart});
}
handleSetPlayhead (playhead) {
this.setState({playhead});
}
handleSubmit () {
this.setState({encoding: true}, () => {
const sampleCount = this.state.samples.length;
const startIndex = Math.floor(this.state.trimStart * sampleCount);
const endIndex = Math.floor(this.state.trimEnd * sampleCount);
const clippedSamples = this.state.samples.slice(startIndex, endIndex);
encodeAndAddSoundToVM(this.props.vm, clippedSamples, this.state.sampleRate, 'recording1',
() => {
this.props.onClose();
this.props.onNewSound();
});
});
}
handleCancel () {
this.props.onClose();
}
render () {
return (
<RecordModalComponent
encoding={this.state.encoding}
levels={this.state.levels}
playhead={this.state.playhead}
playing={this.state.playing}
recording={this.state.recording}
sampleRate={this.state.sampleRate}
samples={this.state.samples}
trimEnd={this.state.trimEnd}
trimStart={this.state.trimStart}
onBack={this.handleBack}
onCancel={this.handleCancel}
onPlay={this.handlePlay}
onRecord={this.handleRecord}
onSetPlayhead={this.handleSetPlayhead}
onSetTrimEnd={this.handleSetTrimEnd}
onSetTrimStart={this.handleSetTrimStart}
onStopPlaying={this.handleStopPlaying}
onStopRecording={this.handleStopRecording}
onSubmit={this.handleSubmit}
/>
);
}
}
RecordModal.propTypes = {
onClose: PropTypes.func,
onNewSound: PropTypes.func,
vm: PropTypes.instanceOf(VM)
};
const mapStateToProps = state => ({
vm: state.scratchGui.vm
});
const mapDispatchToProps = dispatch => ({
onClose: () => {
dispatch(closeSoundRecorder());
}
});
export default connect(
mapStateToProps,
mapDispatchToProps
)(RecordModal);