react-wavy
Version:
Generates a canvas waveform.
116 lines (103 loc) • 2.96 kB
JavaScript
var React = require('react');
var Wavy = React.createClass({
displayName: 'Wavy',
getDefaultProps: function () {
return {
data: [],
width: 900,
height: 70,
gap: 1,
position: 0,
onClick: function() {},
outerColor: '#ecf0f1',
innerColor: '#29272c',
cursorColor: '#5bcaff'
};
},
propTypes: {
data: React.PropTypes.array.isRequired,
width: React.PropTypes.number,
height: React.PropTypes.number,
gap: React.PropTypes.number,
position: React.PropTypes.number,
innerColor: React.PropTypes.string,
outerColor: React.PropTypes.string,
onClick: React.PropTypes.func
},
getInitialState: function() {
return { cursor: 0 };
},
componentDidMount: function () {
var canvas = this.refs.canvas;
var ctx = canvas.getContext('2d');
this.draw(ctx);
this.listenToMouse(canvas);
},
componentDidUpdate: function() {
this.draw(this.refs.canvas.getContext('2d'));
},
listenToMouse: function(canvas) {
var _this = this;
canvas.addEventListener('mousemove', function(event) {
var rect = canvas.getBoundingClientRect(),
x = event.clientX - rect.left;
_this.setState({ cursor: x });
});
canvas.addEventListener('mouseleave', function(event) {
_this.setState({ cursor: 0 });
});
canvas.addEventListener('click', function(event) {
var rect = canvas.getBoundingClientRect(),
x = event.clientX - rect.left;
_this.props.onClick(x);
});
},
draw: function (ctx) {
var data = this.props.data;
var width = this.props.width;
var height = this.props.height;
var cursor = this.state.cursor;
var position = this.props.position;
var cursorColor = this.props.cursorColor;
var innerColor = this.props.innerColor;
var outerColor = this.props.outerColor;
var step = Math.ceil(data.length / width);;
var gap = this.props.gap;
var max = Math.max.apply(Math, data);
if (max > 1) {
data = data.map(function(i) { return i / max; });
}
for (var i = 0; i < width; i += 1 ) {
if (i % (step + gap) === 0) {
var datum = data[i * step];
if (position >= i) {
if (cursor >= position) {
if (position >= i) {
ctx.fillStyle = innerColor;
} else {
ctx.fillStyle = cursorColor;
}
} else if (cursor >= i) {
ctx.fillStyle = cursorColor;
} else {
ctx.fillStyle = innerColor;
}
} else if (cursor >= i) {
ctx.fillStyle = cursorColor;
} else {
ctx.fillStyle = outerColor;
}
ctx.fillRect(i, height, step, -1 * (datum) * height);
}
}
},
render: function () {
return (
<canvas
ref='canvas'
width={this.props.width}
height={this.props.height}/>
);
}
});
module.exports = Wavy;