-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Plugins initialise twice and break in react wrapper #3731
Comments
FWIW I also tried adding the plugin in const onReady = useCallback((ws) => {
setWavesurfer(ws);
setIsPlaying(false);
ws.registerPlugin(
Spectrogram.create({
labels: true,
height: 200,
splitChannels: false,
colorMap: createColormap({
colormap: "jet",
nshades: 256,
format: "float",
}),
})
);
}, []); |
I came across this issue too, and looks like its react's strict mode that leads to useEffect being ran twice |
Good catch! Looks like this ref usage leads to different lifecycles between a wavesurfer instance and a plugin instance. As a workaround, try using the |
Thanks for your replies! Back on this project today and I tried using the My solution for now is to modify const ws = WaveSurfer.create({
...options,
container: containerRef.current,
plugins: options.getPlugins ? options.getPlugins() : options.plugins,
}); const wavesurferOptions = useMemo(
() => ({
container: containerRef,
url: audioUrl,
getPlugins: () => [
Spectrogram.create(),
],
}),
[audioUrl]
);
const { wavesurfer, isPlaying, currentTime } =
useWavesurfer(wavesurferOptions); This way a fresh plugin instance gets created each time the player initialises. |
Bug description
TLDR; I can't get the spectrogram plugin to work on the react wrapper. I haven't tested other types of plugins.
Note: I think this is an issue with https://github.com/katspaugh/wavesurfer-react rather than this repo, but there is no issues tab on the react repo so I'm posting here. Also, it might be able to be fixed in this repo by making plugins reusable - i.e., able to be re-initialised.
The issue seems to be that the plugin instance is mutated during initialisation, and if you attempt to initialise the plugin a second time it will cause an error. The problem seems to be in the useEffect hook which destroys and recreates the wavesurfer instance. In subsequent runs of the hook a new ws instance would get created but it would receive already-initialised plugin instances.
I found that if I memoised all of the props being passed to WavesurferPlayer I could get the plugin to work when building for production at least, but when running locally it still breaks since React throws in that 'helpful' extra render.
Environment
Minimal code snippet
Expected result
A player with a spectrogram.
Obtained result
TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.
The text was updated successfully, but these errors were encountered: