Skip to content

Commit 86a9564

Browse files
authored
Fix: ensure email text is visible in light mode (issue #1966) (#1994)
1 parent d918210 commit 86a9564

File tree

1 file changed

+14
-33
lines changed

1 file changed

+14
-33
lines changed

apps/mail/components/mail/mail-content.tsx

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
22
import { useEffect, useMemo, useRef, useState, useCallback } from 'react';
33
import { defaultUserSettings } from '@zero/server/schemas';
4-
import { fixNonReadableColors } from '@/lib/email-utils';
54
import { useTRPC } from '@/providers/query-provider';
65
import { getBrowserTimezone } from '@/lib/timezones';
76
import { useSettings } from '@/hooks/use-settings';
@@ -107,33 +106,6 @@ export function MailContent({ id, html, senderEmail }: MailContentProps) {
107106
shadowRootRef.current.innerHTML = processedData.html;
108107
}, [processedData]);
109108

110-
useEffect(() => {
111-
if (!shadowRootRef.current) return;
112-
113-
const root = shadowRootRef.current;
114-
115-
const applyFix: () => void = () => {
116-
const topLevelEls = Array.from(root.children) as HTMLElement[];
117-
topLevelEls.forEach((el) => {
118-
try {
119-
fixNonReadableColors(el, {
120-
defaultBackground: resolvedTheme === 'dark' ? 'rgb(10,10,10)' : '#ffffff',
121-
});
122-
} catch (err) {
123-
console.error('Failed to fix colors in email content:', err);
124-
}
125-
});
126-
};
127-
128-
requestAnimationFrame(applyFix);
129-
}, [processedData, resolvedTheme]);
130-
131-
useEffect(() => {
132-
if (isTrustedSender || temporaryImagesEnabled) {
133-
setCspViolation(false);
134-
}
135-
}, [isTrustedSender, temporaryImagesEnabled]);
136-
137109
const handleImageError = useCallback(
138110
(e: Event) => {
139111
const target = e.target as HTMLImageElement;
@@ -150,7 +122,10 @@ export function MailContent({ id, html, senderEmail }: MailContentProps) {
150122
useEffect(() => {
151123
if (!shadowRootRef.current) return;
152124

153-
shadowRootRef.current.addEventListener('error', handleImageError, true);
125+
const root = shadowRootRef.current;
126+
127+
// Add event listeners for image errors and link clicks
128+
root.addEventListener('error', handleImageError, true);
154129

155130
const handleClick = (e: Event) => {
156131
const target = e.target as HTMLElement;
@@ -165,13 +140,19 @@ export function MailContent({ id, html, senderEmail }: MailContentProps) {
165140
}
166141
};
167142

168-
shadowRootRef.current.addEventListener('click', handleClick);
143+
root.addEventListener('click', handleClick);
169144

170145
return () => {
171-
shadowRootRef.current?.removeEventListener('error', handleImageError, true);
172-
shadowRootRef.current?.removeEventListener('click', handleClick);
146+
root.removeEventListener('error', handleImageError, true);
147+
root.removeEventListener('click', handleClick);
173148
};
174-
}, [handleImageError, processedData]);
149+
}, [processedData, handleImageError]);
150+
151+
useEffect(() => {
152+
if (isTrustedSender || temporaryImagesEnabled) {
153+
setCspViolation(false);
154+
}
155+
}, [isTrustedSender, temporaryImagesEnabled]);
175156

176157
return (
177158
<>

0 commit comments

Comments
 (0)