import { type AllHTMLAttributes } from 'react'; import { classNames } from '@vkontakte/vkjs'; import { getMergedSameEventsByProps } from '../helpers/getMergedSameEventsByProps'; import { mergeStyle } from '../helpers/mergeStyle'; import { filterObject } from '../lib/object'; import { type HasRootRef } from '../types'; import { useExternRef } from './useExternRef'; type BaseProps = HasRootRef & Pick, 'className' | 'style'>; const filterProps = (props: T) => { return filterObject(props, (value) => value !== undefined); }; export const useMergeProps = ( originalProps: T, slotProps?: T, ): T => { const originalSlotGetRef = originalProps.getRootRef; const rootSlotGetRef = slotProps?.getRootRef; const getRootRef = useExternRef(originalSlotGetRef, rootSlotGetRef); if (!slotProps) { return filterProps(originalProps); } const { className: rootSlotClassName, style: rootSlotStyle, ...rootSlotProps } = slotProps || {}; const { className: originalClassName, style: originalSlotStyle, ...originalRestProps } = originalProps; const resolvedClassName = originalClassName || rootSlotClassName ? classNames(originalClassName, rootSlotClassName) : undefined; const resolvedStyle = originalSlotStyle || rootSlotStyle ? mergeStyle(originalSlotStyle, rootSlotStyle) : undefined; const mergedEventsByInjectProps: any = getMergedSameEventsByProps( originalRestProps, rootSlotProps, ); const resolvedProps: T = { ...originalRestProps, ...rootSlotProps, ...mergedEventsByInjectProps, }; if (resolvedClassName) { resolvedProps.className = resolvedClassName; } if (resolvedStyle) { resolvedProps.style = resolvedStyle; } if (rootSlotGetRef || originalSlotGetRef) { resolvedProps.getRootRef = getRootRef; } return filterProps(resolvedProps); };