// ** React Imports import { Fragment, useState, SyntheticEvent, ReactNode } from 'react' // ** MUI Imports import Box from '@mui/material/Box' import List from '@mui/material/List' import Input from '@mui/material/Input' import Avatar from '@mui/material/Avatar' import Divider from '@mui/material/Divider' import Tooltip from '@mui/material/Tooltip' import Backdrop from '@mui/material/Backdrop' import Checkbox from '@mui/material/Checkbox' import { styled } from '@mui/material/styles' import IconButton from '@mui/material/IconButton' import Typography from '@mui/material/Typography' import InputAdornment from '@mui/material/InputAdornment' import CircularProgress from '@mui/material/CircularProgress' import ListItem, { ListItemProps } from '@mui/material/ListItem' // ** Icon Imports import Icon from 'src/@core/components/icon' // ** Third Party Imports import PerfectScrollbar from 'react-perfect-scrollbar' // ** Custom Components Imports import OptionsMenu from 'src/@core/components/option-menu' // ** Email App Component Imports import { setTimeout } from 'timers' import MailDetails from './MailDetails' // ** Types import { MailType, MailLogType, MailLabelType, MailFolderType, MailFoldersArrType, MailFoldersObjType } from 'src/types/apps/emailTypes' import { OptionType } from 'src/@core/components/option-menu/types' const MailItem = styled(ListItem)(({ theme }) => ({ cursor: 'pointer', paddingTop: theme.spacing(3), paddingBottom: theme.spacing(3), justifyContent: 'space-between', transition: 'border 0.15s ease-in-out, transform 0.15s ease-in-out, box-shadow 0.15s ease-in-out', '&:not(:first-child)': { borderTop: `1px solid ${theme.palette.divider}` }, '&:hover': { zIndex: 2, boxShadow: theme.shadows[3], transform: 'translateY(-2px)', '& .mail-actions': { display: 'flex' }, '& .mail-info-right': { display: 'none' }, '& + .MuiListItem-root': { borderColor: 'transparent' } }, [theme.breakpoints.up('xs')]: { paddingLeft: theme.spacing(2.5), paddingRight: theme.spacing(2.5) }, [theme.breakpoints.up('sm')]: { paddingLeft: theme.spacing(5), paddingRight: theme.spacing(5) } })) const ScrollWrapper = ({ children, hidden }: { children: ReactNode; hidden: boolean }) => { if (hidden) { return {children} } else { return {children} } } const MailLog = (props: MailLogType) => { // ** Props const { store, query, hidden, lgAbove, dispatch, setQuery, direction, updateMail, routeParams, labelColors, paginateMail, getCurrentMail, mailDetailsOpen, updateMailLabel, handleSelectMail, setMailDetailsOpen, handleSelectAllMail, handleLeftSidebarToggle } = props // ** State const [refresh, setRefresh] = useState(false) // ** Vars const folders: MailFoldersArrType[] = [ { name: 'draft', icon: ( ) }, { name: 'spam', icon: ( ) }, { name: 'trash', icon: ( ) }, { name: 'inbox', icon: ( ) } ] const foldersConfig = { draft: { name: 'draft', icon: ( ) }, spam: { name: 'spam', icon: ( ) }, trash: { name: 'trash', icon: ( ) }, inbox: { name: 'inbox', icon: ( ) } } const foldersObj: MailFoldersObjType = { inbox: [foldersConfig.spam, foldersConfig.trash], sent: [foldersConfig.trash], draft: [foldersConfig.trash], spam: [foldersConfig.inbox, foldersConfig.trash], trash: [foldersConfig.inbox, foldersConfig.spam] } const handleMoveToTrash = () => { dispatch(updateMail({ emailIds: store.selectedMails, dataToUpdate: { folder: 'trash' } })) dispatch(handleSelectAllMail(false)) } const handleStarMail = (e: SyntheticEvent, id: number, value: boolean) => { e.stopPropagation() dispatch(updateMail({ emailIds: [id], dataToUpdate: { isStarred: value } })) } const handleReadMail = (id: number | number[], value: boolean) => { const arr = Array.isArray(id) ? [...id] : [id] dispatch(updateMail({ emailIds: arr, dataToUpdate: { isRead: value } })) dispatch(handleSelectAllMail(false)) } const handleLabelUpdate = (id: number | number[], label: MailLabelType) => { const arr = Array.isArray(id) ? [...id] : [id] dispatch(updateMailLabel({ emailIds: arr, label })) } const handleFolderUpdate = (id: number | number[], folder: MailFolderType) => { const arr = Array.isArray(id) ? [...id] : [id] dispatch(updateMail({ emailIds: arr, dataToUpdate: { folder } })) } const handleRefreshMailsClick = () => { setRefresh(true) setTimeout(() => setRefresh(false), 1000) } const handleLabelsMenu = () => { const array: OptionType[] = [] Object.entries(labelColors).map(([key, value]: string[]) => { array.push({ text: {key}, icon: ( ), menuItemProps: { onClick: () => { handleLabelUpdate(store.selectedMails, key as MailLabelType) dispatch(handleSelectAllMail(false)) } } }) }) return array } const handleFoldersMenu = () => { const array: OptionType[] = [] if (routeParams && routeParams.folder && !routeParams.label && foldersObj[routeParams.folder]) { foldersObj[routeParams.folder].map((folder: MailFoldersArrType) => { array.length = 0 array.push({ icon: folder.icon, text: {folder.name}, menuItemProps: { onClick: () => { handleFolderUpdate(store.selectedMails, folder.name) dispatch(handleSelectAllMail(false)) } } }) }) } else if (routeParams && routeParams.label) { folders.map((folder: MailFoldersArrType) => { array.length = 0 array.push({ icon: folder.icon, text: {folder.name}, menuItemProps: { onClick: () => { handleFolderUpdate(store.selectedMails, folder.name) dispatch(handleSelectAllMail(false)) } } }) }) } else { foldersObj['inbox'].map((folder: MailFoldersArrType) => { array.length = 0 array.push({ icon: folder.icon, text: {folder.name}, menuItemProps: { onClick: () => { handleFolderUpdate(store.selectedMails, folder.name) dispatch(handleSelectAllMail(false)) } } }) }) } return array } const renderMailLabels = (arr: MailLabelType[]) => { return arr.map((label: MailLabelType, index: number) => { return ( ) }) } const mailDetailsProps = { hidden, folders, dispatch, direction, foldersObj, updateMail, routeParams, labelColors, paginateMail, handleStarMail, mailDetailsOpen, handleLabelUpdate, handleFolderUpdate, setMailDetailsOpen, mail: store && store.currentMail ? store.currentMail : null } return ( {lgAbove ? null : ( )} setQuery(e.target.value)} sx={{ width: '100%', '&:before, &:after': { display: 'none' } }} startAdornment={ } /> {store && store.mails && store.selectedMails ? ( dispatch(handleSelectAllMail(e.target.checked))} checked={(store.mails.length && store.mails.length === store.selectedMails.length) || false} sx={{ '& .MuiSvgIcon-root': { fontSize: '1.375rem' }, '&:not(.Mui-checked) .MuiSvgIcon-root': { color: 'text.disabled' } }} indeterminate={ !!( store.mails.length && store.selectedMails.length && store.mails.length !== store.selectedMails.length ) } /> ) : null} {store && store.selectedMails.length && store.mails && store.mails.length ? ( {routeParams && routeParams.folder !== 'trash' ? ( ) : null} handleReadMail(store.selectedMails, false)}> } /> } /> ) : null} setRefresh(false)} sx={{ zIndex: 5, position: 'absolute', color: 'common.white', backgroundColor: 'action.disabledBackground' }} > {/* @ts-ignore */} ) } export default MailLog