You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Prowlarr/frontend/src/Helpers/elementChildren.js

150 lines
3.3 KiB

// https://github.com/react-bootstrap/react-element-children
import React from 'react';
/**
* Iterates through children that are typically specified as `props.children`,
* but only maps over children that are "valid components".
*
* The mapFunction provided index will be normalised to the components mapped,
* so an invalid component would not increase the index.
*
* @param {?*} children Children tree container.
* @param {function(*, int)} func.
* @param {*} context Context for func.
* @return {object} Object containing the ordered map of results.
*/
export function map(children, func, context) {
let index = 0;
return React.Children.map(children, (child) => {
if (!React.isValidElement(child)) {
return child;
}
return func.call(context, child, index++);
});
}
/**
* Iterates through children that are "valid components".
*
* The provided forEachFunc(child, index) will be called for each
* leaf child with the index reflecting the position relative to "valid components".
*
* @param {?*} children Children tree container.
* @param {function(*, int)} func.
* @param {*} context Context for context.
*/
export function forEach(children, func, context) {
let index = 0;
React.Children.forEach(children, (child) => {
if (!React.isValidElement(child)) {
return;
}
func.call(context, child, index++);
});
}
/**
* Count the number of "valid components" in the Children container.
*
* @param {?*} children Children tree container.
* @returns {number}
*/
export function count(children) {
let result = 0;
React.Children.forEach(children, (child) => {
if (!React.isValidElement(child)) {
return;
}
++result;
});
return result;
}
/**
* Finds children that are typically specified as `props.children`,
* but only iterates over children that are "valid components".
*
* The provided forEachFunc(child, index) will be called for each
* leaf child with the index reflecting the position relative to "valid components".
*
* @param {?*} children Children tree container.
* @param {function(*, int)} func.
* @param {*} context Context for func.
* @returns {array} of children that meet the func return statement
*/
export function filter(children, func, context) {
const result = [];
forEach(children, (child, index) => {
if (func.call(context, child, index)) {
result.push(child);
}
});
return result;
}
export function find(children, func, context) {
let result = null;
forEach(children, (child, index) => {
if (result) {
return;
}
if (func.call(context, child, index)) {
result = child;
}
});
return result;
}
export function every(children, func, context) {
let result = true;
forEach(children, (child, index) => {
if (!result) {
return;
}
if (!func.call(context, child, index)) {
result = false;
}
});
return result;
}
export function some(children, func, context) {
let result = false;
forEach(children, (child, index) => {
if (result) {
return;
}
if (func.call(context, child, index)) {
result = true;
}
});
return result;
}
export function toArray(children) {
const result = [];
forEach(children, (child) => {
result.push(child);
});
return result;
}