import Filters, { FilterValues } from '../../components/Filters'; import React, { FC, useState } from 'react' import { useTranslation } from 'react-i18next' import Table from '../../components/Table'; import { ColumnType } from '../../components/types/TableTypes'; import { InfoCircle, Refresh2, Trash, ArchiveTick, Star1, Sms } from 'iconsax-react'; import { RowActionItem } from '../../components/RowActionsDropdown'; import { useNavigate } from 'react-router-dom'; import { useGetInbox, useMarkAllRead, useSummarizeEmail } from './hooks/useEmailData'; 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 Intelligense from '@/assets/images/intelligense.svg' import SummarizeModal from './Components/SummarizeModal'; import Button from '@/components/Button'; import ModalConfrim from '@/components/ModalConfrim'; import { ErrorType } from '@/helpers/types'; import { toast } from '@/components/Toast'; const List: FC = () => { const navigate = useNavigate(); const { t } = useTranslation(); const [nextCursor, setNextCursor] = useState(undefined); const [previousCursor, setPreviousCursor] = useState(undefined); const [filters, setFilters] = useState({}); const emailActions = useEmailActions(); const [openSummarizeModal, setOpenSummarizeModal] = useState(false); const [showModal, setShowModal] = useState(false); const { mutate: summarizeEmail, isPending: isSummarizing, data: summarizeData } = useSummarizeEmail(); const { mutate: markAllRead, isPending: isMarkingAllRead } = useMarkAllRead(); const { data: inboxData, isLoading, refetch, isFetching } = useGetInbox({ next: nextCursor, previous: previousCursor, limit: 10, ...filters }); // تابع برای گرفتن فقط ساعت const formatTime = (dateString: string) => { try { if (!dateString) return '--:--'; const date = new Date(dateString); if (isNaN(date.getTime())) return '--:--'; return new Intl.DateTimeFormat("fa-IR", { hour: "2-digit", minute: "2-digit", }).format(date); } catch (error) { console.error('خطا در فرمت زمان:', error); return '--:--'; } }; const [selectedMessages, setSelectedMessages] = useState([]); const [selectedMessage, setSelectedMessage] = useState(null); // ستون‌های دسکتاپ (مثل اولیه) const desktopColumns: ColumnType[] = [ { key: 'subject', title: 'عنوان پیام', render: (item) => (
{item.subject || 'بدون موضوع'}
) }, { key: 'intro', title: 'پیش نمایش', render: (item) => (
{item.intro || 'بدون موضوع'}
) }, { key: 'from', title: 'فرستنده', render: (item) => (
{item.from.name || item.from.address}
) }, { key: 'date', title: 'تاریخ', align: 'center', render: (item) => ( {formatTime(item.date)} ) }, ]; // ستون‌های موبایل (سه خطی) const mobileColumns: ColumnType[] = [ { key: 'content', title: 'محتوا', render: (item) => (
{/* سطر اول: فرستنده + ساعت */}
{item.from.name || item.from.address} {formatTime(item.date)}
{/* سطر دوم: موضوع */}
{item.subject || 'بدون موضوع'}
{/* سطر سوم: خلاصه */}
{item.intro || 'بدون متن پیش‌نمایش'}
) } ]; // انتخاب ستون‌ها بر اساس سایز صفحه const [isMobile, setIsMobile] = useState(window.innerWidth < 768); React.useEffect(() => { const handleResize = () => { setIsMobile(window.innerWidth < 768); }; window.addEventListener('resize', handleResize); return () => window.removeEventListener('resize', handleResize); }, []); const columns = isMobile ? mobileColumns : desktopColumns; const tableActions = (
refetch()} />
); const selectedActions = ( <> handleMarkAsReadSelected()} /> handleArchiveSelected()} className="cursor-pointer lg:size-[18px] size-[20px]" /> handleFavoriteSelected()} /> handleDeleteSelected()} className="cursor-pointer lg:size-[18px] size-[20px]" /> ); const handleFilterChange = (newFilters: FilterValues) => { setFilters(newFilters); setNextCursor(undefined); setPreviousCursor(undefined); }; const handleSelectionChange = (selectedRows: InboxMessage[]) => { setSelectedMessages(selectedRows); }; const handleDeleteSelected = () => { const messageIds = selectedMessages.map(message => message.id); emailActions.bulkMoveToTrash(messageIds, selectedMessages[0].mailbox); setSelectedMessages([]); }; const handleArchiveSelected = () => { const messageIds = selectedMessages.map(message => message.id); emailActions.bulkArchive(messageIds, selectedMessages[0].mailbox); setSelectedMessages([]); }; const handleMarkAsReadSelected = () => { const messageIds = selectedMessages.map(message => message.id); emailActions.bulkMarkAsSeen(messageIds, selectedMessages[0].mailbox); setSelectedMessages([]); }; const handleFavoriteSelected = () => { const messageIds = selectedMessages.map(message => message.id); emailActions.bulkFavorite(messageIds, selectedMessages[0].mailbox); setSelectedMessages([]); }; const handleMarkAll = () => { markAllRead(undefined, { onSuccess: () => { refetch(); setShowModal(false); }, onError: (error: ErrorType) => { toast(error.response?.data?.error.message[0], 'error') } }); }; const getInlineActions = (item: InboxMessage) => [ { icon: , onClick: () => { }, // عملیات در کامپوننت Favorite خودش انجام می‌شود tooltip: item.flagged ? 'حذف از علاقه‌مندی‌ها' : 'اضافه به علاقه‌مندی‌ها' }, { icon: , onClick: () => { }, // عملیات در کامپوننت Summerize خودش انجام می‌شود tooltip: 'خلاصه‌سازی' } ]; const getRowActions = (message: InboxMessage): RowActionItem[] => [ { label: 'مشاهده خلاصه', icon: summerize, onClick: () => { setSelectedMessage(message) setOpenSummarizeModal(true) summarizeEmail({ messageId: message.id, mailbox: message.mailbox }) }, }, ]; const handleNext = (cursor?: string) => { setNextCursor(cursor); setPreviousCursor(undefined); }; const handlePrevious = (cursor?: string) => { setPreviousCursor(cursor); setNextCursor(undefined); }; const messages = inboxData?.data?.results || []; const rootData = inboxData?.data as unknown as Record; const responseNextCursor = (typeof rootData?.nextCursor === 'string' && rootData.nextCursor !== '') ? rootData.nextCursor as string : undefined; const responsePreviousCursor = (typeof rootData?.previousCursor === 'string' && rootData.previousCursor !== '') ? rootData.previousCursor as string : undefined; return (

{t('received.title')}

columns={columns} data={messages} isLoading={isLoading || emailActions.isLoading} showHeader={false} actions={tableActions} selectedActions={selectedActions} onSelectionChange={handleSelectionChange} selectedRows={selectedMessages} onRowClick={(id, item) => navigate(`/mail/${id}/${item.mailbox}`)} noDataMessage={
هیچ پیامی یافت نشد
} selectable={true} inlineActions={getInlineActions} rowActions={getRowActions} pagination={(responseNextCursor || responsePreviousCursor) ? { hasNext: !!responseNextCursor, nextCursor: responseNextCursor, previousCursor: responsePreviousCursor, onNext: handleNext, onPrevious: handlePrevious } : undefined} /> {selectedMessage && ( setOpenSummarizeModal(false)} isPending={isSummarizing} item={selectedMessage} id={selectedMessage.id.toString()} mailbox={selectedMessage.mailbox} data={summarizeData} /> )} setShowModal(false)} onConfrim={handleMarkAll} isLoading={isMarkingAllRead} title={'خواندن همه'} label={'آیا از خواندن همه پیام ها اطمینان دارید؟'} />
) } export default List