| import { Input } from '@librechat/client'; | |
| import { SquareSlash } from 'lucide-react'; | |
| import { Constants } from 'librechat-data-provider'; | |
| import { useState, useEffect } from 'react'; | |
| import { useLocalize } from '~/hooks'; | |
| const Command = ({ | |
| initialValue, | |
| onValueChange, | |
| disabled, | |
| tabIndex, | |
| }: { | |
| initialValue?: string; | |
| onValueChange?: (value: string) => void; | |
| disabled?: boolean; | |
| tabIndex?: number; | |
| }) => { | |
| const localize = useLocalize(); | |
| const [command, setCommand] = useState(initialValue || ''); | |
| const [charCount, setCharCount] = useState(initialValue?.length || 0); | |
| useEffect(() => { | |
| setCommand(initialValue || ''); | |
| setCharCount(initialValue?.length || 0); | |
| }, [initialValue]); | |
| useEffect(() => { | |
| setCharCount(command.length); | |
| }, [command]); | |
| const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => { | |
| let newValue = e.target.value.toLowerCase(); | |
| newValue = newValue.replace(/\s/g, '-').replace(/[^a-z0-9-]/g, ''); | |
| if (newValue.length <= Constants.COMMANDS_MAX_LENGTH) { | |
| setCommand(newValue); | |
| onValueChange?.(newValue); | |
| } | |
| }; | |
| if (disabled === true && !command) { | |
| 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"> | |
| <SquareSlash className="icon-sm" aria-hidden="true" /> | |
| <Input | |
| type="text" | |
| tabIndex={tabIndex} | |
| disabled={disabled} | |
| placeholder={localize('com_ui_command_placeholder')} | |
| value={command} | |
| onChange={handleInputChange} | |
| className="border-none" | |
| /> | |
| {disabled !== true && ( | |
| <span className="mr-4 w-10 text-xs text-text-secondary md:text-sm">{`${charCount}/${Constants.COMMANDS_MAX_LENGTH}`}</span> | |
| )} | |
| </h3> | |
| </div> | |
| ); | |
| }; | |
| export default Command; | |