fix(react-instantsearch): index added twice with Next.js app router #6106
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.
Summary
This should fix what @MikeIbberson talks about here : #6073 (comment)
The problem was index widgets would get added twice client-side in a Next.js App Router application.
This is due to how
useLayoutEffect
behaves on either React canary or an RSC context (not sure), before what we had was :shouldSsr
istrue
and the parent index doesn't contain it yet, makingshouldAddWidgetEarly
betrue
useLayoutEffect
is called,shouldAddWidgetEarly
is true so we don't add it againuseLayoutEffect
dispose function would be called and set the cleanupTimershouldAddWidgetEarly
is nowfalse
becauseparentIndex
contains the child indexuseLayoutEffect
called again, withshouldAddWidgetEarly
being false this time, but it still skips adding the widget again because the cleanup timer is definedIn React 19 canary / Next.js, the cleanup function does not get called (maybe no strict mode or a different one), which means the last point fails.
Result
We were just using the wrong dependency in
useEffect
, we should never add the widget in an effect ifshouldSsr
istrue
, and that way the effect will run less often.Only an index widget can have
shouldSsr
betrue
client-side