ChatPage.jsx 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  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 imgBtnPhoto from '../../assets/img/photo.png'
  16. import './chatPage.scss';
  17. import WebcamCapture from './service/webCam/WebcamCapture';
  18. import useSound from 'use-sound';
  19. import getNotif from '../../assets/get.mp3'
  20. export const ChatPage = () => {
  21. const SOCKET_EVENTS = process.env.REACT_APP_SERVER_URL || ['allmessages', 'usersOnline', 'allDbUsers']
  22. const dispatch = useDispatch();
  23. const token = useSelector(state => localStorage.getItem('token') || state.userDataReducer.token);
  24. const user = useSelector(state => state.getUserSocketReducer.socketUserData)
  25. const socket = useSelector(state => state.getUserSocketReducer.socket)
  26. const editOldMessage = useSelector(state => state.messageReducer.editMessage)
  27. let showUserInfoBox = useSelector(state => state.messageReducer.showUserInfoBox)// || localStorage.getItem('showBox');
  28. const [message, setMessage] = useState({message: ''});
  29. const [isUserTyping, setUserTyping] = useState([]);
  30. const [isCamActiv, setisCamActiv] = useState(false);
  31. const isTabletorMobile = (window.screen.width < 730);
  32. const [play] = useSound(getNotif);
  33. const webcamEventHandler = () => {
  34. setisCamActiv(!isCamActiv)
  35. }
  36. useEffect(() => {
  37. if(socket) {
  38. socket.on('writing', (data) => {
  39. setUserTyping(data)
  40. setTimeout(() => setUserTyping([]), 500 )
  41. })
  42. }
  43. }, [socket])
  44. useEffect(() => {
  45. if(token){
  46. SOCKET_EVENTS.map(event => dispatch(getSocket(event)))
  47. }
  48. }, [token, editOldMessage, showUserInfoBox])
  49. return (
  50. <div className='rootContainer'>
  51. <Box className = 'rootBox'>
  52. { isTabletorMobile ? <SwitchButton/> : null}
  53. <Box className ={isTabletorMobile ? 'rootMessageFormMobile':'rootMessageForm'} >
  54. {isCamActiv ?
  55. <div>
  56. <Button
  57. variant="contained"
  58. component="label"
  59. onClick = {() => webcamEventHandler()}
  60. >
  61. close camera
  62. </Button>
  63. <WebcamCapture />
  64. </div>
  65. :
  66. ""}
  67. <MessageForm/>
  68. {isUserTyping.isTyping && (isUserTyping.userName !== user.userName)? <span> User {isUserTyping.userName} typing..</span> : ""}
  69. <Box
  70. component="form"
  71. onSubmit = {e => {
  72. e.preventDefault()
  73. dispatch(sendMessage({user, socket}))
  74. dispatch(getSocket('allmessages'))
  75. dispatch(editMessage({editMessage: ''}))
  76. setMessage({message: ''})
  77. play()
  78. }}
  79. sx={(isTabletorMobile)?{
  80. display: 'flex',
  81. margin: '10px 2px'}
  82. :{
  83. display: 'flex',
  84. margin: '20px 5px'}
  85. }>
  86. <Button
  87. variant="contained"
  88. component="label"
  89. sx = {{
  90. minWidth: 'auto',
  91. backgroundImage:'url(' + imgBtn + ')' ,
  92. backgroundPosition: 'center',
  93. backgroundRepeat: "no-repeat",
  94. backgroundSize: '20px 40px'
  95. }}
  96. >
  97. <input
  98. onChange={e =>{
  99. dispatch(fileMessage(e.target.files))
  100. }}
  101. type="file"
  102. multiple
  103. hidden
  104. />
  105. </Button>
  106. <Button
  107. variant="contained"
  108. component="label"
  109. sx = {{
  110. minWidth: 'auto',
  111. backgroundImage:'url(' + imgBtnPhoto + ')' ,
  112. backgroundPosition: 'center',
  113. backgroundRepeat: "no-repeat",
  114. backgroundSize: '20px 20px'
  115. }}
  116. onClick = {() => webcamEventHandler()}
  117. >
  118. </Button>
  119. <TextareaAutosize
  120. id="outlined-basic"
  121. label="Type a message..."
  122. variant="outlined"
  123. value={message.message}
  124. placeholder='type you message...'
  125. minRows={3}
  126. maxRows={4}
  127. className='textArea'
  128. onKeyPress={(e) => {
  129. if (e.key === "Enter") {
  130. e.preventDefault();
  131. dispatch(sendMessage({user, socket}))
  132. dispatch(getSocket('allmessages'))
  133. dispatch(editMessage({editMessage: ''}))
  134. setMessage({message: ''})
  135. }
  136. }}
  137. onChange={e => {
  138. dispatch(storeMessage({message: e.target.value}))
  139. socket.emit('userWriting');
  140. setMessage({message: e.target.value})}
  141. }
  142. />
  143. <Button
  144. variant="contained"
  145. type='submit'
  146. disabled={user?.isMutted}
  147. style={{width: '20%'}}
  148. >
  149. Send
  150. </Button>
  151. </Box>
  152. </Box>
  153. <Box className={isTabletorMobile?'usersBoxMobile':'usersBox'}
  154. sx = {showUserInfoBox ? {
  155. transform: "translateX(100%)",
  156. display: "none"
  157. }: {}}>
  158. <Button
  159. sx={isTabletorMobile ?
  160. {
  161. maxHeight:'25px',
  162. maxWidth: '20px'}
  163. :{margin:'10px 5px'}}
  164. variant="outlined"
  165. onClick={()=> {
  166. localStorage.removeItem('token');
  167. dispatch(removeToken());
  168. socket.disconnect();
  169. }}>
  170. Logout
  171. </Button>
  172. <UserInfo/>
  173. </Box>
  174. </Box>
  175. </div>
  176. )
  177. }