ChatPage.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. import Container from '@mui/material/Container';
  2. import { MessageForm } from './messageForm/MessageForm';
  3. import Button from '@mui/material/Button';
  4. import { UserInfo } from './userInfo/UserInfo';
  5. import { Userslist } from './usersList/UsersList';
  6. import Box from '@mui/material/Box';
  7. import {io} from 'socket.io-client';
  8. import { useEffect, useState} from 'react';
  9. import './chatPage.scss';
  10. import moment from 'moment-timezone';
  11. export const ChatPage = ({ onExit, token }) => {
  12. const newtoken = token;
  13. const [socket, setSocket] = useState(null);
  14. const [messages, setMessages] = useState([])
  15. const [user, setUser] = useState({})
  16. const [usersOnline, setUsersOnline] = useState([])
  17. const [allUsers, setAllUsers] = useState([])
  18. useEffect(() => {
  19. if(newtoken){
  20. try {
  21. const SERVER_URL = 'http://localhost:5000';
  22. setSocket(io.connect(SERVER_URL, {
  23. auth: {token: newtoken}
  24. }) )
  25. } catch (error) {
  26. console.log(error)
  27. }
  28. }
  29. }, [])
  30. const sendMessage = (data) => {
  31. if (data.message && data.message.length < 200) {
  32. console.log('send..' , data)
  33. socket.emit('message', data);
  34. }
  35. };
  36. useEffect(() => {
  37. if(socket){
  38. socket.on('connected', (data) => {
  39. setUser(data);
  40. console.log( data , 'connected to chat...');
  41. }).on('error', (e) => {
  42. console.log(e)
  43. });
  44. socket.on('allmessages', (data) => {
  45. setMessages(data)
  46. console.log( data , 'get messasges useEffect');
  47. }).on('error', (e) => {
  48. console.log(e)
  49. });
  50. socket.on('usersOnline', (data) => {
  51. console.log( data , 'online');
  52. setUsersOnline(data)
  53. }).on('error', (e) => {
  54. console.log(e)
  55. });
  56. socket.on('allDbUsers', (data) => {
  57. console.log( data , 'all users from db');
  58. setAllUsers(data);
  59. }).on('error', (e) => {
  60. console.log(e)
  61. });
  62. socket.on('disconnect', (data) => {
  63. console.log( data, 'token');
  64. // if(data == 'io server disconnect') {
  65. // localStorage.removeItem('token');
  66. // onExit();
  67. // }
  68. }).on('error', (e) => {
  69. console.log(e)
  70. });
  71. socket.on('message', (data) => {
  72. setMessages((messages) => [...messages, data] )
  73. }).on('error', (e) => {
  74. console.log(e)
  75. });
  76. }
  77. }, [socket])
  78. return (
  79. <Container maxWidth="lg">
  80. <Box
  81. sx={{
  82. display: 'flex',
  83. height: '100vh'
  84. }}>
  85. <Box
  86. sx={{
  87. display: 'flex',
  88. flexGrow:'2',
  89. flexDirection: 'column',
  90. }}
  91. >
  92. <Box
  93. className='messageBox'
  94. sx={{
  95. display: 'flex',
  96. flexGrow:'2',
  97. flexDirection: 'column',
  98. overflow: 'scroll',
  99. height: '100vh'
  100. }}
  101. >
  102. {
  103. messages.map((item) =>
  104. <div
  105. key={item._id}
  106. className={ (item.userName == user.userName)?
  107. 'message myMessage' :
  108. 'message'}>
  109. <span>{item.userName}</span>
  110. <p>{item.text}</p>
  111. <div>{item.createDate}</div>
  112. </div>
  113. )}
  114. </Box>
  115. <MessageForm sendMessage = {(data) => {
  116. sendMessage(data)
  117. }}></MessageForm>
  118. </Box>
  119. <Box
  120. className='usersBox'
  121. >
  122. <Button
  123. sx={{
  124. margin:'10px 5px'
  125. }}
  126. variant="contained"
  127. onClick={(e)=> {
  128. socket.disconnect()
  129. onExit()
  130. }}>Logout</Button>
  131. { user.isAdmin ?
  132. allUsers.map((item) =>
  133. <div
  134. key={item._id}
  135. className='online'>
  136. <div>{item.userName}</div>
  137. <div>
  138. <Button
  139. variant="contained"
  140. sx={{
  141. margin:'3px',
  142. height: '25px'
  143. }}>
  144. mute
  145. </Button>
  146. <Button
  147. variant="contained"
  148. sx={{
  149. margin:'3px',
  150. height: '25px'
  151. }}>
  152. ban
  153. </Button>
  154. </div>
  155. {usersOnline.map( user =>{
  156. if(item.userName == user.userName){
  157. return <span style={{color: 'green'}}>online</span>
  158. }}
  159. )
  160. }
  161. </div>)
  162. :
  163. usersOnline.map((item) =>
  164. <div
  165. key={item._id}
  166. className='online'>
  167. <div>{item.userName}</div>
  168. <span style={{color: 'green'}}>online</span>
  169. </div>)}
  170. </Box>
  171. </Box>
  172. </Container>
  173. )
  174. }