courrier clean 2
This commit is contained in:
parent
3f5e3097d3
commit
a9dc2da891
@ -90,6 +90,7 @@ export default function ComposeEmail({
|
|||||||
const [useRichEditor, setUseRichEditor] = useState(false);
|
const [useRichEditor, setUseRichEditor] = useState(false);
|
||||||
const [userMessage, setUserMessage] = useState('');
|
const [userMessage, setUserMessage] = useState('');
|
||||||
const [quotedContent, setQuotedContent] = useState('');
|
const [quotedContent, setQuotedContent] = useState('');
|
||||||
|
const [hasStartedTyping, setHasStartedTyping] = useState(false);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// When forwarding or replying, use rich editor
|
// When forwarding or replying, use rich editor
|
||||||
@ -130,6 +131,7 @@ export default function ComposeEmail({
|
|||||||
const formattedEmail = formatEmailForForward(emailForFormatting);
|
const formattedEmail = formatEmailForForward(emailForFormatting);
|
||||||
|
|
||||||
setComposeSubject(formattedEmail.subject);
|
setComposeSubject(formattedEmail.subject);
|
||||||
|
// The email-formatter already adds proper direction, no need for extra wrappers
|
||||||
setQuotedContent(formattedEmail.body);
|
setQuotedContent(formattedEmail.body);
|
||||||
setComposeBody(''); // Clear user message when forwarding
|
setComposeBody(''); // Clear user message when forwarding
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -179,6 +181,7 @@ export default function ComposeEmail({
|
|||||||
setShowCc(true);
|
setShowCc(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The email-formatter already adds proper direction, no need for extra wrappers
|
||||||
setQuotedContent(formattedEmail.body);
|
setQuotedContent(formattedEmail.body);
|
||||||
setComposeBody(''); // Clear user message when replying
|
setComposeBody(''); // Clear user message when replying
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@ -202,10 +205,17 @@ export default function ComposeEmail({
|
|||||||
// Handle contentEditable input changes
|
// Handle contentEditable input changes
|
||||||
const handleUserMessageChange = () => {
|
const handleUserMessageChange = () => {
|
||||||
if (contentEditableRef.current) {
|
if (contentEditableRef.current) {
|
||||||
setUserMessage(contentEditableRef.current.innerHTML);
|
const content = contentEditableRef.current.innerHTML;
|
||||||
|
|
||||||
|
// Check if this is the initial state or if the user has actually typed something
|
||||||
|
if (content && content !== '<p>Write your message here...</p>') {
|
||||||
|
setHasStartedTyping(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
setUserMessage(content);
|
||||||
|
|
||||||
// Combine user message with quoted content for the full email body
|
// Combine user message with quoted content for the full email body
|
||||||
const combined = `${contentEditableRef.current.innerHTML}${quotedContent ? quotedContent : ''}`;
|
const combined = `${content}${quotedContent ? quotedContent : ''}`;
|
||||||
setComposeBody(combined);
|
setComposeBody(combined);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -372,13 +382,27 @@ export default function ComposeEmail({
|
|||||||
contentEditable="true"
|
contentEditable="true"
|
||||||
className="w-full p-3 bg-white min-h-[100px] text-gray-900 email-editor"
|
className="w-full p-3 bg-white min-h-[100px] text-gray-900 email-editor"
|
||||||
onInput={handleUserMessageChange}
|
onInput={handleUserMessageChange}
|
||||||
dangerouslySetInnerHTML={userMessage ? { __html: userMessage } : { __html: '<p>Write your message here...</p>' }}
|
onFocus={() => {
|
||||||
|
// Clear placeholder text when user focuses if they haven't started typing
|
||||||
|
if (!hasStartedTyping && contentEditableRef.current) {
|
||||||
|
contentEditableRef.current.innerHTML = '';
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
onBlur={() => {
|
||||||
|
// Restore placeholder if user hasn't typed anything
|
||||||
|
if (!hasStartedTyping && contentEditableRef.current && !contentEditableRef.current.innerHTML.trim()) {
|
||||||
|
contentEditableRef.current.innerHTML = '<p>Write your message here...</p>';
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
dangerouslySetInnerHTML={hasStartedTyping ? { __html: userMessage } : { __html: '<p>Write your message here...</p>' }}
|
||||||
|
style={{ direction: 'ltr', textAlign: 'left' }}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
{/* Original email content - also editable */}
|
{/* Original email content - also editable */}
|
||||||
{quotedContent && (
|
{quotedContent && (
|
||||||
<div
|
<div
|
||||||
className="w-full bg-gray-50 border-t border-gray-300 email-content-wrapper"
|
className="w-full bg-gray-50 border-t border-gray-300 email-content-wrapper"
|
||||||
|
style={{ direction: 'ltr' }}
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
className="p-3 opacity-90 text-sm email-content"
|
className="p-3 opacity-90 text-sm email-content"
|
||||||
@ -387,7 +411,13 @@ export default function ComposeEmail({
|
|||||||
onInput={(e) => {
|
onInput={(e) => {
|
||||||
const target = e.currentTarget;
|
const target = e.currentTarget;
|
||||||
setQuotedContent(target.innerHTML);
|
setQuotedContent(target.innerHTML);
|
||||||
|
// Update the combined content
|
||||||
|
if (contentEditableRef.current) {
|
||||||
|
const combined = `${contentEditableRef.current.innerHTML}${target.innerHTML}`;
|
||||||
|
setComposeBody(combined);
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
|
style={{ direction: 'ltr', textAlign: 'left' }}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
@ -399,6 +429,7 @@ export default function ComposeEmail({
|
|||||||
onChange={(e) => setComposeBody(e.target.value)}
|
onChange={(e) => setComposeBody(e.target.value)}
|
||||||
placeholder="Write your message..."
|
placeholder="Write your message..."
|
||||||
className="w-full mt-1 min-h-[200px] bg-white border-gray-300 text-gray-900 resize-none email-editor"
|
className="w-full mt-1 min-h-[200px] bg-white border-gray-300 text-gray-900 resize-none email-editor"
|
||||||
|
style={{ direction: 'ltr', textAlign: 'left' }}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -85,13 +85,13 @@ export function formatEmailForReply(
|
|||||||
originalContent = originalEmail.text.replace(/\n/g, '<br>');
|
originalContent = originalEmail.text.replace(/\n/g, '<br>');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Combine the header with the original content
|
// Combine the header with the original content, ensuring proper direction
|
||||||
const body = `
|
const body = `
|
||||||
<div>
|
<div dir="ltr" style="text-align: left;">
|
||||||
<br>
|
<br>
|
||||||
<blockquote style="margin: 0 0 0 0.8ex; border-left: 1px solid #ccc; padding-left: 1ex;">
|
<blockquote style="margin: 0 0 0 0.8ex; border-left: 1px solid #ccc; padding-left: 1ex;">
|
||||||
${quoteHeader}
|
${quoteHeader}
|
||||||
<div>${originalContent || 'No content available'}</div>
|
<div style="direction: ltr; text-align: left;">${originalContent || 'No content available'}</div>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
@ -171,9 +171,9 @@ export function createQuoteHeader(email: EmailMessageForFormatting): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the header HTML
|
// Create the header HTML with explicit LTR direction
|
||||||
return `
|
return `
|
||||||
<div style="margin-bottom: 10px; color: #555; font-size: 0.9em;">
|
<div style="margin-bottom: 10px; color: #555; font-size: 0.9em; direction: ltr; text-align: left;">
|
||||||
<div><strong>From:</strong> ${fromName} <${fromEmail}></div>
|
<div><strong>From:</strong> ${fromName} <${fromEmail}></div>
|
||||||
${dateFormatted ? `<div><strong>Date:</strong> ${dateFormatted}</div>` : ''}
|
${dateFormatted ? `<div><strong>Date:</strong> ${dateFormatted}</div>` : ''}
|
||||||
<div><strong>Subject:</strong> ${email.subject || 'No Subject'}</div>
|
<div><strong>Subject:</strong> ${email.subject || 'No Subject'}</div>
|
||||||
@ -206,14 +206,14 @@ export function formatEmailForForward(email: EmailMessageForFormatting): Formatt
|
|||||||
originalContent = email.text.replace(/\n/g, '<br>');
|
originalContent = email.text.replace(/\n/g, '<br>');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Combine the header with the original content
|
// Combine the header with the original content, ensuring proper direction
|
||||||
const body = `
|
const body = `
|
||||||
<div>
|
<div dir="ltr" style="text-align: left;">
|
||||||
<br>
|
<br>
|
||||||
<div style="border-left: 1px solid #ccc; padding-left: 1ex; margin-left: 0.8ex;">
|
<div style="border-left: 1px solid #ccc; padding-left: 1ex; margin-left: 0.8ex; direction: ltr; text-align: left;">
|
||||||
<div style="font-weight: bold; margin-bottom: 10px;">---------- Forwarded message ---------</div>
|
<div style="font-weight: bold; margin-bottom: 10px; direction: ltr; text-align: left;">---------- Forwarded message ---------</div>
|
||||||
${forwardHeader}
|
${forwardHeader}
|
||||||
<div>${originalContent || '<div style="padding: 10px; text-align: center; background-color: #f8f8f8; border: 1px dashed #ccc; margin: 10px 0;">No content available</div>'}</div>
|
<div style="direction: ltr; text-align: left;">${originalContent || '<div style="padding: 10px; text-align: center; background-color: #f8f8f8; border: 1px dashed #ccc; margin: 10px 0;">No content available</div>'}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user