visgl / visgl/react-google-maps
[Bug] Race Condition during event handlers initialization
Nobody has claimed this yet.
- Dominant language
- TypeScript
- Stars
- 1.9k
- Forks
- 193
- Avg merge
- 3d 16h
- Merged PRs (30d)
- 13
Description
Description
Due to how this library binds event handlers to the google maps object there is a race condition. Events might be fired before react event handler is attached to the map. The simplest example is onProjectionChanged:
Steps to Reproduce
const App = () => {
const onProjectionChanged = useCallback(function onProjectionChanged() {
console.log("onProjectionChanged");
}, []);
const onBoundsChanged = () => {
console.log("onBoundsChanged");
};
console.log("render app");
return (
<APIProvider apiKey={API_KEY}>
<Map
zoom={3}
center={{ lat: 22.54992, lng: 0 }}
gestureHandling={"greedy"}
disableDefaultUI={true}
onProjectionChanged={onProjectionChanged}
onBoundsChanged={onBoundsChanged}
onClick={() => console.log("click")}
/>
<ControlPanel />
</APIProvider>
);
};
Try to reload map few times, and onProjectionChanged called not every time.
This happened due to map instance created in one useEffect and events bound in another. They are executed in diffrent async cycles, so map sometimes managed to fire an event before handler attached.
PS I tried to create a codesandbox with an issue, but in the sandbox no events were fired at all https://codesandbox.io/p/devbox/amazing-bohr-v65hqw
Environment
- Library version: 0.4.1
- Google maps version: 3.55.4
- Browser and Version: Chrome 120
- OS: MacOs Sonoma 14.1.2
Logs
No response
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the Map component's two useEffect paths described in the issue: one creates the Google Maps instance and the other binds React event handlers. Reproduce by reloading the supplied example and checking whether onProjectionChanged fires. Done means handlers are attached before map events can be emitted, with the repro callback firing consistently.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- react, typescript
- Domain
- frontend
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100