PrivateChat.jsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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 { MessageEditorMenu } from '../MessageEditorMenu.jsx';
  9. import imgBtn from '../../../assets/img/gg.png';
  10. import useSound from 'use-sound';
  11. import { PrivatChatHeader } from './PrivatChatHeader';
  12. import { privateMessage } from '../../../reducers/userDataReducer';
  13. import notifSound from '../../../assets/get.mp3'
  14. <<<<<<< HEAD
  15. import {isNewPrivateMessages} from "../../../reducers/dataReducers";
  16. import { UserInfoButton } from '../generalChat/UserInfoButton';
  17. =======
  18. import { YoutubeMessage } from '../YoutubeMessage';
  19. >>>>>>> new-branch
  20. //need to fix update wenn message sendet and icon for new private messages
  21. export const PrivateChat = () => {
  22. const dispatch = useDispatch();
  23. const socket = useSelector(state => state.getUserSocketReducer.socket)
  24. const SERVER_URL =process.env.REACT_APP_SERVER_URL
  25. const user = useSelector(state => state.getUserSocketReducer.socketUserData)
  26. const storeMessageId = useSelector(state => state.messageReducer.messageId)
  27. const selectedUser = useSelector(state => state.dataReducer.selectedUser)
  28. const newPrivateMessages = useSelector(state => state.getUserSocketReducer.newPrivateMessages)
  29. const [startMessages, setStartMessages] = useState([])
  30. let endMessages = useRef(null);
  31. <<<<<<< HEAD
  32. socket.on('send privat messages', (messages)=> {
  33. setStartMessages(messages)
  34. });
  35. // bug need to fix****************
  36. =======
  37. socket.on('send privat messages', (messages)=> {
  38. setStartMessages(messages)
  39. });
  40. >>>>>>> new-branch
  41. const [isEditing, setIsEditing] = useState(false)
  42. const [isEditiedMessage, setIsEditiedMessage] = useState(false) //need to type in the bottom of message after message was edited
  43. const [play] = useSound(notifSound);
  44. const regYoutube = /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?‌​[\w\?‌​=]*)?/; //for youtube video
  45. console.log(newPrivateMessages)
  46. useEffect(() => {
  47. if(startMessages.length > 0){
  48. setStartMessages([...startMessages, newPrivateMessages])
  49. }
  50. }, [newPrivateMessages]);
  51. useEffect(() => {
  52. if (!isEditing) {
  53. scrollToBottom((endMessages))
  54. }
  55. }, [startMessages]);
  56. return (
  57. <>
  58. <PrivatChatHeader/>
  59. <Box className='messageBox'>
  60. {
  61. startMessages.map((item, i) =>
  62. <div key={i + 1} className={
  63. (item.fromUser === user._id)? 'message myMessage' :'message'}
  64. onClick = {(e) => {
  65. if(e.target.closest("div").className.includes('myMessage') && (item.userName === user.userName) && (item.text === e.target.textContent)){
  66. e.currentTarget.className += ' editMessage'
  67. dispatch(editMessage({socket, editMessage: e.target.textContent, messageId: item._id}))
  68. setIsEditing(true)
  69. }
  70. }}
  71. >
  72. {storeMessageId === item._id ? <MessageEditorMenu />: ""}
  73. <div
  74. key={i}
  75. className={
  76. (item.fromUser === user._id)? 'message myMessage' :'message'}>
  77. {
  78. item.text.match(regYoutube) ? <YoutubeMessage item = {item} />:
  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={'auto'} style={{'maxWidth': "90%"}} src={ SERVER_URL + '/' + item.file} alt={'error load image'}/>
  106. :
  107. ''
  108. }
  109. </div>
  110. <div className={
  111. (item.userName === user.userName)? 'myDate' :'date'}>
  112. {dateFormat(item)}
  113. </div>
  114. {isEditiedMessage && <i>Edited</i>}
  115. {/* <div className={
  116. (item.fromUser === user._id)? 'myDate' :'date'}>
  117. {dateFormat(item).time}
  118. </div> */}
  119. </div>
  120. )}
  121. <div ref={endMessages}></div>
  122. </Box>
  123. </>
  124. )
  125. }