diff --git a/js/components/Visualizer.js b/js/components/Visualizer.js
index 33f78a48..df75416e 100644
--- a/js/components/Visualizer.js
+++ b/js/components/Visualizer.js
@@ -1,4 +1,4 @@
-import React from "react";
+import React, { useMemo } from "react";
import { connect } from "react-redux";
import { toggleVisualizerStyle } from "../actionCreators";
@@ -14,6 +14,34 @@ import {
PIXEL_DENSITY,
} from "./visualizerUtils";
+function Wrapper(props) {
+ const renderWidth = props.canvasWidth;
+ const renderHeight = props.canvasHeight;
+ const height = props.canvasHeight * PIXEL_DENSITY;
+ const width = props.canvasWidth * PIXEL_DENSITY;
+
+ const bgCanvas = useMemo(() => {
+ return preRenderBg(
+ width,
+ height,
+ props.colors[0],
+ props.colors[1],
+ props.windowShade
+ );
+ }, [height, props.colors, props.windowShade, width]);
+
+ const visualizerProps = {
+ ...props,
+ renderHeight,
+ renderWidth,
+ height,
+ width,
+ bgCanvas,
+ };
+
+ return ;
+}
+
class Visualizer extends React.Component {
componentDidMount() {
this.barPeaks = new Array(NUM_BARS).fill(0);
@@ -51,29 +79,12 @@ class Visualizer extends React.Component {
this.paintFrame();
}
- _renderWidth() {
- return this.props.width;
- }
-
- _renderHeight() {
- return this.props.height;
- }
-
- _height() {
- return this.props.height * PIXEL_DENSITY;
- }
-
- _width() {
- return this.props.width * PIXEL_DENSITY;
- }
-
setStyle() {
if (!this.props.colors) {
return;
}
// TODO: Split this into to methods. One for skin update, one for style
// update.
- this.preRenderBg();
this.preRenderBar();
this.props.analyser.fftSize = 2048;
if (this.props.style === VISUALIZERS.OSCILLOSCOPE) {
@@ -89,51 +100,39 @@ class Visualizer extends React.Component {
}
}
- // Pre-render the background grid
- preRenderBg() {
- this.bgCanvas = preRenderBg(
- this._width(),
- this._height(),
- this.props.colors[0],
- this.props.colors[1],
- this.props.windowShade
- );
- }
-
- // Pre-render the bar gradient
preRenderBar() {
this.barCanvas = preRenderBar(
- this._height(),
+ this.props.height,
this.props.colors,
- this._renderHeight()
+ this.props.renderHeight
);
}
paintFrame() {
switch (this.props.style) {
case VISUALIZERS.OSCILLOSCOPE:
- this.canvasCtx.drawImage(this.bgCanvas, 0, 0);
+ this.canvasCtx.drawImage(this.props.bgCanvas, 0, 0);
paintOscilloscopeFrame({
analyser: this.props.analyser,
dataArray: this.dataArray,
canvasCtx: this.canvasCtx,
- height: this._height(),
- width: this._width(),
+ height: this.props.height,
+ width: this.props.width,
bufferLength: this.bufferLength,
colors: this.props.colors,
- renderWidth: this._renderWidth(),
+ renderWidth: this.props.renderWidth,
});
break;
case VISUALIZERS.BAR:
- this.canvasCtx.drawImage(this.bgCanvas, 0, 0);
+ this.canvasCtx.drawImage(this.props.bgCanvas, 0, 0);
paintBarFrame({
analyser: this.props.analyser,
dataArray: this.dataArray,
- renderHeight: this._renderHeight(),
+ renderHeight: this.props.renderHeight,
octaveBuckets: this.octaveBuckets,
barPeaks: this.barPeaks,
barPeakFrames: this.barPeakFrames,
- height: this._height(),
+ height: this.props.height,
canvasCtx: this.canvasCtx,
barCanvas: this.barCanvas,
windowShade: this.props.windowShade,
@@ -146,14 +145,14 @@ class Visualizer extends React.Component {
}
render() {
- const { width, height } = this.props;
+ const { renderWidth, renderHeight, width, height } = this.props;
return (