4

I have run into a roadblock on my web project that uses Wavesurfer. I have installed wavesurfer.js and react-wavesurfer as node modules in my project. Wavesurfer.js seems to be working fine, but react-wavesurfer seems to be encountering issues that I am finding difficult to debug. The following code:

import React from "react";
import WaveSurfer from "wavesurfer.js"
import ReactWavesurfer from "react-wavesurfer";

class Waveform extends React.Component {
  makeWave() {
    var wavesurfer = WaveSurfer.create({
      container: '#waveform',
      waveColor: 'red',
      progressColor: 'purple'
    });
    wavesurfer.load('path/to/mp3');
  };


  render() {
    this.makeWave();
    return (
      <div>
        <ReactWavesurfer
          audioFile={'path/to/mp3'}
        />
      </div>
    );
  }
}

export default Waveform;

Produces only the first waveform from the call to this.makeWave(). It returns an error when trying to create the React waveform: Uncaught TypeError: this._wavesurfer.init is not a function. I am using browserify to bundle my javascript dependencies.

Any help would be much appreciated!

tomato
  • 41
  • 1
  • 3
  • I'm having the same issue! i opened a specific issue on the project here: https://github.com/mspae/react-wavesurfer/issues/60 – avocadojesus Aug 12 '17 at 18:35
  • I am trying to use react-wavesurfer. I am not able to import it. Have u changed config files ? – EdG Jan 03 '19 at 10:16

2 Answers2

8

If you are still having trouble with this, you can create your own Waveform component that essentially handles the same load. Here is a simple example that worked for me

1. install wavesurfer.js manually:

# taken from here: https://wavesurfer-js.org/
npm install --save wavesurfer.js@2.0.0-beta01

2. build a custom Waveform component:

// components/waveform.js
import React from 'react'
import ReactDOM from 'react-dom'
import WaveSurfer from 'wavesurfer.js'

export default class Waveform extends React.Component {
  constructor(props) {
    super(props)
    this.state = {

    }
  }
  componentDidMount() {
    this.$el = ReactDOM.findDOMNode(this)
    this.$waveform = this.$el.querySelector('.wave')
    this.wavesurfer = WaveSurfer.create({
      container: this.$waveform,
      waveColor: 'violet',
      progressColor: 'purple'
    })
    this.wavesurfer.load(this.props.src)
  }
  componentWillUnmount() {

  }
  render() {
    return (
      <div className='waveform'>
        <div className='wave'></div>
      </div>
    )
  }
}

Waveform.defaultProps = {
  src: ""
}

3. and then, in the parent component:

// components/my-parent-component.js
import Waveform from 'path/to/components/Waveform'
...
render() {
  return <div clasName='parent-component'><Waveform src={'/path/to/audio/src.mp3'} /></div>
}
avocadojesus
  • 231
  • 2
  • 10
  • can I use mp4 source ? – EdG Jan 03 '19 at 10:17
  • @avocadojesus How to add plgins in this example? Your example is working, but when I add Plugin in it. It's not recognizing it `plugins: [ WaveSurfer.Regions.add({ regions: [ { start: 5, end: 7, loop: false, color: 'hsla(200, 50%, 70%, 0.4)' } ] }) ]` – Ali Sajid Nov 16 '19 at 05:37
  • Do you have any idea how you would do this with a functional component instead of a class-based one? – mattlock Jun 02 '20 at 13:49
0

React-wavesurfer handles the creation of the wavesurfer instance itself. So you can leave out the makeWave part.

import React, { Component } from 'react';
import WaveSurfer from 'react-wavesurfer';

export default class WaveComponent extends Component {
  render() {
    return (
      <WaveSurfer audioFile="/path/to/audio.mp3" />
    );
  }
}

This code works for me. If this doesn't work please post the exact versions of wavesurfer.js and react-wavesurfer you are using.

Also please bear in mind that you need to expose wavesurfer.js as a global variable if you are using a module bundler. (This will hopefully be no longer necessary in the near future) – for more exact instructions please see https://github.com/mspae/react-wavesurfer#prerequisites-and-common-pitfalls)

mspae
  • 276
  • 4
  • 13
  • This didn't work for me, getting the same error with "react-wavesurfer": "^0.8.6" and "wavesurfer.js": "^2.0.5", Uncaught TypeError: this._wavesurfer.init is not a function – kidconcept Apr 12 '18 at 14:18