55 lines
1.6 KiB
JavaScript
55 lines
1.6 KiB
JavaScript
import * as React from "react";
|
|
import { flushSync } from "react-dom";
|
|
import { Virtualizer, elementScroll, observeElementOffset, observeElementRect, windowScroll, observeWindowOffset, observeWindowRect } from "@tanstack/virtual-core";
|
|
export * from "@tanstack/virtual-core";
|
|
const useIsomorphicLayoutEffect = typeof document !== "undefined" ? React.useLayoutEffect : React.useEffect;
|
|
function useVirtualizerBase(options) {
|
|
const rerender = React.useReducer(() => ({}), {})[1];
|
|
const resolvedOptions = {
|
|
...options,
|
|
onChange: (instance2, sync) => {
|
|
var _a;
|
|
if (sync) {
|
|
flushSync(rerender);
|
|
} else {
|
|
rerender();
|
|
}
|
|
(_a = options.onChange) == null ? void 0 : _a.call(options, instance2, sync);
|
|
}
|
|
};
|
|
const [instance] = React.useState(
|
|
() => new Virtualizer(resolvedOptions)
|
|
);
|
|
instance.setOptions(resolvedOptions);
|
|
useIsomorphicLayoutEffect(() => {
|
|
return instance._didMount();
|
|
}, []);
|
|
useIsomorphicLayoutEffect(() => {
|
|
return instance._willUpdate();
|
|
});
|
|
return instance;
|
|
}
|
|
function useVirtualizer(options) {
|
|
return useVirtualizerBase({
|
|
observeElementRect,
|
|
observeElementOffset,
|
|
scrollToFn: elementScroll,
|
|
...options
|
|
});
|
|
}
|
|
function useWindowVirtualizer(options) {
|
|
return useVirtualizerBase({
|
|
getScrollElement: () => typeof document !== "undefined" ? window : null,
|
|
observeElementRect: observeWindowRect,
|
|
observeElementOffset: observeWindowOffset,
|
|
scrollToFn: windowScroll,
|
|
initialOffset: () => typeof document !== "undefined" ? window.scrollY : 0,
|
|
...options
|
|
});
|
|
}
|
|
export {
|
|
useVirtualizer,
|
|
useWindowVirtualizer
|
|
};
|
|
//# sourceMappingURL=index.js.map
|