[ide-react] Preserve scope value update watchers on watcher add (#16729)

GitOrigin-RevId: 1168577364fef6e13a58d7d96afdf4ba685fc342
This commit is contained in:
Alf Eaton 2024-01-26 09:27:08 +00:00 committed by Copybot
parent b9db589f33
commit bb0da73a36
2 changed files with 32 additions and 1 deletions

View file

@ -273,7 +273,9 @@ export class ReactScopeValueStore implements ScopeValueStore {
// useScopeValue, during which the value could change without being
// observed
if ('value' in item) {
this.scheduleWatcherUpdate<T>(path, item.value, [watcher])
// add this watcher to any existing watchers scheduled for this path
const { watchers } = this.watcherUpdates.get(path) ?? { watchers: [] }
this.scheduleWatcherUpdate<T>(path, item.value, [...watchers, watcher])
}
return () => {

View file

@ -122,6 +122,35 @@ describe('ReactScopeValueStore', function () {
expect(watcher).to.have.been.calledWith('wombat')
})
it('handles multiple watchers for the same path added at the same time before the value is set', async function () {
const store = new ReactScopeValueStore()
const watcherOne = sinon.stub()
const watcherTwo = sinon.stub()
store.watch('test', watcherOne)
store.watch('test', watcherTwo)
await waitForWatchers(() => {
store.set('test', 'wombat')
})
expect(watcherOne).to.have.been.calledWith('wombat')
expect(watcherTwo).to.have.been.calledWith('wombat')
})
it('handles multiple watchers for the same path added at the same time after the value is set', async function () {
const store = new ReactScopeValueStore()
store.set('test', 'wombat')
const watcherOne = sinon.stub()
const watcherTwo = sinon.stub()
store.watch('test', watcherOne)
store.watch('test', watcherTwo)
store.flushUpdates()
expect(watcherOne).to.have.been.calledWith('wombat')
expect(watcherTwo).to.have.been.calledWith('wombat')
})
it('throws an error when watching an unknown value', function () {
const store = new ReactScopeValueStore()
expect(() => store.watch('test', () => {})).to.throw