import { CloseCircle, Notification } from 'iconsax-react'; import { FC, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { getIconColor } from '@/utils/colorUtils'; import { clx } from '../../helpers/utils'; import StatusCircle from '../../components/StatusCircle'; import { useOutsideClick } from '../../hooks/useOutSideClick'; import { useGetNotification, useReadAll } from './hooks/useNotificationData'; import { NotificationItemType, NotificationTypeEnum } from './types/NotificationTypes'; import { timeAgo } from '../../config/func'; import InfiniteScroll from 'react-infinite-scroll-component'; import MoonLoader from "react-spinners/MoonLoader" import Button from '../../components/Button'; import { toast } from '../../components/Toast'; // import { useNavigate } from 'react-router-dom'; import { ErrorType } from '../../helpers/types'; import { useSharedStore } from '@/shared/store/sharedStore'; const Notifications: FC = () => { // const navigate = useNavigate() const { t } = useTranslation(); const ref = useOutsideClick(() => setShowModal(false)); const [activeTab, setActiveTab] = useState<'read' | 'unread'>('unread'); const [showModal, setShowModal] = useState(false); const { data, fetchNextPage, hasNextPage, refetch } = useGetNotification(activeTab); const readAll = useReadAll() const { emailWidth } = useSharedStore() const posts = data?.pages.flatMap((page) => page.data?.notifications) || []; const handleAllRead = () => { readAll.mutate(undefined, { onSuccess: () => { refetch() toast(t('success'), 'success') }, onError: (error: ErrorType) => { toast(error.response?.data?.error?.message[0], 'error') } }) } const handleRedirect = (type: NotificationTypeEnum) => { switch (type) { case NotificationTypeEnum.USER_LOGIN: break; // case NotificationTypeEnum.ANNOUNCEMENT: // navigate(Pages.announcement.list) // break; // case NotificationTypeEnum.WALLET_CHARGE: // navigate(Pages.transactions) // break; // case NotificationTypeEnum.WALLET_DEDUCTION: // navigate(Pages.transactions) // break; // case NotificationTypeEnum.BILL_INVOICE_REMINDER: // navigate(Pages.receipts.index) // break; // case NotificationTypeEnum.BILL_INVOICE: // navigate(Pages.receipts.index) // break; // case NotificationTypeEnum.CREATE_INVOICE: // navigate(Pages.receipts.index) // break; // case NotificationTypeEnum.CREATE_SERVICE: // navigate(Pages.services.other) // break; // case NotificationTypeEnum.UNBLOCK_SERVICE: // navigate(Pages.services.other) // break; // case NotificationTypeEnum.BLOCK_SERVICE: // navigate(Pages.services.other) // break; // case NotificationTypeEnum.ANSWER_TICKET: // navigate(Pages.ticket.list) // break; // case NotificationTypeEnum.CREATE_TICKET: // navigate(Pages.ticket.list) // break; default: break } setShowModal(false) } return (
setShowModal(!showModal)} className='relative cursor-pointer'>
{data?.pages[0]?.data?.notificationCount}
{showModal && (
0 ? 'xl:left-auto' : 'w-full' )} style={emailWidth > 0 && window.innerWidth > 1280 ? { left: `${emailWidth - 50}px` } : {}} >
{t('notif.natification')}
setShowModal(false)} />
setActiveTab('unread')} className={clx( 'flex-1 border-l cursor-pointer text-white border-white border-opacity-70 bg-transparent flex justify-center items-center', activeTab === 'unread' ? 'bg-white/70 text-black dark:bg-white/15 dark:text-white' : '' )} > خوانده نشده
setActiveTab('read')} className={clx( 'flex-1 cursor-pointer text-white border-white bg-transparent flex justify-center items-center', activeTab === 'read' ? 'bg-white/70 text-black dark:bg-white/15 dark:text-white' : '' )} > خوانده شده
} scrollableTarget="notificationsContainer" > { posts.map((item: NotificationItemType) => (
handleRedirect(item.type)} className="bg-white/60 dark:bg-white/10 dark:text-white cursor-pointer h-fit gap-4 items-start rounded-xl p-3 mb-4 flex" key={item.id}> { !item.isRead &&
}
{item.message}
{timeAgo(item.createdAt)}
{item.title}
)) }
)} ); }; export default Notifications;