UNPKG

react-component-transition

Version:
114 lines (113 loc) 4.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.useChildrenManager = void 0; var tslib_1 = require("tslib"); var react_1 = tslib_1.__importStar(require("react")); var uniqid_1 = tslib_1.__importDefault(require("uniqid")); /** * Returns a new object in the format {[key]: internalKey}. * @param keysMapper - The main internalKey/key mapper. */ var invertMapper = function (keysMapper) { var _a; var inverted = {}; for (var _i = 0, _b = Object.keys(keysMapper); _i < _b.length; _i++) { var key = _b[_i]; var childKey = (_a = keysMapper[key]) === null || _a === void 0 ? void 0 : _a.key; if (childKey) { inverted[childKey] = key; } } return inverted; }; /** * Returns a 'ChildrenManagerOut' depending on the current children. * @param children - The current children. */ var useChildrenManager = function (children) { var childrenMapper = react_1.useRef({}); var internalKeys = react_1.useRef([]); var exitKeys = react_1.useRef([]); var enterKeys = react_1.useRef([]); var mounted = react_1.useRef(false); react_1.useEffect(function () { mounted.current = true; }, []); if (!children) { return { childrenMapper: childrenMapper.current, internalKeys: internalKeys.current, removeExit: function () { return 0; }, removeEnter: function () { return 0; }, exitKeys: [], enterKeys: [], }; } var inverted = invertMapper(childrenMapper.current); var internalKeysUpdated = []; var childrenKeysAssert = {}; var newChildrenIndexes = []; react_1.default.Children.forEach(children, function (child, i) { var childKey = child === null || child === void 0 ? void 0 : child.key; var childInternalKey = inverted[childKey]; if (childrenKeysAssert[childKey]) { logError("Detected duplicated key `" + childKey + "` in two children. Children keys should be unique."); return; } if (childKey !== undefined && childKey !== null && childInternalKey === undefined) { var newKey = uniqid_1.default(); internalKeysUpdated.push(newKey); childrenMapper.current[newKey] = child; childrenKeysAssert[childKey] = newKey; newChildrenIndexes.push(i); if (mounted.current) { enterKeys.current.push(newKey); } } else if (childInternalKey) { internalKeysUpdated.push(childInternalKey); childrenMapper.current[childInternalKey] = child; childrenKeysAssert[childKey] = childInternalKey; } }); var _loop_1 = function (i) { var exists = internalKeysUpdated.indexOf(internalKeys.current[i]) > -1; if (exists) { return "continue"; } var accumulator = newChildrenIndexes.filter(function (newIndex) { return newIndex <= i; }).length; var index = i + accumulator; internalKeysUpdated = tslib_1.__spreadArrays(internalKeysUpdated.slice(0, index), [ internalKeys.current[i] ], internalKeysUpdated.slice(index)); exitKeys.current.push(internalKeys.current[i]); }; for (var i = 0; i < internalKeys.current.length; i++) { _loop_1(i); } internalKeys.current = internalKeysUpdated; var removeExit = function (internalKey) { delete childrenMapper.current[internalKey]; internalKeys.current = internalKeys.current.filter(function (key) { return key !== internalKey; }); exitKeys.current = exitKeys.current.filter(function (key) { return key !== internalKey; }); return exitKeys.current.length; }; var removeEnter = function (internalKey) { enterKeys.current = enterKeys.current.filter(function (key) { return key !== internalKey; }); return enterKeys.current.length; }; return { childrenMapper: childrenMapper.current, internalKeys: internalKeys.current, removeExit: removeExit, removeEnter: removeEnter, exitKeys: exitKeys.current, enterKeys: enterKeys.current, }; }; exports.useChildrenManager = useChildrenManager; var logError = function (message) { if (process.env.NODE_ENV === "development") { console.error(message); } };