import { identity, uniq, isEmpty, last } from "lodash"; import { OptionDetails } from "$lib-core-types/OptionDetails.types"; import { Option } from "$lib-core-types/Option.types"; import { extractDetailsInfoFromParent } from "$providers/FilteringProvider/utils"; import { OptionWithParents } from '../coreTypes/OptionWithParents.types'; export interface ToDetails { (option: Option, parent?: OptionDetails): OptionDetails; } const defaultProperties = { parents: [], parentsLabels: [], childrenCategories: [], tagParentLabel: null }; const extractDetailsInfoFromChildren = (option: Option) => { const children = option.subOptions || []; const categories: string[] = children .map(({ category }) => category!) .filter(identity); return { childrenCategories: uniq(categories) }; }; export const toDetails: ToDetails = ( option: Option, parent?: OptionDetails ) => { const parentInfo = parent ? extractDetailsInfoFromParent(parent) : {}; const childrenInfo = extractDetailsInfoFromChildren(option); const parentKeys = (parent && parent.parents) || []; const parentId = (parent && [parent.option.id]) || []; const indexKey = [...parentKeys, ...parentId, option.id].join("-"); return { indexKey, option, ...defaultProperties, ...parentInfo, ...childrenInfo }; }; const findParentsInOptions = (optionSet: Option[], parentsIdsToFind: (string|number)[]): Option[] => { const [currentId, ...rest] = parentsIdsToFind; const option = optionSet.find(({ id }) => id === currentId); return [option!, ...(isEmpty(rest) ? [] : findParentsInOptions(option!.subOptions!, rest))] } export const getDetailFromInitialValues = (options: Option[]) => (optionWithParents: OptionWithParents) => { const {option, parents } = optionWithParents const parentsOptions = isEmpty(parents) ? [] : findParentsInOptions(options, parents); const lastParent = last(parentsOptions) || {} as Option; const currentOptionReference = (lastParent.subOptions || options).find(({ id }) => id === option.id)!; const indexKey = [...parents, currentOptionReference.id].join("-"); const childrenInfo = extractDetailsInfoFromChildren(currentOptionReference); return { indexKey, option: currentOptionReference, ...defaultProperties, parents, parentsLabels: parentsOptions.map(( { label }) => label), tagParentLabel: lastParent.tagLabel || lastParent.label, childrenCategories: [], ...childrenInfo, } }