ChatPage.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import { useEffect, useMemo, useRef, Fragment} from 'react';
  2. import { MessageForm } from './messageForm/MessageForm';
  3. import {Button,Avatar, Box} from '@mui/material';
  4. import { UserInfo } from './userInfo/UserInfo';
  5. import { dateFormat } from './utils/dateFormat';
  6. import './chatPage.scss';
  7. import { scrollToBottom } from './utils/scrollToBottom';
  8. import { banUser } from './service/banUser';
  9. import { muteUser } from './service/muteUser';
  10. import {sendMessage} from './service/sendMessage';
  11. import { store } from '../../store';
  12. import { removeToken} from '../../reducers/userDataReducer'
  13. import { useDispatch, useSelector } from 'react-redux';
  14. import {getSocket} from'../../reducers/socketReducer';
  15. export const ChatPage = () => {
  16. const dispatch = useDispatch();
  17. const token = useSelector(state => localStorage.getItem('token') || state.userDataReducer.token);
  18. const startMessages = useSelector(state => state.getUserSocketReducer.startMessages)
  19. const user = useSelector(state => state.getUserSocketReducer.socketUserData)
  20. const usersOnline = useSelector(state => state.getUserSocketReducer.usersOnline)
  21. const allUsers = useSelector(state => state.getUserSocketReducer.allUsers)
  22. const randomColor = require('randomcolor');
  23. const endMessages = useRef(null);
  24. useEffect(() => {
  25. if(token){
  26. dispatch(getSocket())
  27. }
  28. }, [])
  29. useEffect(() => {
  30. scrollToBottom(endMessages)
  31. }, [startMessages]);
  32. let userColor = useMemo(() => randomColor(),[]);//color for myavatar
  33. return (
  34. <div className='rootContainer'>
  35. <Box
  36. sx={{
  37. display: 'flex',
  38. height: '100vh'
  39. }}>
  40. <Box
  41. sx={{
  42. display: 'flex',
  43. flexGrow:'2',
  44. maxWidth: '75%',
  45. flexDirection: 'column',
  46. }}>
  47. <Box className='messageBox'>
  48. {
  49. startMessages.map((item, i) =>
  50. <Fragment key={i} >
  51. <Avatar
  52. sx={
  53. (item.userName == user.userName)
  54. ?
  55. {
  56. alignSelf: 'flex-end',
  57. fontSize: 10,
  58. width: '60px',
  59. height: '60px',
  60. color:'black',
  61. backgroundColor: userColor
  62. }
  63. :
  64. {
  65. backgroundColor: (usersOnline.map(current => {
  66. if(item.userName == current.userName ) {
  67. return current.color
  68. }
  69. } )),
  70. fontSize: 10,
  71. width: '60px',
  72. height: '60px',
  73. color:'black'
  74. }
  75. }>
  76. {item.userName}
  77. </Avatar>
  78. <div
  79. key={item._id}
  80. onClick = {(e) => {
  81. if(e.target.className.includes('myMessage')){
  82. e.currentTarget.className += ' editMessage'
  83. }
  84. //add function to edit message
  85. }}
  86. className={
  87. (item.userName ==user.userName)
  88. ?
  89. 'message myMessage'
  90. :
  91. 'message'}
  92. >
  93. <p>{item.text}</p>
  94. <div
  95. style={{fontStyle:'italic',
  96. color: 'grey',
  97. fontSize: 14}}>
  98. {dateFormat(item).time}
  99. </div>
  100. <div
  101. style={{fontStyle:'italic',
  102. fontSize: 12,
  103. color: 'grey'}}>
  104. {dateFormat(item).year}
  105. </div>
  106. </div>
  107. </Fragment>
  108. )}
  109. <div ref={endMessages}></div>
  110. </Box>
  111. <MessageForm />
  112. </Box>
  113. <Box
  114. className='usersBox'
  115. sx={{
  116. overflow: 'scroll',
  117. }}>
  118. <Button
  119. sx={{margin:'10px 5px'}}
  120. variant="outlined"
  121. onClick={()=> {
  122. localStorage.removeItem('token');
  123. // socket.disconnect();
  124. dispatch(removeToken());
  125. }}>
  126. Logout
  127. </Button>
  128. <UserInfo
  129. data = {user.userName}
  130. color={userColor}/>
  131. {
  132. user.isAdmin
  133. ?
  134. allUsers.map((item) =>
  135. <div
  136. key={item._id}
  137. className='online'>
  138. <div style={
  139. {color: (usersOnline.map(current =>{
  140. if(item.userName == current.userName ) {
  141. return current.color
  142. }
  143. }))}}>{item.userName}</div>
  144. <div>
  145. <Button
  146. variant="contained"
  147. onClick={()=>{
  148. //muteUser(item.userName, item?.isMutted, socket)
  149. }}
  150. sx={{
  151. margin:'3px',
  152. height: '25px'
  153. }}>
  154. {/* {item.isMutted
  155. ?
  156. 'unmute'
  157. : 'mute'} */}
  158. </Button>
  159. <Button
  160. variant="contained"
  161. onClick={()=>{
  162. //banUser(item.userName, item.isBanned, socket)
  163. }}
  164. sx={{
  165. margin:'3px',
  166. height: '25px'
  167. }}>
  168. {item?.isBanned
  169. ? 'unban'
  170. : 'ban'}
  171. </Button>
  172. </div>
  173. {
  174. usersOnline.map((user, i) =>{
  175. if(item.userName == user.userName){
  176. return <span key={i} style={{color: 'green'}}>online</span>
  177. }
  178. })
  179. }
  180. </div>)
  181. :
  182. usersOnline.map((item, i) =>
  183. <div
  184. key={i}
  185. className='online'>
  186. <div style={{color: item.color}}>
  187. {item.userName}
  188. </div>
  189. <span style={{color: 'green'}}>
  190. online
  191. </span>
  192. </div>)
  193. }
  194. </Box>
  195. </Box>
  196. </div>
  197. )
  198. }