import type { IChecker } from "../../checker/config/types"; import type { TCheckerGroupItemsProp, TCheckerGroupItem, ICheckerGroupItemsGroup } from "../config/types"; interface IGetCheckedItemsParams { type?: "checkbox" | "radio"; name?: string; value?: string; checked?: boolean; } /** * Получает элементы с состоянием `checked` * @returns */ export const getCheckedItems = ( items: TCheckerGroupItemsProp = [], params: IGetCheckedItemsParams ): TCheckerGroupItemsProp => { const { type = "checkbox", name = "", value = "", checked = false, } = params; const getIsCheckedItem = (item: IChecker): boolean => { if (type === "checkbox") { if (name === item.name) { return checked; } return !!item.isChecked; } return value === item.value; }; const getIsGroup = (group: TCheckerGroupItem): group is ICheckerGroupItemsGroup => { return "items" in group && Array.isArray(group.items) && !!group.items.length; }; const getIsCheckedGroup = (group: TCheckerGroupItem): TCheckerGroupItem => { const isNested = getIsGroup(group); if (isNested) { return { ...group, items: group.items.map((item) => { return getIsCheckedGroup(item); }), }; } else { return { ...group, isChecked: getIsCheckedItem(group), }; } }; return [ ...items ].map((item = {}) => { return getIsCheckedGroup(item); }); };