MessegaForm.jsx 6.7 KB

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