UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

72 lines (71 loc) 2.24 kB
"use client"; import { useCallback, useContext, useRef } from 'react'; import pointer from "../utils/json-pointer/index.js"; import DataContext from "../DataContext/Context.js"; import IterateItemContext from "../Iterate/IterateItemContext.js"; import usePath from "./usePath.js"; export default function useDataValue(pathProp, value) { const dataContextRef = useRef(); dataContextRef.current = useContext(DataContext); const iterateItemContext = useContext(IterateItemContext); const { makePath, makeIteratePath } = usePath(); const get = useCallback((selector, data = dataContextRef.current?.internalDataRef?.current) => { if (selector === '/') { return data; } return pointer.has(data, selector) ? pointer.get(data, selector) : undefined; }, []); const getValueByPath = useCallback((path, data = undefined) => { if (isPath(path)) { return get(makePath(path), data); } }, [get, makePath]); const getValueByIteratePath = useCallback(path => { if (isPath(path)) { return get(makeIteratePath(path)); } }, [get, makeIteratePath]); const moveValueToPath = useCallback((path, value, object = {}) => { if (path !== '/' && isPath(path)) { pointer.set(object, path, value); return object; } return value; }, []); const getData = useCallback((path, options) => { if (isPath(path)) { const value = getValueByPath(path); if (options?.includeCurrentPath && path !== '/') { return moveValueToPath(path, value); } return value; } }, [getValueByPath, moveValueToPath]); const getSourceValue = useCallback(source => { if (typeof source === 'string' && isPath(source)) { if (iterateItemContext) { return getValueByIteratePath(source); } return getValueByPath(source); } return source; }, [getValueByIteratePath, getValueByPath, iterateItemContext]); if (pathProp) { value = getSourceValue(pathProp); } return { getSourceValue, getValueByPath, getValueByIteratePath, moveValueToPath, getData, value }; } function isPath(path) { return typeof path === 'string' && path.startsWith('/'); } //# sourceMappingURL=useDataValue.js.map