| import { useState, useEffect } from 'react'; |
| import { Input } from '@librechat/client'; |
| import { useLocalize } from '~/hooks'; |
| import { Info } from 'lucide-react'; |
|
|
| const MAX_LENGTH = 120; |
|
|
| const Description = ({ |
| initialValue, |
| onValueChange, |
| disabled, |
| tabIndex, |
| }: { |
| initialValue?: string; |
| onValueChange?: (value: string) => void; |
| disabled?: boolean; |
| tabIndex?: number; |
| }) => { |
| const localize = useLocalize(); |
| const [description, setDescription] = useState(initialValue || ''); |
| const [charCount, setCharCount] = useState(initialValue?.length || 0); |
|
|
| useEffect(() => { |
| setDescription(initialValue || ''); |
| setCharCount(initialValue?.length || 0); |
| }, [initialValue]); |
|
|
| useEffect(() => { |
| setCharCount(description.length); |
| }, [description]); |
|
|
| const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => { |
| if (e.target.value.length <= MAX_LENGTH) { |
| setDescription(e.target.value); |
| onValueChange?.(e.target.value); |
| } |
| }; |
|
|
| if (disabled && !description) { |
| return null; |
| } |
|
|
| return ( |
| <div className="rounded-xl border border-border-light shadow-md"> |
| <h3 className="flex h-10 items-center gap-1 pl-4 text-sm text-text-secondary"> |
| <Info className="icon-sm" aria-hidden="true" /> |
| <Input |
| type="text" |
| tabIndex={tabIndex} |
| disabled={disabled} |
| placeholder={localize('com_ui_description_placeholder')} |
| value={description} |
| onChange={handleInputChange} |
| className="border-none" |
| /> |
| {!disabled && ( |
| <span className="mr-4 w-10 text-xs text-text-secondary md:text-sm">{`${charCount}/${MAX_LENGTH}`}</span> |
| )} |
| </h3> |
| </div> |
| ); |
| }; |
|
|
| export default Description; |
|
|