Mirror: React hooks for accessible, common web interactions. UI super powers without the UI.

make ssr-friendly for next.js (#9)

* make ssr-friendly for next.js

* Update src/utils/observeScrollArea.ts

Co-authored-by: Phil Pluckthun <phil@kitten.sh>

---------

Co-authored-by: Phil Pluckthun <phil@kitten.sh>

Changed files
+18 -15
src
+18 -15
src/utils/observeScrollArea.ts
···
const mutationObservers: Map<HTMLElement, MutationObserver> = new Map();
const resizeListeners: Map<HTMLElement, Array<() => void>> = new Map();
-
const resizeObserver = new ResizeObserver(entries => {
-
const parents = new Set<Element>();
-
for (let i = 0; i < entries.length; i++) {
-
const parent = entries[i].target.parentElement;
-
if (parent && !parents.has(parent)) {
-
parents.add(parent);
-
const listeners = resizeListeners.get(parent) || [];
-
for (let i = 0; i < listeners.length; i++) listeners[i]();
-
}
-
}
-
});
export function observeScrollArea(
element: HTMLElement,
···
for (let j = 0; j < entry.addedNodes.length; j++) {
const node = entry.addedNodes[j];
if (node.nodeType === Node.ELEMENT_NODE) {
-
resizeObserver.observe(node as Element, resizeOptions);
}
}
for (let j = 0; j < entry.removedNodes.length; j++) {
const node = entry.removedNodes[j];
if (node.nodeType === Node.ELEMENT_NODE) {
-
resizeObserver.unobserve(node as Element);
}
}
}
···
const childNodes = element.childNodes;
for (let i = 0; i < childNodes.length; i++)
if (childNodes[i].nodeType === Node.ELEMENT_NODE)
-
resizeObserver.observe(childNodes[i] as Element, resizeOptions);
mutationObserver.observe(element, { childList: true });
});
···
const childNodes = element.childNodes;
for (let i = 0; i < childNodes.length; i++)
if (childNodes[i].nodeType === Node.ELEMENT_NODE)
-
resizeObserver.unobserve(childNodes[i] as Element);
resizeListeners.delete(element);
mutationObservers.delete(element);
···
const mutationObservers: Map<HTMLElement, MutationObserver> = new Map();
const resizeListeners: Map<HTMLElement, Array<() => void>> = new Map();
+
const resizeObserver =
+
typeof ResizeObserver !== 'undefined'
+
? new ResizeObserver(entries => {
+
const parents = new Set<Element>();
+
for (let i = 0; i < entries.length; i++) {
+
const parent = entries[i].target.parentElement;
+
if (parent && !parents.has(parent)) {
+
parents.add(parent);
+
const listeners = resizeListeners.get(parent) || [];
+
for (let i = 0; i < listeners.length; i++) listeners[i]();
+
}
+
}
+
})
+
: undefined;
export function observeScrollArea(
element: HTMLElement,
···
for (let j = 0; j < entry.addedNodes.length; j++) {
const node = entry.addedNodes[j];
if (node.nodeType === Node.ELEMENT_NODE) {
+
resizeObserver!.observe(node as Element, resizeOptions);
}
}
for (let j = 0; j < entry.removedNodes.length; j++) {
const node = entry.removedNodes[j];
if (node.nodeType === Node.ELEMENT_NODE) {
+
resizeObserver!.unobserve(node as Element);
}
}
}
···
const childNodes = element.childNodes;
for (let i = 0; i < childNodes.length; i++)
if (childNodes[i].nodeType === Node.ELEMENT_NODE)
+
resizeObserver!.observe(childNodes[i] as Element, resizeOptions);
mutationObserver.observe(element, { childList: true });
});
···
const childNodes = element.childNodes;
for (let i = 0; i < childNodes.length; i++)
if (childNodes[i].nodeType === Node.ELEMENT_NODE)
+
resizeObserver!.unobserve(childNodes[i] as Element);
resizeListeners.delete(element);
mutationObservers.delete(element);