Fix plugin idempotency issue with React re-renders #14
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
Fixes katspaugh/wavesurfer.js#3731
The plugin instances were being mutated during initialization by wavesurfer.js, and when the React component re-rendered (especially in strict mode with double rendering), the same mutated plugin instances were passed to a new wavesurfer instance, causing errors.
Solution
Modified the
useWavesurferInstancehook to:optionsWithoutPluginsthat separates plugins from other optionsoptions.pluginsdirectly to the useEffect dependency array, so the instance only recreates when the plugins array reference changes (not when individual plugins are mutated)optionsWithoutPluginsand explicitly passplugins: options.pluginsto ensure plugins are includedKey Benefits
useMemo()to prevent unnecessary wavesurfer re-creationChanges
src/index.tsxto handle plugins separately in dependency trackingTesting
All tests pass including the new plugin test:
The fix ensures plugin idempotency even when React strict mode causes double renders.