MessegaForm.jsx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { Avatar, Box, Button} 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. import { MessageEditorMenu } from '../MessageEditorMenu.jsx';
  10. import imgBtn from '../../../assets/img/gg.png';
  11. export const MessageForm = () => {
  12. const dispatch = useDispatch();
  13. const SERVER_URL = process.env.REACT_APP_SERVER_URL|| 'http://localhost:5000/';
  14. const startMessages = useSelector(state => state.getUserSocketReducer.startMessages)
  15. const user = useSelector(state => state.getUserSocketReducer.socketUserData)
  16. const usersOnline = useSelector(state => state.getUserSocketReducer.usersOnline)
  17. const userNamesOnlineSet = new Set(usersOnline.map( i => i.userName))
  18. const storeMessageId = useSelector(state => state.messageReducer.messageId)
  19. let endMessages =useRef(null);
  20. const regYoutube = /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/; //for youtube video
  21. useEffect(() => {
  22. scrollToBottom(endMessages)
  23. console.log('useEffect', endMessages)
  24. }, [startMessages]);
  25. return (
  26. <Box className='messageBox'>
  27. {
  28. startMessages.map((item, i) =>
  29. <div key={i + 1} className={
  30. (item.userName === user.userName)? 'message myMessage' :'message'}
  31. onClick = {(e) => {
  32. if(e.target.className.includes('myMessage') && (item.userName === user.userName) && (item.text === e.target.textContent)){
  33. e.currentTarget.className += ' editMessage'
  34. dispatch(editMessage({editMessage: e.target.textContent, messageId: item._id}))
  35. }
  36. }}
  37. >
  38. {storeMessageId === item._id ? <MessageEditorMenu/> : ""}
  39. <StyledAvatar
  40. anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
  41. variant = {userNamesOnlineSet.has(item.userName)? 'dot' : ''}
  42. >
  43. <Avatar
  44. key={i}
  45. src= {SERVER_URL + item?.user?.avatar}
  46. sx={
  47. (item.userName == user.userName)
  48. ?
  49. {
  50. alignSelf: 'flex-end',
  51. }
  52. :
  53. {}
  54. }
  55. >
  56. {item?.userName.slice(0, 1)}
  57. </Avatar>
  58. </StyledAvatar>
  59. <div
  60. key={i}
  61. className={
  62. (item.userName === user.userName)? 'message myMessage' :'message'}>
  63. {
  64. item.text.match(regYoutube) ?
  65. <iframe
  66. width="280"
  67. height="160"
  68. src={`https://www.youtube.com/embed/`+ (item.text.match(regYoutube)[1])}
  69. title="YouTube video player"
  70. allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  71. allowFullScreen>
  72. </iframe>
  73. :
  74. <p>{item.text}</p>
  75. }
  76. {
  77. (item.file && item.file.split('.')[1] !== 'jpeg') ?
  78. <a href={SERVER_URL + item.file} download>
  79. <Button
  80. variant="contained"
  81. component="label"
  82. sx = {{
  83. minWidth: 'auto',
  84. minHeight: '40px',
  85. backgroundImage:'url(' + imgBtn + ')' ,
  86. backgroundPosition: 'center',
  87. backgroundRepeat: "no-repeat",
  88. backgroundSize: '20px 40px'
  89. }}
  90. >
  91. </Button>
  92. </a>
  93. :
  94. ''
  95. }
  96. {
  97. (item.file && item.file.split('.')[1] == 'jpeg' ) //need to fix for other type files
  98. ?
  99. <img width={150} height={150} src={ SERVER_URL + item.file} alt={'error load image'}/>
  100. :
  101. ''
  102. }
  103. </div>
  104. <div className={
  105. (item.userName === user.userName)? 'myDate' :'date'}>
  106. {dateFormat(item).time}
  107. </div>
  108. </div>
  109. )}
  110. <div ref={endMessages}></div>
  111. </Box>
  112. )
  113. }