MessegaForm.jsx 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { Avatar, Box, StyledBadge } from '@mui/material';
  2. import { dateFormat } from '../utils/dateFormat';
  3. import { useSelector } from 'react-redux';
  4. import { useRef, useEffect, useState} 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. import { MessageEditorMenu } from '../MessageEditorMenu.jsx';
  10. export const MessageForm = () => {
  11. const dispatch = useDispatch();
  12. const SERVER_URL = process.env.REACT_APP_SERVER_URL|| 'http://localhost:5000/';
  13. const startMessages = useSelector(state => state.getUserSocketReducer.startMessages)
  14. const user = useSelector(state => state.getUserSocketReducer.socketUserData)
  15. const usersOnline = useSelector(state => state.getUserSocketReducer.usersOnline)
  16. const userNamesOnlineSet = new Set(usersOnline.map( i => i.userName))
  17. const storeMessageId = useSelector(state => state.messageReducer.messageId)
  18. const endMessages =useRef(null);
  19. const regYoutube = /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/; //for youtube video
  20. useEffect(() => {
  21. scrollToBottom(endMessages)
  22. }, [startMessages, usersOnline]);
  23. return (
  24. <Box className='messageBox'>
  25. {
  26. startMessages.map((item, i) =>
  27. <div key={i + 1} className={
  28. (item.userName === user.userName)? 'message myMessage' :'message'}
  29. onClick = {(e) => {
  30. if(e.target.className.includes('myMessage') && (item.userName === user.userName) && (item.text === e.target.textContent)){
  31. e.currentTarget.className += ' editMessage'
  32. dispatch(editMessage({editMessage: e.target.textContent, messageId: item._id}))
  33. }
  34. }}
  35. >
  36. {storeMessageId === item._id ? <MessageEditorMenu/> : ""}
  37. <StyledAvatar
  38. anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
  39. variant = {userNamesOnlineSet.has(item.userName)? 'dot' : ''}
  40. >
  41. <Avatar
  42. key={i}
  43. src= {SERVER_URL + item?.user?.avatar}
  44. sx={
  45. (item.userName == user.userName)
  46. ?
  47. {
  48. alignSelf: 'flex-end',
  49. }
  50. :
  51. {}
  52. }
  53. >
  54. {item?.userName.slice(0, 1)}
  55. </Avatar>
  56. </StyledAvatar>
  57. <div
  58. key={i/10}
  59. className={
  60. (item.userName === user.userName)? 'message myMessage' :'message'}>
  61. {
  62. item.text.match(regYoutube) ?
  63. <iframe
  64. width="280"
  65. height="160"
  66. src={`https://www.youtube.com/embed/`+ (item.text.match(regYoutube)[1])}
  67. title="YouTube video player"
  68. allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  69. allowFullScreen>
  70. </iframe>
  71. :
  72. <p>{item.text}</p>
  73. }
  74. </div>
  75. <div className={
  76. (item.userName === user.userName)? 'myDate' :'date'}>
  77. {dateFormat(item).time}
  78. </div>
  79. </div>
  80. )}
  81. <div ref={endMessages}></div>
  82. </Box>
  83. )
  84. }