index.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import React from 'react';
  2. import Button from '@material-ui/core/Button';
  3. import TextField from '@material-ui/core/TextField';
  4. import SaveIcon from '@material-ui/icons/Save';
  5. import { makeStyles } from '@material-ui/core/styles';
  6. import AddAPhotoIcon from '@material-ui/icons/AddAPhoto';
  7. import './message.scss';
  8. import {useState, useEffect} from "react";
  9. import Avatar from '@material-ui/core/Avatar';
  10. import {useDispatch, useSelector, connect} from "react-redux";
  11. import {useParams} from 'react-router-dom';
  12. import Card from '@material-ui/core/Card';
  13. import CardActionArea from '@material-ui/core/CardActionArea';
  14. import CardContent from '@material-ui/core/CardContent';
  15. import CardMedia from '@material-ui/core/CardMedia';
  16. import {actionAdMessage} from '../../App.js';
  17. const useStyles = makeStyles((theme) => ({
  18. messageList: {
  19. width: "70%",
  20. maxWidth: "70%",
  21. backgroundColor: '#ccd7e3',
  22. display: 'flex',
  23. flexDirection: 'column-reverse',
  24. },
  25. userList: {
  26. width: "30%",
  27. marginRight: "5px",
  28. minWidth: "max-content",
  29. backgroundColor: '#ccd7e3'
  30. },
  31. MessageInput:{
  32. margin: '10px'
  33. },
  34. user:{
  35. display: 'flex',
  36. height: '60px',
  37. backgroundColor: '#88a0b9',
  38. margin: '10px',
  39. alignItems: 'center',
  40. padding: '5px'
  41. },
  42. avatar:{
  43. marginRight: '5px'
  44. },
  45. messageCard:{
  46. maxWidth: '80%',
  47. margin: '10px',
  48. width: 'max-content',
  49. padding: '4px'
  50. },
  51. myUserColor:{
  52. backgroundColor: "#848bd8",
  53. maxWidth: '80%',
  54. margin: '10px',
  55. marginRight: '-6px',
  56. marginLeft: '-5px',
  57. width: 'max-content',
  58. padding: '4px',
  59. },
  60. userColor:{
  61. backgroundColor: "#50905f",
  62. maxWidth: '80%',
  63. maxHeight: '21px',
  64. margin: '10px',
  65. marginRight: '-6px',
  66. width: 'max-content',
  67. padding: '4px',
  68. },
  69. UserDiv:{
  70. display: 'flex',
  71. },
  72. myUserDiv:{
  73. display: 'flex',
  74. flexDirection: 'row-reverse',
  75. marginRight: '15px',
  76. }
  77. }));
  78. function MyMessage({user, message}) {
  79. const login = useSelector(state => state.auth?.payload?.sub?.login)
  80. const classes = useStyles();
  81. return(<div className={login===user?classes.myUserDiv:classes.UserDiv}>
  82. <Card className={login===user?classes.myUserColor:classes.userColor}>{user} </Card>
  83. <Card className={classes.messageCard}>{message} </Card>
  84. </div>
  85. )
  86. }
  87. const Users = ({myOnclick, user})=>{
  88. const classes = useStyles();
  89. return(
  90. <CardActionArea onClick={()=>myOnclick(user._id)}>
  91. <Card className={classes.user}>
  92. <Avatar className={classes.avatar} alt="Remy Sharp" />
  93. <p >{user.login} </p>
  94. </Card>
  95. </CardActionArea>
  96. )
  97. }
  98. const Message = ({loadData,dataMyUser ,sendMessage, myMessage=[],forMeMessage=[] , myNewMessage=[]})=>{
  99. const classes = useStyles();
  100. const dispatch = useDispatch();
  101. const id = useSelector(state => state.auth?.payload?.sub?.id)
  102. const [time, setTime] = useState(true);
  103. const [users, setUsers] = useState([]);
  104. useEffect(() => {
  105. if(forMeMessage.length>0||myMessage.length>0){
  106. let allmessages=[]
  107. if(forMeMessage.length>0){
  108. allmessages = [...forMeMessage]
  109. }
  110. if(myMessage.length>0){
  111. allmessages = [...myMessage]
  112. }
  113. if(forMeMessage.length>0&&myMessage.length>0){
  114. allmessages = [...forMeMessage,...myMessage]
  115. }
  116. if(allmessages.length>0){
  117. let usersList = allmessages.map((el)=>{
  118. if(el.to){
  119. return{login:el.to.login, _id:el.to._id}
  120. }
  121. return{login:el.owner.login, _id:el.owner._id}
  122. } )
  123. usersList = usersList.reduce((a, b) => {
  124. if (!a.find(v => v._id == b._id)) {
  125. a.push(b);
  126. }
  127. return a;
  128. }, []);
  129. setUsers(usersList)
  130. }
  131. }
  132. },[forMeMessage,myMessage])
  133. const [send, setSend] = useState(false);
  134. useEffect(() => {
  135. loadData(id)
  136. },[send])
  137. const [message, setMessage] = useState('');
  138. const [iduser, setIduser]= useState("");
  139. const [messageArr, setMessageArr] = useState([]);
  140. const [allmessage, setAllMessage] = useState([]);
  141. const onclickSend =()=>{
  142. if(message){
  143. dispatch(actionAdMessage({text:message, to:{_id:iduser}}))
  144. setSend(!send)
  145. setMessage('')
  146. }
  147. }
  148. const upDate=()=>{
  149. let usersMessage = []
  150. forMeMessage.map((el)=>{
  151. if(el.owner._id===iduser){
  152. usersMessage.push(el)
  153. }
  154. })
  155. myMessage.map((el)=>{
  156. if(el.to._id===iduser){
  157. usersMessage.push(el)
  158. }
  159. })
  160. const sort = usersMessage.sort((a,b)=>a.createdAt-b.createdAt)
  161. setMessageArr(sort)
  162. setAllMessage([...forMeMessage,...myMessage])
  163. }
  164. useEffect(() => {
  165. setTimeout(()=>{
  166. dataMyUser(id)
  167. setTime(!time);
  168. },3000)
  169. },[time])
  170. const onclickUser =(id)=>{
  171. setIduser(id)
  172. let usersMessage = []
  173. forMeMessage.map((el)=>{
  174. if(el.owner._id===id){
  175. usersMessage.push(el)
  176. }
  177. })
  178. myMessage.map((el)=>{
  179. if(el.to._id===id){
  180. usersMessage.push(el)
  181. }
  182. })
  183. const sort = usersMessage.sort((a,b)=>a.createdAt-b.createdAt)
  184. setMessageArr(sort)
  185. }
  186. if(allmessage.length<forMeMessage.length+myMessage.length){
  187. upDate()
  188. }
  189. return (
  190. <main className='mainMessage'>
  191. <Card className={classes.userList}>
  192. {users.map((el)=><Users myOnclick={onclickUser} user={el}/>)}
  193. </Card>
  194. <Card className={classes.messageList}>
  195. <div className='divButtonText'>
  196. <Button onClick={onclickSend} size="small" color="primary">SEND</Button>
  197. <TextField
  198. value={message}
  199. onChange={(e) => setMessage(e.target.value)}
  200. className={classes.MessageInput}
  201. id="standard-basic"
  202. label="Message" />
  203. <div >{messageArr.map((el)=><MyMessage user={el.owner.login} message={el.text}/>)}</div>
  204. </div>
  205. </Card>
  206. </main>
  207. );
  208. }
  209. export default Message