import React, { Component } from 'react' // import { Link } from 'react-router-dom' // import { bindActionCreators } from 'redux' import { connect } from 'react-redux' import actions from 'app/actions' import { WAVEFORM_SIZE, INNER_HEIGHT, ZOOM_STEPS, ZOOM_LABEL_STEPS, ZOOM_TICK_STEPS, } from 'app/constants' class Waveform extends Component { constructor(props){ super(props) this.canvasRef = React.createRef() } componentDidMount() { this.resize() this.draw() } componentDidUpdate() { this.draw() } resize() { const canvas = this.canvasRef.current canvas.width = WAVEFORM_SIZE canvas.height = INNER_HEIGHT } draw() { const canvas = this.canvasRef.current const ctx = canvas.getContext('2d') const h = INNER_HEIGHT this.clearCanvas(ctx, h) this.drawCurve(ctx, h) } clearCanvas(ctx, h) { const w = WAVEFORM_SIZE ctx.clearRect(0, 0, w, h) ctx.fillStyle = 'rgba(0,0,0,0.5)' ctx.fillRect(0, 0, w, h) ctx.fillStyle = 'rgba(64,128,192,0.5)' } drawCurve(ctx, h) { let { peaks, timeline } = this.props let { start_ts, zoom, duration } = timeline let secondsPerPixel = ZOOM_STEPS[zoom] * 0.1 // 0.1 sec / step let stepsPerPixel = ZOOM_STEPS[zoom] // 0.1 sec / step let widthTimeDuration = h * secondsPerPixel // secs per pixel let timeMin = Math.round(start_ts / secondsPerPixel) * secondsPerPixel let timeMax = Math.min(timeMin + widthTimeDuration, duration) let timeWidth = timeMax - timeMin let stepMin = Math.floor(timeMin * 10) let pixelWidth = Math.ceil(timeWidth / secondsPerPixel) let i = 0 let step = stepMin let waveformPeak = WAVEFORM_SIZE / 2 let origin = (1 - peaks[step]) * waveformPeak let y let peak // console.log(stepMin, pixelWidth * stepsPerPixel + stepMin) ctx.beginPath() ctx.moveTo(origin, 0) for (i = 0; i < pixelWidth; i++) { step = i * stepsPerPixel + stepMin peak = peaks[step] y = (1 - peak) * waveformPeak ctx.lineTo(y, i) } for (i = pixelWidth - 1; i > 0; i--) { step = i * stepsPerPixel + stepMin peak = peaks[step] y = (1 + peak) * waveformPeak ctx.lineTo(y, i) } ctx.lineTo(origin, 0) ctx.fillStyle = 'rgba(255,255,255,0.8)' ctx.fill() } render() { return ( ) } } const mapStateToProps = state => ({ timeline: state.align.timeline, peaks: state.site.peaks, }) const mapDispatchToProps = dispatch => ({ // uploadActions: bindActionCreators({ ...uploadActions }, dispatch), }) export default connect(mapStateToProps, mapDispatchToProps)(Waveform)