import React, { useCallback, useEffect, useMemo, useState } from 'react' import List from "@mui/material/List"; import ListItem from "@mui/material/ListItem"; import ListItemButton from "@mui/material/ListItemButton"; import ListItemIcon from "@mui/material/ListItemIcon"; import ListItemText from "@mui/material/ListItemText"; import moment from 'moment' import { Box, ButtonBase, Collapse, Typography } from "@mui/material"; import { Spacer } from "../../common/Spacer"; import { getBaseApiReact, isMobile } from "../../App"; import { MessagingIcon } from '../../assets/Icons/MessagingIcon'; import MailIcon from '@mui/icons-material/Mail'; import MailOutlineIcon from '@mui/icons-material/MailOutline'; import { executeEvent } from '../../utils/events'; import { CustomLoader } from '../../common/CustomLoader'; import { useRecoilState } from 'recoil'; import { mailsAtom, qMailLastEnteredTimestampAtom } from '../../atoms/global'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import ExpandLessIcon from '@mui/icons-material/ExpandLess'; import MarkEmailUnreadIcon from '@mui/icons-material/MarkEmailUnread'; export const isLessThanOneWeekOld = (timestamp) => { // Current time in milliseconds const now = Date.now(); // One week ago in milliseconds (7 days * 24 hours * 60 minutes * 60 seconds * 1000 milliseconds) const oneWeekAgo = now - (7 * 24 * 60 * 60 * 1000); // Check if the timestamp is newer than one week ago return timestamp > oneWeekAgo; }; export function formatEmailDate(timestamp: number) { const date = moment(timestamp); const now = moment(); if (date.isSame(now, 'day')) { // If the email was received today, show the time return date.format('h:mm A'); } else if (date.isSame(now, 'year')) { // If the email was received this year, show the month and day return date.format('MMM D'); } else { // For older emails, show the full date return date.format('MMM D, YYYY'); } } export const QMailMessages = ({userName, userAddress}) => { const [isExpanded, setIsExpanded] = useState(false) const [mails, setMails] = useRecoilState(mailsAtom) const [lastEnteredTimestamp, setLastEnteredTimestamp] = useRecoilState(qMailLastEnteredTimestampAtom) const [loading, setLoading] = useState(true) const getMails = useCallback(async () => { try { setLoading(true) const query = `qortal_qmail_${userName.slice( 0, 20 )}_${userAddress.slice(-6)}_mail_` const response = await fetch(`${getBaseApiReact()}/arbitrary/resources/search?service=MAIL_PRIVATE&query=${query}&limit=10&includemetadata=false&offset=0&reverse=true&excludeblocked=true&mode=ALL`); const mailData = await response.json(); setMails(mailData); } catch (error) { console.error(error); } finally { setLoading(false) } }, []) const getTimestamp = async () => { try { return new Promise((res, rej) => { window.sendMessage("getEnteredQmailTimestamp") .then((response) => { if (!response?.error) { if(response?.timestamp){ setLastEnteredTimestamp(response?.timestamp) } } rej(response.error); }) .catch((error) => { rej(error.message || "An error occurred"); }); }); } catch (error) {} }; useEffect(() => { getTimestamp() if(!userName || !userAddress) return getMails(); const interval = setInterval(() => { getTimestamp() getMails(); }, 300000); return () => clearInterval(interval); }, [getMails, userName, userAddress]); const anyUnread = useMemo(()=> { let unread = false mails.forEach((mail)=> { if(!lastEnteredTimestamp && isLessThanOneWeekOld(mail?.created) || (lastEnteredTimestamp && isLessThanOneWeekOld(mail?.created) && lastEnteredTimestamp < mail?.created)){ unread = true } }) return unread }, [mails, lastEnteredTimestamp]) return ( setIsExpanded((prev)=> !prev)} > Latest Q-Mails {isExpanded ? : ( )} {loading && mails.length === 0 && ( )} {!loading && mails.length === 0 && ( Nothing to display )} {mails?.map((mail)=> { return ( { executeEvent("addTab", { data: { service: 'APP', name: 'q-mail' } }); executeEvent("open-apps-mode", { }); setLastEnteredTimestamp(Date.now()) }} > {!lastEnteredTimestamp && isLessThanOneWeekOld(mail?.created) ? ( ) : !lastEnteredTimestamp ? ( ): (lastEnteredTimestamp < mail?.created) && isLessThanOneWeekOld(mail?.created) ? ( ) : ( ) } ) })} ) }