@ozen-ui/kit
Version:
React component library
83 lines (82 loc) • 3.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useStepperVerticalStepsStructure = void 0;
var react_1 = require("react");
var useEventBus_1 = require("../../../../hooks/useEventBus");
var useStoredValue_1 = require("../../../../hooks/useStoredValue");
var Collapse_1 = require("../../../Collapse");
var useStepperVerticalStepsStructure = function (ref, stepsControl, children) {
var eventBus = (0, useEventBus_1.useEventBus)();
var structure = (0, useStoredValue_1.useStoredValue)({
nodes: [],
nodeById: {},
});
var calculate = function () {
var element = ref.current;
if (!element) {
return { nodes: [], nodeById: {} };
}
var nodeById = {};
var nodes = [];
var stepsControlSteps = Object.values(stepsControl.steps.current);
var collectNodeSubsteps = function (node, element) {
var substeps = Object.values(node.step.substeps);
if (substeps.length === 0) {
return;
}
var nextElement = element.nextElementSibling;
if (!nextElement) {
throw new Error('Ожидается следующий элемент для шага с подшагами');
}
var isNextElementCollapse = nextElement.classList.contains((0, Collapse_1.cnCollapse)());
if (!isNextElementCollapse) {
throw new Error('Ожидается collapse для подшагов');
}
var collapseInner = nextElement.firstElementChild;
if (!collapseInner) {
throw new Error('Не удалось получить inner для collapse');
}
Array.from(collapseInner.childNodes).forEach(function (collapseStep) {
var relatedSubstep = substeps.find(function (substep) { return substep.ref.current === collapseStep; });
if (!relatedSubstep) {
return;
}
var newNode = {
root: node,
step: relatedSubstep,
substeps: [],
};
nodeById[relatedSubstep.id] = newNode;
node.substeps.push(newNode);
if (Object.keys(relatedSubstep.substeps).length > 0) {
collectNodeSubsteps(newNode, relatedSubstep.ref.current);
}
});
};
element.childNodes.forEach(function (node) {
var relatedStep = stepsControlSteps.find(function (step) { return step.ref.current === node; });
if (!relatedStep) {
return;
}
var newNode = {
root: null,
step: relatedStep,
substeps: [],
};
nodeById[relatedStep.id] = newNode;
nodes.push(newNode);
collectNodeSubsteps(newNode, newNode.step.ref.current);
});
return { nodeById: nodeById, nodes: nodes };
};
var recalculate = function () {
var newStructure = calculate();
structure.current = newStructure;
eventBus.publish('update', { structure: structure.current });
};
(0, react_1.useEffect)(function () {
recalculate();
}, [children]);
return (0, react_1.useMemo)(function () { return ({ value: structure, eventBus: eventBus }); }, []);
};
exports.useStepperVerticalStepsStructure = useStepperVerticalStepsStructure;