UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

83 lines (82 loc) 2.95 kB
"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