@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
43 lines • 1.44 kB
JavaScript
import React, { isValidElement, useMemo } from 'react';
import { useItem } from "../hooks/index.js";
import { convertJsxToString } from "../../../../shared/component-helper.js";
function ItemNo({
children
}) {
const {
index
} = useItem();
const processedChildren = useMemo(() => replaceItemNo(children, index), [children, index]);
return React.createElement(React.Fragment, null, processedChildren);
}
const TOKEN_REGEX = /\{itemN(r|o)\}/g;
export function replaceItemNo(children, index) {
const replaceIn = node => {
if (node == null || node === false) return node;
if (typeof node === 'string') {
return TOKEN_REGEX.test(node) ? node.replace(TOKEN_REGEX, String(index + 1)) : node;
}
if (Array.isArray(node)) {
return node.map((n, i) => React.createElement(React.Fragment, {
key: i
}, replaceIn(n)));
}
if (isValidElement(node)) {
const {
children: childProps,
...rest
} = node.props || {};
const nextChildren = replaceIn(childProps);
return nextChildren === childProps ? node : React.cloneElement(node, rest, nextChildren);
}
const text = convertJsxToString(node);
if (text && text.includes('{itemN')) {
return text.replace(TOKEN_REGEX, String(index + 1));
}
return node;
};
return replaceIn(children);
}
ItemNo._supportsSpacingProps = false;
export default ItemNo;
//# sourceMappingURL=ItemNo.js.map