import React, { useId, ChangeEvent, ReactNode, Ref, TextareaHTMLAttributes, useContext, useRef, } from 'react'; import classnames from 'classnames'; import { Text } from './Text'; import { FormElement, FormElementProps } from './FormElement'; import { FieldSetColumnContext } from './FieldSet'; import { useEventCallback } from './hooks'; import { createFC } from './common'; /** * */ export type TextareaProps = { label?: string; required?: boolean; error?: FormElementProps['error']; cols?: number; tooltip?: ReactNode; tooltipIcon?: string; elementRef?: Ref; textareaRef?: Ref; onValueChange?: (value: string, prevValue?: string) => void; readOnly?: boolean; htmlReadOnly?: boolean; } & TextareaHTMLAttributes; /** * */ export const Textarea = createFC( (props) => { const { id, className, label, required, error, cols, tooltip, tooltipIcon, elementRef, textareaRef, onChange: onChange_, onValueChange, readOnly, htmlReadOnly, ...rprops } = props; const prevValueRef = useRef(); const onChange = useEventCallback((e: ChangeEvent) => { onChange_?.(e); onValueChange?.(e.target.value, prevValueRef.current); prevValueRef.current = e.target.value; }); const { isFieldSetColumn } = useContext(FieldSetColumnContext); const errorId = useId(); const taClassNames = classnames(className, 'slds-textarea'); const textareaElem = readOnly ? ( {rprops.value} ) : (