import { ReactElement , isValidElement , cloneElement , useCallback } from 'react' ; import get from 'lodash/get' ; import { useTranslate } from '../i18n' ; import { Record } from '../types' ; import { InputProps } from '.' ; export type OptionTextElement = ReactElement < { record : Record ; } > ; export type OptionTextFunc = ( choice : any ) => string | OptionTextElement ; export type OptionText = OptionTextElement | OptionTextFunc | string ; export interface ChoicesInputProps < T = any > extends Omit < InputProps < T > , 'source' > { source ? : string ; choices ? : object [ ] ; } export interface ChoicesProps { choices : object [ ] ; optionValue ? : string ; optionText ? : OptionText ; translateChoice ? : boolean ; } export interface UseChoicesOptions { optionValue ? : string ; optionText ? : OptionText ; disableValue ? : string ; translateChoice ? : boolean ; } const useChoices = ( { optionText = 'name' , optionValue = 'id' , disableValue = 'disabled' , translateChoice = true , } ) => { const translate = useTranslate ( ) ; const getChoiceText = useCallback ( choice => { if ( isValidElement < { record : any ; } > ( optionText ) ) { return cloneElement < { record : any ; } > ( optionText , { record : choice , } ) ; } const choiceName = typeof optionText === 'function' ? optionText ( choice ) : get ( choice , optionText ) ; return translateChoice ? translate ( choiceName , { _ : choiceName } ) : choiceName ; } , [ optionText , translate , translateChoice ] ) ; const getChoiceValue = useCallback ( choice => get ( choice , optionValue ) , [ optionValue , ] ) ; const getDisableValue = useCallback ( choice => get ( choice , disableValue ) , [ disableValue , ] ) ; return { getChoiceText , getChoiceValue , getDisableValue , } ; } ; export default useChoices ;