ChatPage.jsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import { useEffect, useState} from 'react';
  2. import {Button, Box} from '@mui/material';
  3. import TextareaAutosize from '@mui/material/TextareaAutosize';
  4. import { MessageForm } from './messageForm/MessegaForm';
  5. import { UserInfo } from './userInfo/UserInfo';
  6. import { store } from '../../store';
  7. import { removeToken} from '../../reducers/userDataReducer'
  8. import { useDispatch, useSelector } from 'react-redux';
  9. import {getSocket} from'../../reducers/socketReducer';
  10. import { sendMessage, storeMessage, fileMessage } from '../../reducers/messageReducer';
  11. import { editMessage } from '../../reducers/messageReducer';
  12. import { SwitchButton } from './SwitchButton';
  13. import { MessageEditorMenu } from './MessageEditorMenu.jsx';
  14. import imgBtn from '../../assets/img/gg.png'
  15. import './chatPage.scss';
  16. export const ChatPage = () => {
  17. const SOCKET_EVENTS = process.env.REACT_APP_SERVER_URL || ['allmessages', 'usersOnline', 'allDbUsers']
  18. const dispatch = useDispatch();
  19. const token = useSelector(state => localStorage.getItem('token') || state.userDataReducer.token);
  20. const user = useSelector(state => state.getUserSocketReducer.socketUserData)
  21. const socket = useSelector(state => state.getUserSocketReducer.socket)
  22. const editOldMessage = useSelector(state => state.messageReducer.editMessage)
  23. let showUserInfoBox = useSelector(state => state.messageReducer.showUserInfoBox)// || localStorage.getItem('showBox');
  24. const [message, setMessage] = useState({message: ''});
  25. const [isUserTyping, setUserTyping] = useState([]);
  26. const isTabletorMobile = (window.screen.width < 730);
  27. useEffect(() => {
  28. if(socket) {
  29. socket.on('writing', (data) => {
  30. setUserTyping(data)
  31. setTimeout(() => setUserTyping([]), 500 )
  32. })
  33. }
  34. }, [socket])
  35. useEffect(() => {
  36. if(token){
  37. SOCKET_EVENTS.map(event => dispatch(getSocket(event)))
  38. }
  39. }, [token, editOldMessage, showUserInfoBox])
  40. return (
  41. <div className='rootContainer'>
  42. <Box className = 'rootBox'>
  43. { isTabletorMobile ? <SwitchButton/> : null}
  44. <Box className ={isTabletorMobile ? 'rootMessageFormMobile':'rootMessageForm'} >
  45. <MessageForm/>
  46. {isUserTyping.isTyping && (isUserTyping.userName !== user.userName)? <span> User {isUserTyping.userName} typing..</span> : ""}
  47. <Box
  48. component="form"
  49. onSubmit = {e => {
  50. e.preventDefault()
  51. dispatch(sendMessage({user, socket}))
  52. dispatch(getSocket('allmessages'))
  53. dispatch(editMessage({editMessage: ''}))
  54. setMessage({message: ''})
  55. }}
  56. sx={(isTabletorMobile)?{
  57. display: 'flex',
  58. margin: '10px 2px'}
  59. :{
  60. display: 'flex',
  61. margin: '20px 5px'}
  62. }>
  63. <Button
  64. variant="contained"
  65. component="label"
  66. sx = {{
  67. minWidth: 'auto',
  68. backgroundImage:'url(' + imgBtn + ')' ,
  69. backgroundPosition: 'center',
  70. backgroundRepeat: "no-repeat",
  71. backgroundSize: '20px 40px'
  72. }}
  73. >
  74. <input
  75. onChange={e =>{
  76. dispatch(fileMessage(e.target.files))
  77. }}
  78. type="file"
  79. multiple
  80. hidden
  81. />
  82. </Button>
  83. <TextareaAutosize
  84. id="outlined-basic"
  85. label="Type a message..."
  86. variant="outlined"
  87. value={message.message || editOldMessage}
  88. placeholder='type you message...'
  89. minRows={3}
  90. maxRows={4}
  91. className='textArea'
  92. onKeyPress={(e) => {
  93. if (e.key === "Enter") {
  94. e.preventDefault();
  95. dispatch(sendMessage({user, socket}))
  96. dispatch(getSocket('allmessages'))
  97. dispatch(editMessage({editMessage: ''}))
  98. setMessage({message: ''})
  99. }
  100. }}
  101. onChange={e => {
  102. dispatch(storeMessage({message: e.target.value}))
  103. socket.emit('userWriting');
  104. setMessage({message: e.target.value})}
  105. }
  106. />
  107. <Button
  108. variant="contained"
  109. type='submit'
  110. disabled={user?.isMutted}
  111. style={{width: '20%'}}
  112. >
  113. Send
  114. </Button>
  115. </Box>
  116. </Box>
  117. <Box className={isTabletorMobile?'usersBoxMobile':'usersBox'}
  118. sx = {showUserInfoBox ? {
  119. transform: "translateX(100%)",
  120. display: "none"
  121. }: {}}>
  122. <Button
  123. sx={isTabletorMobile ?
  124. {
  125. maxHeight:'25px',
  126. maxWidth: '20px'}
  127. :{margin:'10px 5px'}}
  128. variant="outlined"
  129. onClick={()=> {
  130. localStorage.removeItem('token');
  131. dispatch(removeToken());
  132. socket.disconnect();
  133. }}>
  134. Logout
  135. </Button>
  136. <UserInfo/>
  137. </Box>
  138. </Box>
  139. </div>
  140. )
  141. }