import React, { Children, useCallback } from 'react'; import { View } from 'react-native'; import { useRenderBone } from './useRenderBone'; import StaticBone from '../StaticBone'; import ShiverBone from '../ShiverBone'; import type { ICustomViewStyle, IGeneralStyles, IComponentSize, } from '../constants'; interface UseGetBonesProps { bonesLayout: ICustomViewStyle[]; children: React.ReactNode; prefix?: string | number; generalStyles: IGeneralStyles; } /** * This hook is used to get the bones based on the layout prop. * @componentSize is the size of the component. */ export const useGetBones = (componentSize: IComponentSize) => { const renderBone = useRenderBone(componentSize); const renderNestedBones = useCallback( ( bones: ICustomViewStyle[], prefix: string | number | undefined, generalStyles: IGeneralStyles, ) => { return bones.map((bone, index) => { const keyIndex = prefix ? `${prefix}_${index}` : index; const { children: childBones, ...layoutStyle } = bone; if (childBones?.length) { return ( {renderNestedBones(childBones, keyIndex, generalStyles)} ); } return renderBone({ generalStyles, bonesLayout: bones, index, keyIndex, }); }); }, [renderBone], ); return useCallback( ({ bonesLayout, children, prefix, generalStyles }: UseGetBonesProps) => { if (bonesLayout && bonesLayout.length > 0) { return renderNestedBones(bonesLayout, prefix, generalStyles); } return Children.map(children, (child, i) => { const styling = child.props.style || {}; if ( generalStyles.animationType === 'pulse' || generalStyles.animationType === 'none' ) { return ( ); } return ( ); }); }, [componentSize, renderNestedBones], ); };