MessegaForm.jsx 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. }, [startMessages]);
  24. return (
  25. <Box className='messageBox'>
  26. {
  27. startMessages.map((item, i) =>
  28. <div key={i + 1} className={
  29. (item.userName === user.userName)? 'message myMessage' :'message'}
  30. onClick = {(e) => {
  31. if(e.target.className.includes('myMessage') && (item.userName === user.userName) && (item.text === e.target.textContent)){
  32. e.currentTarget.className += ' editMessage'
  33. dispatch(editMessage({editMessage: e.target.textContent, messageId: item._id}))
  34. }
  35. }}
  36. >
  37. {storeMessageId === item._id ? <MessageEditorMenu/> : ""}
  38. <StyledAvatar
  39. anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
  40. variant = {userNamesOnlineSet.has(item.userName)? 'dot' : ''}
  41. >
  42. <Avatar
  43. key={i}
  44. src= {SERVER_URL + item?.user?.avatar}
  45. sx={
  46. (item.userName == user.userName)
  47. ?
  48. {
  49. alignSelf: 'flex-end',
  50. }
  51. :
  52. {}
  53. }
  54. >
  55. {item?.userName.slice(0, 1)}
  56. </Avatar>
  57. </StyledAvatar>
  58. <div
  59. key={i}
  60. className={
  61. (item.userName === user.userName)? 'message myMessage' :'message'}>
  62. {
  63. item.text.match(regYoutube) ?
  64. <iframe
  65. width="280"
  66. height="160"
  67. src={`https://www.youtube.com/embed/`+ (item.text.match(regYoutube)[1])}
  68. title="YouTube video player"
  69. allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
  70. allowFullScreen>
  71. </iframe>
  72. :
  73. (item.file && item.fileType && item.fileType.split('/')[0] !== 'image') ?
  74. <div style={{'display': 'flex', 'alignItems': 'center'}} >
  75. <a href={SERVER_URL + item.file} download>
  76. <Button
  77. variant="contained"
  78. component="label"
  79. sx = {{
  80. minWidth: 'auto',
  81. minHeight: '25px',
  82. backgroundImage:'url(' + imgBtn + ')' ,
  83. backgroundPosition: 'center',
  84. backgroundRepeat: "no-repeat",
  85. backgroundSize: '15px 20px',
  86. backgroundColor: '#d3d3d3'
  87. }}
  88. >
  89. </Button>
  90. </a>
  91. <p style={{'marginLeft': '15px'}} >{item.text}</p>
  92. </div>
  93. :
  94. <p>{item.text}</p>
  95. }
  96. {
  97. (item.file && item.fileType && item.fileType.split('/')[0] == 'image' ) //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. }