fix problem font in detail email + refetch inbox when open detail email + ...

This commit is contained in:
hamid zarghami
2025-07-17 12:46:16 +03:30
parent a8b203f324
commit 1139df424f
5 changed files with 102 additions and 9 deletions
+31
View File
@@ -80,3 +80,34 @@ export const formatDate = (dateString: string) => {
minute: "2-digit",
}).format(date);
};
export const sanitizeEmailHTML = (html: string): string => {
try {
// Remove style tags and their content
let sanitized = html.replace(/<style[^>]*>[\s\S]*?<\/style>/gi, "");
// Remove link tags (CSS files)
sanitized = sanitized.replace(/<link[^>]*>/gi, "");
// Remove all style attributes
sanitized = sanitized.replace(/\s*style\s*=\s*["'][^"']*["']/gi, "");
// Remove font-family and other font-related CSS properties
sanitized = sanitized
.replace(/font-family\s*:\s*[^;]*;?/gi, "")
.replace(/font-size\s*:\s*[^;]*;?/gi, "")
.replace(/font-weight\s*:\s*[^;]*;?/gi, "")
.replace(/color\s*:\s*[^;]*;?/gi, "");
// Remove script tags for security
sanitized = sanitized.replace(/<script[^>]*>[\s\S]*?<\/script>/gi, "");
// Remove potentially harmful attributes
sanitized = sanitized.replace(/\s*on\w+\s*=\s*["'][^"']*["']/gi, "");
return sanitized;
} catch (error) {
console.error("خطا در پاک‌سازی HTML:", error);
return "خطا در نمایش محتوای ایمیل";
}
};
+35
View File
@@ -261,3 +261,38 @@ textarea::placeholder {
.animate-spin-reverse {
animation: spin-reverse 1s linear infinite;
}
/* Email Content Isolation */
.email-content-container {
/* ایزوله کردن استایل‌های ایمیل از بقیه سایت */
isolation: isolate;
contain: layout style;
}
.email-content-container * {
/* اعمال فونت اصلی سایت به تمام عناصر داخل ایمیل */
font-family: irancell !important;
/* محدود کردن اندازه فونت */
font-size: inherit !important;
line-height: inherit !important;
/* جلوگیری از تغییر رنگ پس‌زمینه */
background-color: transparent !important;
}
.email-content-container p,
.email-content-container div,
.email-content-container span,
.email-content-container table,
.email-content-container td,
.email-content-container th {
/* حفظ فونت و اندازه اصلی */
font-family: irancell !important;
font-size: 13px !important;
line-height: 1.75 !important;
}
.email-content-container img {
/* محدود کردن اندازه تصاویر */
max-width: 100% !important;
height: auto !important;
}
+16 -5
View File
@@ -1,5 +1,5 @@
import Button from '@/components/Button'
import { FC, useState } from 'react'
import { FC, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { useParams } from 'react-router-dom'
import AvatarImage from '@/assets/images/avatar.svg'
@@ -9,16 +9,17 @@ import AnswerIcon from '@/assets/images/answer.svg'
import Header from './Components/Header'
import ReactQuill from 'react-quill-new';
import Select from '@/components/Select'
import { useGetMessageDetail, useSendEmail } from './hooks/useEmailData'
import { useGetInbox, useGetMessageDetail, useSendEmail } from './hooks/useEmailData'
import { useAuthStore } from '../auth/store/AuthStore'
import { SendEmailDto } from './types/Types'
import { toast } from '@/components/Toast'
import { formatDate } from '@/config/func'
import { formatDate, sanitizeEmailHTML } from '@/config/func'
import SkeletonDetail from './Components/SkeletonDetail'
const DetailEmail: FC = () => {
const { t } = useTranslation()
const { refetch } = useGetInbox({ page: 1 })
const { id } = useParams<{ id: string }>()
const { email: userEmail } = useAuthStore()
const [showAnswer, setShowAnswer] = useState<boolean>(false)
@@ -26,7 +27,7 @@ const DetailEmail: FC = () => {
const [priority, setPriority] = useState<string>('')
// API hooks
const { data: messageDetail, isLoading, error } = useGetMessageDetail(id || '', !!id)
const { data: messageDetail, isLoading, error, isSuccess } = useGetMessageDetail(id || '', !!id)
const sendEmailMutation = useSendEmail()
// const saveDraftMutation = useSaveDraft()
@@ -107,6 +108,12 @@ const DetailEmail: FC = () => {
toast('قابلیت ارسال به دیگران به زودی اضافه خواهد شد', 'info')
}
useEffect(() => {
if (isSuccess) {
refetch()
}
}, [isSuccess])
if (isLoading) {
return (
<SkeletonDetail />
@@ -157,7 +164,11 @@ const DetailEmail: FC = () => {
<div className='xl:mt-8 mt-3 text-[13px] leading-7 font-light'>
{messageDetail.html && messageDetail.html.length > 0 ? (
<div dangerouslySetInnerHTML={{ __html: messageDetail.html.join('') }} />
<div
className='email-content-container p-4 bg-gray-50 rounded-lg overflow-hidden'
dangerouslySetInnerHTML={{ __html: sanitizeEmailHTML(messageDetail.html.join('')) }}
/>
) : (
<p>{messageDetail.text || 'محتوای پیام'}</p>
)}