@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
83 lines (82 loc) • 2.95 kB
JavaScript
"use client";
import "core-js/modules/es.string.replace.js";
import { useCallback, useContext, useMemo } from 'react';
import useId from '../../../shared/helpers/useId';
import SectionContext from '../Form/Section/SectionContext';
import IterateItemContext from '../Iterate/IterateItemContext';
export default function usePath() {
var _useContext, _useContext2;
let props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
const {
path: pathProp,
itemPath: itemPathProp,
omitSectionPath
} = props;
const id = useId(props.id);
const {
path: sectionPath
} = (_useContext = useContext(SectionContext)) !== null && _useContext !== void 0 ? _useContext : {};
const {
path: iteratePathProp,
index: iterateElementIndex
} = (_useContext2 = useContext(IterateItemContext)) !== null && _useContext2 !== void 0 ? _useContext2 : {};
if (pathProp && !pathProp.startsWith('/')) {
throw new Error(`path="${pathProp}" must start with a slash`);
}
if (itemPathProp && !itemPathProp.startsWith('/')) {
throw new Error(`itemPath="${itemPathProp}" must start with a slash`);
}
const joinPath = useCallback(paths => {
return cleanPath(paths.reduce((acc, cur) => cur ? `${acc}/${cur}` : acc, '/'));
}, []);
const makeSectionPath = useCallback(path => {
if (omitSectionPath) {
return path;
}
return cleanPath(`${sectionPath && sectionPath !== '/' ? sectionPath : ''}${path}`);
}, [omitSectionPath, sectionPath]);
const makeIteratePath = useCallback(function () {
let itemPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : itemPathProp;
let iteratePath = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : iteratePathProp;
let {
omitSectionPath = false
} = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
let root = '';
if (sectionPath && !omitSectionPath) {
root = makeSectionPath('');
}
return cleanPath(`${root}${iteratePath || ''}/${iterateElementIndex}${itemPath || ''}`);
}, [itemPathProp, iteratePathProp, sectionPath, iterateElementIndex, makeSectionPath]);
const itemPath = useMemo(() => {
if (itemPathProp) {
return makeIteratePath();
}
}, [itemPathProp, makeIteratePath]);
const makePath = useCallback(path => {
if (itemPathProp) {
return itemPath;
}
if (sectionPath) {
return makeSectionPath(path);
}
return path;
}, [itemPathProp, sectionPath, itemPath, makeSectionPath]);
const path = useMemo(() => {
return makePath(pathProp);
}, [makePath, pathProp]);
const identifier = path !== null && path !== void 0 ? path : id;
return {
identifier,
path,
itemPath,
joinPath,
makePath,
makeIteratePath,
makeSectionPath,
cleanPath
};
}
function cleanPath(path) {
return path.replace(/\/+$|\/(\/)+/g, '$1');
}
//# sourceMappingURL=usePath.js.map