MessegaForm.jsx 4.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. {
  60. item.text.match(regYoutube) ?
  61. <iframe
  62. width="350"
  63. height="220"
  64. src={`https://www.youtube.com/embed/`+ (item.text.match(regYoutube)[1])}
  65. title="YouTube video player"
  66. frameborder="0"
  67. allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  68. allowfullscreen>
  69. </iframe>
  70. :
  71. <p>{item.text}</p>
  72. }
  73. </div>
  74. <div className={
  75. (item.userName === user.userName)? 'myDate' :'date'}>
  76. {dateFormat(item).time}
  77. </div>
  78. </div>
  79. )}
  80. <div ref={endMessages}></div>
  81. </Box>
  82. )
  83. }