import List from '@mui/material/List'; import { makeStyles } from '@material-ui/core' import { useEffect,useRef,useCallback,useMemo } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import AlertInfo from '../../../reusableComponents/AlertInfo' import ChatItem from './ChatItem'; import { notification,playNotificationWithoutPermission,sortByRecent } from '../../../../helpers' import { getStateMemo } from '../../../../redux/chats/selector' import { getChatMemo } from '../../../../redux/chat/selector' import { getSilentMode } from '../../../../redux/authorization/selector' import { asyncGetChatById } from '../../../../redux/chat/operations' import { asyncGetChats } from '../../../../redux/chats/operations'; import { actionRightIsOpen,actionScrollChat,actionOpenPinned } from '../../../../redux/control/action' import { TChats,TChat } from '../../../../typescript/redux/chats/types'; import { prodBaseURL,refreshAppTime } from '../../../../helpers'; const useStyles = makeStyles({ list: { width: '100%', maxHeight: '93vh', overflowY: 'scroll', '&::-webkit-scrollbar': { width: '0.4em' }, '&::-webkit-scrollbar-track': { boxShadow: 'inset 0 0 6px rgba(0,0,0,0.00)', webkitBoxShadow: 'inset 0 0 6px rgba(0,0,0,0.00)', backgroundColor: '#eceeec', }, '&::-webkit-scrollbar-thumb': { backgroundColor: '#ccc8c8', }, "&::-webkit-scrollbar-thumb:focus": { backgroundColor: "#959595", }, "&::-webkit-scrollbar-thumb:active": { backgroundColor: "#959595", }, }, }) interface IChatsList { sort: boolean, } const ChatsList = ({sort}:IChatsList) => { const classes = useStyles() const dispatch = useDispatch() const chatsRef = useRef(null) const silentMode = useSelector(getSilentMode) const { total, chats } = useSelector(getStateMemo) const chat = useSelector(getChatMemo) const handleListItemClick = (companionId: string) => { dispatch(actionRightIsOpen('')) dispatch(actionOpenPinned(false)) dispatch(asyncGetChatById(companionId)) if(chat.companionId !== companionId) setTimeout(() => dispatch(actionScrollChat(true)), 500) } const handleNewMsgs = (e: React.MouseEvent, companionId: string) => { e.stopPropagation() dispatch(actionRightIsOpen('')) dispatch(actionOpenPinned(false)) dispatch(asyncGetChatById(companionId)) setTimeout(() => dispatch(actionScrollChat(true)), 500) } const handleNotification = useCallback((companionId: string) => { dispatch(asyncGetChatById(companionId)) dispatch(actionOpenPinned(false)) dispatch(actionRightIsOpen('')) setTimeout(() => dispatch(actionScrollChat(true)), 500) }, [dispatch]) const sortedChats = useMemo((): TChats => { const pinnedArr: any[] = [] const sortedAndFilteredArr: TChats = sortByRecent(chats, sort) .filter((el: TChat) => { if (el.pinned === true) { pinnedArr.push(el) return undefined } else return el }) return [...pinnedArr,...sortedAndFilteredArr] },[chats,sort]) useEffect(() => { const handleReset = () => dispatch(asyncGetChats()) handleReset() const idInterval = setInterval(handleReset, refreshAppTime); return () => clearInterval(idInterval); }, [dispatch]); useEffect(() => { if (chatsRef.current) { chatsRef.current.forEach(({total,seen}: any,i:number) => { const oldDifferent = total - seen const chat = sortedChats[i] if(chat === undefined) return const newDifferent = chat.total - chat.seen if (newDifferent > oldDifferent && !chat.mute) { !silentMode&&playNotificationWithoutPermission(`${prodBaseURL}/telegramReceive.mp3`) notification(chat.name, () => handleNotification(chat.companionId)) } }) } chatsRef.current = sortedChats }, [chat,sortedChats,handleNotification,dispatch,silentMode]) return total !== '0' ? ( {sortedChats.map((el) => )} ):; } export default ChatsList