UNPKG

@ozen-ui/kit

Version:

React component library

83 lines (82 loc) 3.54 kB
"use strict"; 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;