Skip to content

Commit 3ce4536

Browse files
saitonakamuradanez
authored andcommitted
fix(observer): fix of reobserve doesn't add observer to map
When new element already holds a ref to an observer and the previous element (that used the same observer) unobserves, it creates a broken state when that observer is deleted from map, but new element holds that ref and thinks it's ok to observe Essentially i'm bringing back part of the code deleted in #153, namely https://github.com/researchgate/react-intersection-observer/pull/153/files#diff-44cb04e2627c3ab84281b41d14880e5e822437f19144e8c14a6c95f7f7fa14bbL72 I also added tests to not to break this and #153 in the future
1 parent ba9cac5 commit 3ce4536

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

src/observer.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ export function createObserver(
7878
}
7979

8080
export function observeElement(element: Instance) {
81+
if (element.observer && !observerElementsMap.has(element.observer)) {
82+
observerElementsMap.set(element.observer, new Set<Instance>());
83+
}
8184
observerElementsMap.get(element.observer)?.add(element);
8285
element.observer!.observe(element.target!);
8386
}

test/unit/observer.spec.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,4 +194,20 @@ describe('findObserverElement', () => {
194194
expect(instance1).toEqual(entry1);
195195
expect(instance2).toEqual(entry2);
196196
});
197+
198+
test('two subsequent createObserver calls should not produce two observers', () => {
199+
const observer1 = createObserver();
200+
const observer2 = createObserver();
201+
expect(observer1).toEqual(observer2);
202+
});
203+
204+
test('observing element should add target to observerElementsMap even if there is no such observer key', () => {
205+
const observer = createObserver();
206+
const entry = { observer, target: target1 };
207+
observeElement(entry);
208+
unobserveElement(entry, entry.target);
209+
observeElement(entry);
210+
const instance = findObserverElement(observer, entry);
211+
expect(instance).toEqual(entry);
212+
});
197213
});

0 commit comments

Comments
 (0)