import { forwardRef, useCallback, type ReactNode, type KeyboardEvent, type ChangeEvent } from "react"; import { PaperPlaneTilt } from "../../ui/icons"; import { ActionButton, InlineNotice } from "../../ui"; export interface ComposerShellProps { value: string; onChange: (value: string, event: ChangeEvent) => void; onSend: () => void; placeholder: string; sending: boolean; error?: string | null; shortcutHint?: string; sendLabel?: string; sendDisabled?: boolean; leading?: ReactNode; belowHeader?: ReactNode; onKeyDownExtra?: (event: KeyboardEvent) => boolean; textareaAriaLabel?: string; rows?: number; } function SendButton({ sending, disabled, onClick, label }: { sending: boolean; disabled: boolean; onClick: () => void; label: string }) { return ( ); } export const ComposerShell = forwardRef(function ComposerShell( { value, onChange, onSend, placeholder, sending, error = null, shortcutHint, sendLabel = "Send message", sendDisabled, leading, belowHeader, onKeyDownExtra, textareaAriaLabel, rows = 2, }, ref, ) { const handleChange = useCallback( (event: ChangeEvent) => { onChange(event.target.value, event); }, [onChange], ); const handleKeyDown = useCallback( (event: KeyboardEvent) => { if (onKeyDownExtra && onKeyDownExtra(event)) return; if (event.key === "Enter" && (event.metaKey || event.ctrlKey)) { event.preventDefault(); onSend(); } }, [onKeyDownExtra, onSend], ); const disabled = sendDisabled ?? !value.trim(); return ( <> {error ?
: null} {belowHeader}
{leading}