43 lines
1.6 KiB
JavaScript
43 lines
1.6 KiB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
import useLazyRef from '@mui/utils/useLazyRef';
|
|
import { Store } from '@mui/x-internals/store';
|
|
import { Colspan } from "./features/colspan.mjs";
|
|
import { Dimensions } from "./features/dimensions.mjs";
|
|
import { Keyboard } from "./features/keyboard.mjs";
|
|
import { Rowspan } from "./features/rowspan.mjs";
|
|
import { Virtualization } from "./features/virtualization/index.mjs";
|
|
import { DEFAULT_PARAMS } from "./constants.mjs";
|
|
|
|
/* eslint-disable jsdoc/require-param-type */
|
|
/* eslint-disable jsdoc/require-param-description */
|
|
/* eslint-disable jsdoc/require-returns-type */
|
|
|
|
const FEATURES = [Dimensions, Virtualization, Colspan, Rowspan, Keyboard];
|
|
export const useVirtualizer = params => {
|
|
const paramsWithDefault = mergeDefaults(params, DEFAULT_PARAMS);
|
|
const store = useLazyRef(() => {
|
|
return new Store(FEATURES.map(f => f.initialize(paramsWithDefault)).reduce((state, partial) => Object.assign(state, partial), {}));
|
|
}).current;
|
|
const api = {};
|
|
for (const feature of FEATURES) {
|
|
Object.assign(api, feature.use(store, paramsWithDefault, api));
|
|
}
|
|
return {
|
|
store,
|
|
api
|
|
};
|
|
};
|
|
function mergeDefaults(params, defaults) {
|
|
const result = _extends({}, params);
|
|
for (const key in defaults) {
|
|
if (Object.hasOwn(defaults, key)) {
|
|
const value = defaults[key];
|
|
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
result[key] = mergeDefaults(params[key] ?? {}, value);
|
|
} else {
|
|
result[key] = params[key] ?? value;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
} |