From 0f7638055cf15de45558c95a6c410d1a1a8bcff8 Mon Sep 17 00:00:00 2001 From: Linus Rath <139418639+rathlinus@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:10:14 +0200 Subject: [PATCH] fix: auto-focus input fields in email composer for improved user experience #126 --- components/email/email-composer.tsx | 73 ++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 11 deletions(-) diff --git a/components/email/email-composer.tsx b/components/email/email-composer.tsx index fe07bc4a..1c96cf8e 100644 --- a/components/email/email-composer.tsx +++ b/components/email/email-composer.tsx @@ -332,6 +332,17 @@ export function EmailComposer({ return () => window.removeEventListener('beforeunload', handleBeforeUnload); }, []); + // Auto-focus the To field when composing a new email or forwarding + useEffect(() => { + if (mode === 'forward' || mode === 'compose') { + // Small delay to ensure the input is rendered + const timer = setTimeout(() => { + toInputRef.current?.focus(); + }, 100); + return () => clearTimeout(timer); + } + }, [mode]); + const [autocompleteResults, setAutocompleteResults] = useState>([]); const [activeAutoField, setActiveAutoField] = useState<'to' | 'cc' | 'bcc' | null>(null); const [autoSelectedIndex, setAutoSelectedIndex] = useState(-1); @@ -339,10 +350,26 @@ export function EmailComposer({ const toInputRef = useRef(null); const ccInputRef = useRef(null); const bccInputRef = useRef(null); + const subjectInputRef = useRef(null); + const bodyRef = useRef(null); + const editorContainerRef = useRef(null); const toDropdownRef = useRef(null); const ccDropdownRef = useRef(null); const bccDropdownRef = useRef(null); + const focusSubject = useCallback(() => { + subjectInputRef.current?.focus(); + }, []); + + const focusBody = useCallback(() => { + if (plainTextMode) { + bodyRef.current?.focus(); + } else { + const proseMirror = editorContainerRef.current?.querySelector('.ProseMirror') as HTMLElement | null; + proseMirror?.focus(); + } + }, [plainTextMode]); + const handleAutocomplete = useCallback((value: string, field: 'to' | 'cc' | 'bcc') => { if (autocompleteTimeoutRef.current) { clearTimeout(autocompleteTimeoutRef.current); @@ -1071,6 +1098,7 @@ export function EmailComposer({ onInsertAutocomplete={insertAutocomplete} validationError={validationErrors.to} validationMessage={t('validation.recipient_required')} + onTab={focusSubject} />