diff --git a/components/email/email-composer.tsx b/components/email/email-composer.tsx index df454863..9847ffd9 100644 --- a/components/email/email-composer.tsx +++ b/components/email/email-composer.tsx @@ -1143,7 +1143,30 @@ export function EmailComposer({ setShowBcc(true); } } else { - setBody((prev) => bodyContent + (plainTextMode ? '\n' : '') + prev); + // Reply/forward: insert the template at the caret so it lands after any + // text the user has already typed, instead of always prepending it (#539). + if (plainTextMode) { + const textarea = bodyRef.current; + if (textarea) { + const start = textarea.selectionStart ?? textarea.value.length; + const end = textarea.selectionEnd ?? start; + setBody((prev) => prev.slice(0, start) + bodyContent + prev.slice(end)); + // Restore the caret just past the inserted text once React re-renders. + requestAnimationFrame(() => { + const caret = start + bodyContent.length; + textarea.focus(); + textarea.setSelectionRange(caret, caret); + }); + } else { + setBody((prev) => bodyContent + '\n' + prev); + } + } else if (editorRef.current) { + // insertContent lands at the editor's current selection; onUpdate + // propagates the resulting HTML back through onChange → setBody. + editorRef.current.chain().focus().insertContent(bodyContent).run(); + } else { + setBody((prev) => bodyContent + prev); + } } if (template.identityId) {