Skip to main content
Glama
FormSection.tsx2.98 kB
import { Form, useForm } from '@intlayer/design-system'; import { cn } from '@utils/cn'; import { ArrowUp, Eraser } from 'lucide-react'; import { useIntlayer } from 'next-intlayer'; import { type FC, type ReactNode, useCallback, useEffect, useRef } from 'react'; import { type FormSectionSchemaData, useFormSectionSchema, } from './useFormSectionSchema'; type FormSectionProps = { nbMessages: number; askNewQuestion: (newQuestion: string) => void; clear: () => void; additionalButtons?: ReactNode; isActive?: boolean; }; export const FormSection: FC<FormSectionProps> = ({ nbMessages, askNewQuestion, clear, additionalButtons, isActive, }) => { const inputRef = useRef<HTMLTextAreaElement>(null); const schema = useFormSectionSchema(); const { form, isSubmitting } = useForm(schema); const { sendQuestionButton, clearButton, textArea } = useIntlayer('chat-form-section'); const handleSubmit = useCallback( (data: FormSectionSchemaData) => { if (!data.question) return; askNewQuestion(data.question); form.reset({ question: '' }); }, [askNewQuestion, form.reset] ); const handleClear = useCallback(() => { clear(); form.reset({ question: '' }); }, [clear, form.reset]); const hasClearButton = nbMessages >= 1; useEffect(() => { if (!isActive) return; // Small delay to ensure the component is fully mounted and visible const timeoutId = setTimeout(() => { inputRef.current?.focus(); }, 100); return () => clearTimeout(timeoutId); }, [isActive]); return ( <Form className="item-end flex h-auto flex-col items-end justify-center gap-3 px-4 py-3" schema={schema} onSubmitSuccess={handleSubmit} {...form} > <Form.AutoSizedTextArea name="question" rows={2} ref={inputRef} maxRows={10} placeholder={textArea.placeholder.value} aria-label={textArea.label.value} autoFocus={isActive} onKeyDown={ // Submit the form when the user presses the Enter key (e) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSubmit(form.getValues()); } } } /> <div className="ml-auto flex items-center justify-between gap-2 max-md:w-full"> {additionalButtons} <Form.Button label={clearButton.label.value} type="button" color="text" variant="outline" size="icon-md" disabled={isSubmitting || !hasClearButton} Icon={Eraser} onClick={handleClear} className={cn(!hasClearButton && 'opacity-0')} /> <Form.Button label={sendQuestionButton.label.value} type="submit" color="text" isLoading={isSubmitting} Icon={ArrowUp} size="icon-md" /> </div> </Form> ); };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/aymericzip/intlayer'

If you have feedback or need assistance with the MCP directory API, please join our Discord server