MessegaForm.jsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { Avatar, Box, StyledBadge } from '@mui/material';
  2. import { dateFormat } from '../utils/dateFormat';
  3. import { useSelector } from 'react-redux';
  4. import { useRef, useEffect} from 'react';
  5. import { scrollToBottom } from '../utils/scrollToBottom';
  6. import { useDispatch } from 'react-redux';
  7. import { editMessage } from '../../../reducers/messageReducer';
  8. import { StyledAvatar } from './StyledAvatar';
  9. export const MessageForm = () => {
  10. const dispatch = useDispatch();
  11. const SERVER_URL = process.env.REACT_APP_SERVER_URL|| 'http://localhost:5000/';
  12. const startMessages = useSelector(state => state.getUserSocketReducer.startMessages)
  13. const user = useSelector(state => state.getUserSocketReducer.socketUserData)
  14. const usersOnline = useSelector(state => state.getUserSocketReducer.usersOnline)
  15. const userNamesOnlineSet = new Set(usersOnline.map( i => i.userName))
  16. const endMessages = useRef(null);
  17. const regYoutube = /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/; //for youtube video
  18. useEffect(() => {
  19. scrollToBottom(endMessages)
  20. }, [startMessages, usersOnline]);
  21. return (
  22. <Box className='messageBox'>
  23. {
  24. startMessages.map((item, i) =>
  25. <div key={i} className={
  26. (item.userName === user.userName)? 'message myMessage' :'message'}>
  27. <StyledAvatar
  28. anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
  29. variant = {userNamesOnlineSet.has(item.userName)? 'dot' : ''}
  30. >
  31. <Avatar
  32. src= {SERVER_URL + item?.user?.avatar}
  33. sx={
  34. (item.userName == user.userName)
  35. ?
  36. {
  37. alignSelf: 'flex-end',
  38. }
  39. :
  40. {}
  41. }>
  42. {item?.userName.slice(0, 1)}
  43. </Avatar>
  44. </StyledAvatar>
  45. <div
  46. key={item._id}
  47. onClick = {(e) => {
  48. if(e.target.className.includes('myMessage')){
  49. e.currentTarget.className += ' editMessage'
  50. startMessages.map( item => {
  51. if((item.userName === user.userName) && (item.text === e.target.textContent)){
  52. console.log('edit message',e.target.textContent )
  53. dispatch(editMessage({editMessage: e.target.textContent}))
  54. }
  55. })}
  56. }}
  57. className={
  58. (item.userName === user.userName)? 'message myMessage' :'message'}>
  59. <p>{item.text}</p>
  60. </div>
  61. <div className={
  62. (item.userName === user.userName)? 'myDate' :'date'}>
  63. {dateFormat(item).time}
  64. </div>
  65. </div>
  66. )}
  67. <div ref={endMessages}></div>
  68. </Box>
  69. )
  70. }