@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
131 lines (130 loc) • 7.06 kB
JavaScript
;
"use client";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _classnames = _interopRequireDefault(require("classnames"));
var _ScrollView = _interopRequireDefault(require("../../fragments/scroll-view/ScrollView.js"));
var _useIsomorphicLayoutEffect = require("../../shared/helpers/useIsomorphicLayoutEffect.js");
var _ListContext = require("./ListContext.js");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
const defaultListItemOutlineCompensation = '0.125rem';
function ListScrollView(props) {
var _parentContext$varian, _parentContext$separa;
const parentContext = (0, _react.useContext)(_ListContext.ListContext);
const {
className,
children,
maxVisibleListItems,
skeleton,
disabled,
style,
innerRef,
...rest
} = props;
const localRef = (0, _react.useRef)(null);
const [measuredMaxHeight, setMeasuredMaxHeight] = (0, _react.useState)(undefined);
const [outlineCompensation, setOutlineCompensation] = (0, _react.useState)(defaultListItemOutlineCompensation);
const hasValidMaxVisibleListItems = typeof maxVisibleListItems === 'number' && Number.isFinite(maxVisibleListItems) && maxVisibleListItems > 0;
const fallbackMaxHeight = hasValidMaxVisibleListItems ? `calc(var(--item-height, 4rem) * ${maxVisibleListItems})` : undefined;
const measureMaxHeight = (0, _react.useCallback)(() => {
if (!hasValidMaxVisibleListItems || style !== null && style !== void 0 && style.maxHeight) {
setMeasuredMaxHeight(undefined);
return;
}
setOutlineCompensation(getListItemOutlineCompensation(localRef.current));
const measuredHeight = getVisibleListItemsHeight(localRef.current, maxVisibleListItems);
setMeasuredMaxHeight(measuredHeight ? `${measuredHeight}px` : undefined);
}, [hasValidMaxVisibleListItems, maxVisibleListItems, style === null || style === void 0 ? void 0 : style.maxHeight]);
(0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(() => {
if (!innerRef) {
return;
}
if (typeof innerRef === 'function') {
innerRef(localRef.current);
return;
}
innerRef.current = localRef.current;
}, [innerRef]);
(0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(() => {
measureMaxHeight();
}, [children, measureMaxHeight]);
(0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(() => {
if (!hasValidMaxVisibleListItems || style !== null && style !== void 0 && style.maxHeight) {
return;
}
window.addEventListener('resize', measureMaxHeight);
return () => {
window.removeEventListener('resize', measureMaxHeight);
};
}, [hasValidMaxVisibleListItems, measureMaxHeight, style === null || style === void 0 ? void 0 : style.maxHeight]);
const resolvedMaxHeight = style !== null && style !== void 0 && style.maxHeight ? undefined : measuredMaxHeight || fallbackMaxHeight;
const scrollViewStyle = {
...(resolvedMaxHeight ? {
maxHeight: `calc(${resolvedMaxHeight} + ${outlineCompensation})`,
marginBottom: `-${outlineCompensation}`
} : null),
...style
};
const scrollViewContent = _react.default.createElement(_ScrollView.default, _extends({
className: (0, _classnames.default)("dnb-list__card__scroll-view dnb-list--inset-outline", className),
interactive: "auto",
ref: localRef,
style: scrollViewStyle
}, rest), children);
const appliedSkeleton = skeleton !== null && skeleton !== void 0 ? skeleton : parentContext === null || parentContext === void 0 ? void 0 : parentContext.skeleton;
const appliedDisabled = disabled !== null && disabled !== void 0 ? disabled : parentContext === null || parentContext === void 0 ? void 0 : parentContext.disabled;
return _react.default.createElement(_ListContext.ListContext.Provider, {
value: {
variant: (_parentContext$varian = parentContext === null || parentContext === void 0 ? void 0 : parentContext.variant) !== null && _parentContext$varian !== void 0 ? _parentContext$varian : 'basic',
separated: (_parentContext$separa = parentContext === null || parentContext === void 0 ? void 0 : parentContext.separated) !== null && _parentContext$separa !== void 0 ? _parentContext$separa : false,
skeleton: appliedSkeleton,
disabled: appliedDisabled
}
}, scrollViewContent);
}
function getVisibleListItemsHeight(scrollViewElement, maxVisibleListItems) {
if (!scrollViewElement) {
return null;
}
const listElement = scrollViewElement.querySelector('.dnb-list__container');
if (!(listElement instanceof HTMLElement)) {
return null;
}
const items = Array.from(listElement.children).filter(element => element instanceof HTMLElement);
const firstVisibleItem = items[0];
const lastVisibleItem = items[maxVisibleListItems - 1];
if (!firstVisibleItem || !lastVisibleItem) {
return null;
}
return Math.ceil(lastVisibleItem.offsetTop + lastVisibleItem.offsetHeight - firstVisibleItem.offsetTop);
}
function getListItemOutlineCompensation(scrollViewElement) {
if (!scrollViewElement || typeof getComputedStyle === 'undefined') {
return defaultListItemOutlineCompensation;
}
const cardElement = scrollViewElement.closest('.dnb-card');
const targetElement = (cardElement === null || cardElement === void 0 ? void 0 : cardElement.querySelector('.dnb-list__container')) || scrollViewElement.querySelector('.dnb-list__container');
if (!(targetElement instanceof HTMLElement)) {
return defaultListItemOutlineCompensation;
}
const outlineWidth = getComputedStyle(targetElement).getPropertyValue('--item-outline-width').trim();
return doubleCssLength(outlineWidth) || defaultListItemOutlineCompensation;
}
function doubleCssLength(value) {
if (!value) {
return null;
}
const match = value.match(/^(-?\d*\.?\d+)([a-z%]+)$/i);
if (match) {
return `${parseFloat(match[1]) * 2}${match[2]}`;
}
return `calc(${value} * 2)`;
}
ListScrollView._supportsSpacingProps = true;
var _default = exports.default = ListScrollView;
//# sourceMappingURL=ListScrollView.js.map