Fix ReferenceArrayField passes empty data to child when loaded #6080
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
<ReferenceArrayField>
relies ondataProvider.getMany()
to retrieve the references, and to pass it them to its child (e.g. a<SingleFieldList>
. WhengetMany()
returns, for a brief moment,loaded
istrue
anddata
is empty. If the child of<SingleFieldList>
doesn't check for the existence of its injectedrecord
before looking up a field, it fails.Solution
The bug comes from a race condition in
useReferenceArrayFieldController
. This hook processes the data in auseEffect
whenloaded
becomes true. As a consequence, the hook timeline is:{ loaded: false, data: {} }
dataProvider.getMany()
returns{ loaded: true, data: {} }
useEffect
{ loaded: true, data: { 1: { id: 1, title: foo } }
At 3, the hook state is incoherent.