|
@@ -1,6 +1,10 @@
|
|
|
import { useState, useEffect,useMemo } from 'react';
|
|
|
-import { useDispatch,useSelector } from 'react-redux';
|
|
|
+import { useDispatch, useSelector } from 'react-redux';
|
|
|
+import Tab from '@mui/material/Tab';
|
|
|
+import Tabs from '@mui/material/Tabs';
|
|
|
+import Box from '@mui/material/Box';
|
|
|
import { makeStyles } from '@material-ui/core'
|
|
|
+import { styled } from '@mui/material/styles';
|
|
|
|
|
|
import ChatListRecent from './ChatListRecent'
|
|
|
import FilesList from './FilesList';
|
|
@@ -13,43 +17,58 @@ import { asyncGetChats } from '../../../../redux/chats/operations';
|
|
|
import { getStateMemo } from '../../../../redux/chats/selector';
|
|
|
import { getAllMessagesMemo } from '../../../../redux/allMessages/selector';
|
|
|
import { getState } from '../../../../redux/control/selector';
|
|
|
-import { sortByRecent,timeStampFilter,refreshAppTime } from '../../../../helpers';
|
|
|
+import { sortByRecent,filterBy,filteredMessages,handleSort,timeStampFilter,refreshAppTime } from '../../../../helpers';
|
|
|
import { asyncStartChatById } from '../../../../redux/chat/operations';
|
|
|
import { getPinnedMessagesMemo } from '../../../../redux/pinnedMessages/selector';
|
|
|
import { actionLeftIsOpen,actionRightIsOpen,actionOpenPinned } from '../../../../redux/control/action';
|
|
|
+import { TMessage } from '../../../../typescript/redux/messages/types';
|
|
|
|
|
|
const useStyles = makeStyles({
|
|
|
-container: {
|
|
|
- height:'7vh',
|
|
|
- borderBottom: 'solid 2px #dddddd',
|
|
|
- display: 'flex',
|
|
|
- justifyContent: 'space-around',
|
|
|
- alignContent: "center",
|
|
|
- alignItems:"center",
|
|
|
- flexWrap: 'nowrap',
|
|
|
- color:'rgba(0, 0, 0, 0.6)'
|
|
|
-},
|
|
|
-item: {
|
|
|
- height:'100%',
|
|
|
- display: 'flex',
|
|
|
- flexDirection: 'column',
|
|
|
- justifyContent: 'center',
|
|
|
- alignContent: "center",
|
|
|
- alignItems: "center",
|
|
|
- cursor:'pointer',
|
|
|
-},
|
|
|
-icon: {
|
|
|
- fontSize: '1rem',
|
|
|
- lineHeight: 0,
|
|
|
- marginBottom: 0,
|
|
|
- fontWeight:600
|
|
|
- },
|
|
|
-underline: {
|
|
|
- fontSize: '2.2rem',
|
|
|
- lineHeight: 0,
|
|
|
+ container: {
|
|
|
+ height: '5vh',
|
|
|
+ display: "flex",
|
|
|
+ alignContent: "end",
|
|
|
+ alignItems: "end",
|
|
|
+ width:'100%',
|
|
|
+ borderBottom: 'solid 2px #dddddd',
|
|
|
},
|
|
|
})
|
|
|
|
|
|
+interface StyledTabsProps {
|
|
|
+ children?: React.ReactNode;
|
|
|
+ value: number;
|
|
|
+ onChange: (event: React.SyntheticEvent, newValue: number) => void;
|
|
|
+}
|
|
|
+
|
|
|
+const StyledTabs = styled((props: StyledTabsProps) => (
|
|
|
+ <Tabs
|
|
|
+ {...props}
|
|
|
+ TabIndicatorProps={{ children: <span className="MuiTabs-indicatorSpan" /> }}
|
|
|
+ />
|
|
|
+))({
|
|
|
+ '& .MuiTabs-flexContainer': {
|
|
|
+ display: "flex",
|
|
|
+ width: '100%',
|
|
|
+ padding:'0px 10px',
|
|
|
+ justifyContent: "space-between"
|
|
|
+ },
|
|
|
+ '& .MuiTabs-indicator': {
|
|
|
+ height: 0,
|
|
|
+ backgroundColor: 'transparent',
|
|
|
+ borderBottom: '3px solid #1976d2',
|
|
|
+ borderLeft: '3px solid transparent',
|
|
|
+ borderRight: '3px solid transparent',
|
|
|
+ },
|
|
|
+});
|
|
|
+
|
|
|
+const StyledTab = styled((props:{label: string}) => <Tab disableRipple {...props} />)({
|
|
|
+ fontSize: '1rem',
|
|
|
+ fontWeight: 550,
|
|
|
+ textTransform: 'none',
|
|
|
+ minWidth: 'auto',
|
|
|
+ },
|
|
|
+);
|
|
|
+
|
|
|
interface ISearchLists {
|
|
|
value: string,
|
|
|
setValue: React.Dispatch<string>
|
|
@@ -68,7 +87,7 @@ const SearchLists = ({ value,setValue,sort,date,setDate,setDisabled,chatDivRef}:
|
|
|
const pinnedMessagesMemo = useSelector(getPinnedMessagesMemo)
|
|
|
const { leftIsOpen,rightIsOpen,openPinned } = useSelector(getState)
|
|
|
const [isActive, setIsActive] = useState<number>(0)
|
|
|
- const handleIsActive = (newValue: number): void => {
|
|
|
+ const handleIsActive = (_e:any,newValue: number): void => {
|
|
|
setIsActive(newValue)
|
|
|
value && setValue('')
|
|
|
date&&setDate('')
|
|
@@ -146,7 +165,7 @@ const SearchLists = ({ value,setValue,sort,date,setDate,setDisabled,chatDivRef}:
|
|
|
}, [leftIsOpen,dispatch]);
|
|
|
|
|
|
|
|
|
- const filteredAndSorted = useMemo(() => {
|
|
|
+ const filteredAndSortedChats = useMemo(() => {
|
|
|
return sortByRecent(chats,sort).filter((el) => {
|
|
|
const credentials = el.name + ' ' + el.lastName
|
|
|
if (!date) {
|
|
@@ -158,48 +177,32 @@ const SearchLists = ({ value,setValue,sort,date,setDate,setDisabled,chatDivRef}:
|
|
|
} else return undefined
|
|
|
})
|
|
|
}, [chats, date, value, sort])
|
|
|
-
|
|
|
+
|
|
|
+ const filteredAndSortedMessages = useMemo(() => {
|
|
|
+ const filtered = messagesMemo.filter((el:TMessage) => filterBy[isActive === 0?0:isActive-1].includes(el.type))
|
|
|
+ if(isActive > 0) setDisabled(filtered.length > 0?false:true)
|
|
|
+ return filteredMessages(handleSort('createdAt', filtered, sort), date, value)
|
|
|
+ }, [messagesMemo, date, isActive, sort, value,setDisabled])
|
|
|
+
|
|
|
return (
|
|
|
- <>
|
|
|
- <div className={classes.container}>
|
|
|
- <div className={classes.item} style={{color:isActive === 0?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
|
|
|
- onClick={() => handleIsActive(0)}>
|
|
|
- <span className={classes.icon}>Chats</span>
|
|
|
- <span className={classes.underline}>___</span>
|
|
|
- </div>
|
|
|
- <div className={classes.item} style={{color:isActive === 1?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
|
|
|
- onClick={() => handleIsActive(1)}>
|
|
|
- <span className={classes.icon}>Files</span>
|
|
|
- <span className={classes.underline}>___</span>
|
|
|
- </div>
|
|
|
- <div className={classes.item} style={{color:isActive === 2?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
|
|
|
- onClick={() => handleIsActive(2)}>
|
|
|
- <span className={classes.icon}>Media</span>
|
|
|
- <span className={classes.underline}>___</span>
|
|
|
- </div>
|
|
|
- <div className={classes.item} style={{color:isActive === 3?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
|
|
|
- onClick={() => handleIsActive(3)}>
|
|
|
- <span className={classes.icon}>Text</span>
|
|
|
- <span className={classes.underline}>___</span>
|
|
|
- </div>
|
|
|
- <div className={classes.item} style={{color:isActive === 4?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
|
|
|
- onClick={() => handleIsActive(4)}>
|
|
|
- <span className={classes.icon}>Audio</span>
|
|
|
- <span className={classes.underline}>___</span>
|
|
|
- </div>
|
|
|
- <div className={classes.item} style={{color:isActive === 5?'#1976d2':"rgba(0, 0, 0, 0.6)"}}
|
|
|
- onClick={() => handleIsActive(5)}>
|
|
|
- <span className={classes.icon}>Video</span>
|
|
|
- <span className={classes.underline}>___</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- {isActive === 0 && <ChatListRecent value={value} date={date}
|
|
|
- filteredAndSorted={filteredAndSorted} handleListItemClick={handleListItemClick} />}
|
|
|
- {isActive === 1 && <FilesList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
- {isActive === 2 && <MediaList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
- {isActive === 3 && <TextList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
- {isActive === 4 && <AudioList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
- {isActive === 5 && <VideoList messagesMemo={messagesMemo} value={value} date={date} sort={sort} setDisabled={setDisabled} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
+ <>
|
|
|
+ <Box className={classes.container}>
|
|
|
+ <StyledTabs sx={{width:'100%'}} onChange={handleIsActive} value={isActive} aria-label="wrapped label tabs example">
|
|
|
+ <StyledTab label='Chats' />
|
|
|
+ <StyledTab label='Files' />
|
|
|
+ <StyledTab label='Media' />
|
|
|
+ <StyledTab label='Text' />
|
|
|
+ <StyledTab label='Audio' />
|
|
|
+ <StyledTab label='Video' />
|
|
|
+ </StyledTabs>
|
|
|
+ </Box>
|
|
|
+ {isActive === 0 && <ChatListRecent value={value} date={date}
|
|
|
+ filteredAndSortedChats={filteredAndSortedChats} handleListItemClick={handleListItemClick} />}
|
|
|
+ {isActive === 1 && <FilesList filteredAndSortedMessages={filteredAndSortedMessages} value={value} date={date} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
+ {isActive === 2 && <MediaList filteredAndSortedMessages={filteredAndSortedMessages} value={value} date={date} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
+ {isActive === 3 && <TextList filteredAndSortedMessages={filteredAndSortedMessages} value={value} date={date} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
+ {isActive === 4 && <AudioList filteredAndSortedMessages={filteredAndSortedMessages} value={value} date={date} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
+ {isActive === 5 && <VideoList filteredAndSortedMessages={filteredAndSortedMessages} value={value} date={date} handleScrollToTheMessage={handleScrollToTheMessage}/>}
|
|
|
</>
|
|
|
)
|
|
|
}
|