"use client"; import type { KeyboardEvent, ReactNode, Ref, TextareaHTMLAttributes } from "react"; export interface ChatComposerClassNames { root: string; form: string; input: string; submit: string; submitContent: string; } export interface ChatComposerProps { message: string; onMessageChange: (value: string) => void; onSubmit: () => void; onKeyDown?: (event: KeyboardEvent) => void; placeholder?: string; disabled?: boolean; submitDisabled?: boolean; allowEmptySubmit?: boolean; submitLabel?: string; className?: string; classNames?: Partial; inputRef?: Ref; rows?: number; textareaProps?: Omit, "className" | "disabled" | "onChange" | "onKeyDown" | "placeholder" | "rows" | "value">; renderSubmitContent?: () => ReactNode; renderFooter?: () => ReactNode; } const DEFAULT_CLASS_NAMES: ChatComposerClassNames = { root: "sa-chat-composer", form: "sa-chat-composer-form", input: "sa-chat-composer-input", submit: "sa-chat-composer-submit", submitContent: "sa-chat-composer-submit-content", }; const cx = (...values: Array) => values.filter(Boolean).join(" "); const mergeClassNames = (defaults: ChatComposerClassNames, overrides?: Partial): ChatComposerClassNames => ({ root: cx(defaults.root, overrides?.root), form: cx(defaults.form, overrides?.form), input: cx(defaults.input, overrides?.input), submit: cx(defaults.submit, overrides?.submit), submitContent: cx(defaults.submitContent, overrides?.submitContent), }); export const ChatComposer = ({ message, onMessageChange, onSubmit, onKeyDown, placeholder, disabled = false, submitDisabled = false, allowEmptySubmit = false, submitLabel = "Send", className, classNames: classNameOverrides, inputRef, rows = 1, textareaProps, renderSubmitContent, renderFooter, }: ChatComposerProps) => { const resolvedClassNames = mergeClassNames(DEFAULT_CLASS_NAMES, classNameOverrides); const isSubmitDisabled = disabled || submitDisabled || (!allowEmptySubmit && message.trim().length === 0); return (
{ event.preventDefault(); if (!isSubmitDisabled) { onSubmit(); } }} >