@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
87 lines (86 loc) • 3.85 kB
JavaScript
"use strict";
"use client";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = useDependencePaths;
var _react = require("react");
var _index = _interopRequireDefault(require("../../utils/json-pointer/index.js"));
var _Context = _interopRequireDefault(require("../../DataContext/Context.js"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function useDependencePaths(dependencePaths, propagateIndeterminateState) {
const {
data,
fieldInternalsRef,
handlePathChange
} = (0, _react.useContext)(_Context.default) || {};
const {
allOn,
allOff,
indeterminate,
ariaControlsIds
} = (0, _react.useMemo)(() => {
if (!dependencePaths || !data) {
return {};
}
const check = ({
key,
whenUndefined = false
}) => {
return dependencePaths === null || dependencePaths === void 0 ? void 0 : dependencePaths.every(path => {
if (_index.default.has(data, path)) {
var _fieldInternalsRef$cu;
const value = _index.default.get(data, path);
if ((whenUndefined ? typeof value === 'undefined' : false) || value === (fieldInternalsRef === null || fieldInternalsRef === void 0 || (_fieldInternalsRef$cu = fieldInternalsRef.current) === null || _fieldInternalsRef$cu === void 0 || (_fieldInternalsRef$cu = _fieldInternalsRef$cu[path]) === null || _fieldInternalsRef$cu === void 0 || (_fieldInternalsRef$cu = _fieldInternalsRef$cu.props) === null || _fieldInternalsRef$cu === void 0 ? void 0 : _fieldInternalsRef$cu[key])) {
return true;
}
}
});
};
const ariaControlsIds = dependencePaths.map(path => {
var _fieldInternalsRef$cu2;
return (_fieldInternalsRef$cu2 = fieldInternalsRef.current) === null || _fieldInternalsRef$cu2 === void 0 || (_fieldInternalsRef$cu2 = _fieldInternalsRef$cu2[path]) === null || _fieldInternalsRef$cu2 === void 0 ? void 0 : _fieldInternalsRef$cu2.id;
}).filter(Boolean).join(' ') || undefined;
const allOn = check({
key: 'valueOn'
});
const allOff = check({
key: 'valueOff',
whenUndefined: true
});
const indeterminate = !allOn && !allOff;
return {
allOn,
allOff,
indeterminate,
ariaControlsIds
};
}, [data, dependencePaths, fieldInternalsRef]);
const keepStateRef = (0, _react.useRef)();
(0, _react.useMemo)(() => {
if (allOn && !keepStateRef.current) {
keepStateRef.current = true;
} else if (allOff && keepStateRef.current) {
keepStateRef.current = false;
} else {
if (propagateIndeterminateState !== 'auto' && indeterminate) {
keepStateRef.current = propagateIndeterminateState === 'unchecked';
}
}
}, [allOn, allOff, propagateIndeterminateState, indeterminate]);
const setAllStates = (0, _react.useCallback)(checked => {
dependencePaths === null || dependencePaths === void 0 || dependencePaths.forEach(path => {
var _fieldInternalsRef$cu3;
const fieldProp = checked ? 'valueOn' : 'valueOff';
const value = fieldInternalsRef === null || fieldInternalsRef === void 0 || (_fieldInternalsRef$cu3 = fieldInternalsRef.current) === null || _fieldInternalsRef$cu3 === void 0 || (_fieldInternalsRef$cu3 = _fieldInternalsRef$cu3[path]) === null || _fieldInternalsRef$cu3 === void 0 || (_fieldInternalsRef$cu3 = _fieldInternalsRef$cu3.props) === null || _fieldInternalsRef$cu3 === void 0 ? void 0 : _fieldInternalsRef$cu3[fieldProp];
handlePathChange === null || handlePathChange === void 0 || handlePathChange(path, value);
});
}, [dependencePaths, fieldInternalsRef, handlePathChange]);
return {
setAllStates,
indeterminate,
internalValue: keepStateRef.current,
ariaControlsIds
};
}
//# sourceMappingURL=useDependencePaths.js.map