From 2ccc096277c8a343dcf3ea764848e6931b238491 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Wed, 29 Oct 2025 11:48:31 +0330 Subject: [PATCH] fix cc and bcc --- src/pages/favorite/List.tsx | 2 +- .../received/Components/BccRecipients.tsx | 87 +++++++++++++++++++ .../received/Components/CcRecipients.tsx | 28 ++++++ src/pages/received/Detail.tsx | 43 +++------ src/pages/received/List.tsx | 6 +- src/pages/received/types/Types.ts | 12 ++- 6 files changed, 142 insertions(+), 36 deletions(-) create mode 100644 src/pages/received/Components/BccRecipients.tsx create mode 100644 src/pages/received/Components/CcRecipients.tsx diff --git a/src/pages/favorite/List.tsx b/src/pages/favorite/List.tsx index 5a2c154..48b1969 100644 --- a/src/pages/favorite/List.tsx +++ b/src/pages/favorite/List.tsx @@ -8,7 +8,7 @@ import { useNavigate } from 'react-router-dom'; import { useGetFavoriteMessages } from './hooks/useFavoriteData'; import { FavoriteMessage } from './types/FavoriteTypes'; import { useEmailActions } from '@/hooks/useEmailActions'; -import Favorite from '../received/Components/Favorite'; +import Favorite from '../received/components/Favorite'; import { Checkbox } from '@/components/ui/checkbox'; import React from 'react'; import { getIconColor } from '@/utils/colorUtils'; diff --git a/src/pages/received/Components/BccRecipients.tsx b/src/pages/received/Components/BccRecipients.tsx new file mode 100644 index 0000000..5509aea --- /dev/null +++ b/src/pages/received/Components/BccRecipients.tsx @@ -0,0 +1,87 @@ +import { FC } from 'react' +import { MessageDetail } from '../types/Types' +import { MailboxEnum } from '../enum/Enum' + +interface BccRecipientsProps { + messageDetail: MessageDetail + userEmail: string | null + mailboxName: MailboxEnum +} + +const BccRecipients: FC = ({ messageDetail, userEmail, mailboxName }) => { + // If userEmail is not available, we can't determine BCC status + if (!userEmail || userEmail.trim() === '') { + return null + } + + // Check if current user was BCC recipient (for received messages) + const isInTo = messageDetail.to?.some(recipient => + recipient.address.toLowerCase().trim() === userEmail.toLowerCase().trim() + ) || false + const isInCc = messageDetail.cc?.some(recipient => + recipient.address.toLowerCase().trim() === userEmail.toLowerCase().trim() + ) || false + + // Check if user is explicitly in BCC field OR implicitly (not in to/cc but received) + const isExplicitlyInBcc = messageDetail.bcc?.some(recipient => + recipient.address.toLowerCase().trim() === userEmail.toLowerCase().trim() + ) || false + const isInBcc = isExplicitlyInBcc || (!isInTo && !isInCc && mailboxName !== MailboxEnum.SENT) + + console.log('BCC Debug:', { + userEmail, + to: messageDetail.to?.map(r => r.address), + cc: messageDetail.cc?.map(r => r.address), + bcc: messageDetail.bcc?.map(r => r.address), + isInTo, + isInCc, + isExplicitlyInBcc, + isInBcc, + mailboxName + }); + + + // Show BCC notice for received messages + if (isInBcc) { + return ( +
+
+ شما به عنوان رونوشت مخفی (BCC) این پیام را دریافت کرده‌اید +
+
+ ) + } + + // Show BCC recipients for sent messages + if (mailboxName === MailboxEnum.SENT && messageDetail.envelope?.rcpt) { + const toAddresses = messageDetail.to?.map(r => r.address.toLowerCase()) || [] + const ccAddresses = messageDetail.cc?.map(r => r.address.toLowerCase()) || [] + + const bccRecipients = messageDetail.envelope.rcpt.filter(rcpt => { + const address = rcpt.value.toLowerCase() + return !toAddresses.includes(address) && !ccAddresses.includes(address) + }) + + if (bccRecipients.length === 0) { + return null + } + + return ( +
+
رونوشت مخفی (BCC):
+
+ {bccRecipients.map((recipient, index) => ( +
+ {recipient.formatted || recipient.value} +
+ ))} +
+
+ ) + } + + return null +} + +export default BccRecipients + diff --git a/src/pages/received/Components/CcRecipients.tsx b/src/pages/received/Components/CcRecipients.tsx new file mode 100644 index 0000000..0019baa --- /dev/null +++ b/src/pages/received/Components/CcRecipients.tsx @@ -0,0 +1,28 @@ +import { FC } from 'react' +import { EmailRecipient } from '../types/Types' + +interface CcRecipientsProps { + recipients: EmailRecipient[] +} + +const CcRecipients: FC = ({ recipients }) => { + if (!recipients || recipients.length === 0) { + return null + } + + return ( +
+
رونوشت (CC):
+
+ {recipients.map((recipient, index) => ( +
+ {recipient.name || recipient.address} {recipient.name && `<${recipient.address}>`} +
+ ))} +
+
+ ) +} + +export default CcRecipients + diff --git a/src/pages/received/Detail.tsx b/src/pages/received/Detail.tsx index 20011ce..84fd220 100644 --- a/src/pages/received/Detail.tsx +++ b/src/pages/received/Detail.tsx @@ -4,25 +4,28 @@ import { useTranslation } from 'react-i18next' import { useParams } from 'react-router-dom' import AvatarImage from '@/assets/images/avatar.svg' import { DocumentDownload } from 'iconsax-react' -import Header from './Components/Header' +import Header from './components/Header' import { useGetMessageDetail, useDownloadAttachment, useSendEmail } from './hooks/useEmailData' import { toast } from '@/components/Toast' import { formatDate, sanitizeEmailHTML, detectTextDirection } from '@/config/func' -import SkeletonDetail from './Components/SkeletonDetail' +import SkeletonDetail from './components/SkeletonDetail' import { useEmailActions } from '@/hooks/useEmailActions' import { MailboxEnum } from './enum/Enum' import Reply from '@/components/newMessage/Reply' import Forward from '@/components/newMessage/Forward' import EmojiReaction from '@/components/EmojiReaction' -import { useAuthStore } from '@/pages/auth/store/AuthStore' import { SendEmailDto } from './types/Types' import { getIconColor } from '@/utils/colorUtils' +import CcRecipients from './components/CcRecipients' +import BccRecipients from './components/BccRecipients' +import { useGetProfile } from '@/pages/profile/hooks/useProfileData' const DetailEmail: FC = () => { const { t } = useTranslation() const emailActions = useEmailActions() - const { email: userEmail } = useAuthStore() + const { data: profileData } = useGetProfile() + const userEmail = profileData?.data?.user?.emailAddress || '' const { id, mailbox } = useParams<{ id: string, mailbox: string }>() const [activeAction, setActiveAction] = useState<'reply' | 'forward' | null>(null) @@ -191,33 +194,13 @@ const DetailEmail: FC = () => { } - {/* CC Recipients */} - {messageDetail.cc && messageDetail.cc.length > 0 && ( -
-
رونوشت (CC):
-
- {messageDetail.cc.map((recipient, index) => ( -
- {recipient.name || recipient.address} {recipient.name && `<${recipient.address}>`} -
- ))} -
-
- )} + - {/* BCC Recipients */} - {messageDetail.bcc && messageDetail.bcc.length > 0 && ( -
-
رونوشت مخفی (BCC):
-
- {messageDetail.bcc.map((recipient, index) => ( -
- {recipient.name || recipient.address} {recipient.name && `<${recipient.address}>`} -
- ))} -
-
- )} +
diff --git a/src/pages/received/List.tsx b/src/pages/received/List.tsx index 9c1c098..4720915 100644 --- a/src/pages/received/List.tsx +++ b/src/pages/received/List.tsx @@ -11,10 +11,10 @@ import { InboxMessage } from './types/Types'; import MarkAsRead from '@/assets/images/mark_as_read.svg' import { useEmailActions } from '@/hooks/useEmailActions'; -import Favorite from './Components/Favorite'; -import Summerize from './Components/Summerize'; +import Favorite from './components/Favorite'; +import Summerize from './components/Summerize'; import Intelligense from '@/assets/images/intelligense.svg' -import SummarizeModal from './Components/SummarizeModal'; +import SummarizeModal from './components/SummarizeModal'; import ModalConfrim from '@/components/ModalConfrim'; import { ErrorType } from '@/helpers/types'; import { toast } from '@/components/Toast'; diff --git a/src/pages/received/types/Types.ts b/src/pages/received/types/Types.ts index 553e94c..7ec89ca 100644 --- a/src/pages/received/types/Types.ts +++ b/src/pages/received/types/Types.ts @@ -198,6 +198,14 @@ export interface MessageDetailResponse { address: string; name: string; }>; + cc?: Array<{ + address: string; + name: string; + }>; + bcc?: Array<{ + address: string; + name: string; + }>; subject: string; messageId: string; date: string; @@ -214,7 +222,7 @@ export interface MessageDetailResponse { attachments: EmailAttachmentDto[]; references: string[]; metaData: Record; - verificationResults: { + verificationResults?: { tls: { name: string; standardName: string; @@ -282,7 +290,7 @@ export interface MessageDetail { attachments: EmailAttachmentDto[]; references: string[]; metaData: Record; - verificationResults: { + verificationResults?: { tls: { name: string; standardName: string;