import { useMemo } from 'react'; import type { Value } from 'classnames'; import classnames, { Binding } from 'classnames/bind'; export type TStyle = Record; type TReturnFunction = ( arg1: keyof TArgs | Partial>, arg2?: keyof TArgs | Partial>, arg3?: keyof TArgs | Partial>, arg4?: keyof TArgs | Partial>, arg5?: keyof TArgs | Partial>, ...args: Array>> ) => string; // export function useClassnames(target: TTarget, source?: string, overwrite?: boolean): TReturnFunction; export function useClassnames(target: TTarget, source?: TSource, overwrite?: boolean): TReturnFunction; export function useClassnames(target: TTarget, source?: TSource, overwrite?: boolean) { return useMemo(() => { if(source) { if(typeof source === 'object' && !Array.isArray(source)) { if(overwrite) { return classnames.bind({ ...target, ...source } as Binding) as TReturnFunction; } const result = { ...target } as Record; for(const [key, value] of Object.entries(source)) { // @ts-ignore Need fix // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/restrict-template-expressions result[key] = result[key] ? `${result[key]} ${source[key]}` : value; } return classnames.bind(result) as TReturnFunction; } if(typeof source === 'string') { const result = { ...target } as Record; const keys = Object.keys(result); const value = result[keys[0]]; if(keys[0] && value) { result[keys[0]] = `${value} ${source}`; } return classnames.bind(result as Binding) as TReturnFunction; } } return classnames.bind(target as Binding) as TReturnFunction; }, [target, source, overwrite]); }