UserInfo.jsx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. import {Button,Avatar} from '@mui/material';
  2. import { useSelector } from 'react-redux';
  3. import { banUser } from '../service/banUser';
  4. import { muteUser } from '../service/muteUser';
  5. import './userInfo.scss';
  6. import { useDispatch } from 'react-redux';
  7. import { getUserAvatar, privateMessage } from '../../../reducers/userDataReducer';
  8. import { useState, useEffect } from 'react';
  9. import { store } from '../../../store';
  10. import { getSocket } from '../../../reducers/socketReducer';
  11. import { StyledAvatar } from '../messageForm/StyledAvatar';
  12. export const UserInfo = () => {
  13. const PC_AVATAR_STYLE = {
  14. bgcolor: 'grey',
  15. width: '100px',
  16. height: '100px',
  17. fontSize: 14,
  18. margin: '20px auto',
  19. cursor: 'pointer'
  20. };
  21. const MOBILE_AVATAR_STYLE = { margin: '5px auto'};
  22. const [displayType, setDisplayType] = useState('none');
  23. const dispatch = useDispatch();
  24. const loadAvatarHandler = () => {
  25. setDisplayType('block')
  26. setTimeout(() => {
  27. setDisplayType('none')
  28. }, 4000)
  29. }
  30. const SERVER_URL = process.env.REACT_APP_SERVER_URL
  31. const allUsers = useSelector(state => state.getUserSocketReducer.allUsers)
  32. const user = useSelector(state => state.getUserSocketReducer.socketUserData)
  33. const usersOnline = useSelector(state => state.getUserSocketReducer.usersOnline);
  34. const socket = useSelector(state => state.getUserSocketReducer.socket)
  35. const isTabletorMobile = (window.screen.width < 730);
  36. const storeUserAvatar = useSelector(state => state.userDataReducer.avatar)
  37. const isPrivatChat = useSelector(state => state.userDataReducer.isPrivatChat)
  38. const chatId = useSelector(state => state.userDataReducer.chatId)
  39. let userAvatarUrl = storeUserAvatar || user.avatar;
  40. const userNamesOnlineSet = new Set(usersOnline.map( i => i.userName))
  41. const inputHandler = (e) => {
  42. const file = e.target.files[0]
  43. dispatch(getUserAvatar(file))
  44. setDisplayType('none')
  45. }
  46. return (
  47. <>
  48. <h4 style={{color:'white'}}> Hello, {user.userName} </h4>
  49. <Avatar
  50. sx={isTabletorMobile ? MOBILE_AVATAR_STYLE : PC_AVATAR_STYLE} //add deleting function after update avatar
  51. onClick={() => loadAvatarHandler()}
  52. src={userAvatarUrl ? SERVER_URL +'/'+ userAvatarUrl : ""}
  53. >
  54. </Avatar>
  55. <input
  56. type="file"
  57. accept="image/png, image/jpeg"
  58. name='file'
  59. style = {{
  60. display: displayType
  61. }}
  62. onChange = {e => inputHandler(e)}
  63. />
  64. {user.isAdmin && !isTabletorMobile ?
  65. allUsers.map((item, key) =>
  66. (user.userName !== item.userName) && <div
  67. key={item._id}
  68. className='online'
  69. onClick={() => console.log(item._id)}
  70. >
  71. {/* <StyledAvatar
  72. anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
  73. variant = {userNamesOnlineSet.has(item.userName)? 'dot' : ''}
  74. >
  75. <Avatar
  76. src= {SERVER_URL + '/'+ item?.user?.avatar}
  77. sx={ {alignSelf: 'flex-end'}}
  78. >
  79. {item?.userName.slice(0, 1)}
  80. </Avatar>
  81. </StyledAvatar> */}
  82. <div>
  83. {item.userName}
  84. </div>
  85. <div>
  86. {(user.userName === item.userName )?
  87. "admin"
  88. :
  89. <>
  90. <Button
  91. variant="contained"
  92. onClick={()=>{
  93. muteUser(item.userName, item?.isMutted, socket)
  94. }}
  95. sx={(isTabletorMobile)
  96. ?
  97. {height: '15px',
  98. maxWidth:'20px'}:
  99. {
  100. margin:'3px',
  101. height: '25px'}}>
  102. {item.isMutted
  103. ?
  104. 'unmute'
  105. : 'mute'}
  106. </Button>
  107. <Button
  108. variant="contained"
  109. onClick={()=>{
  110. banUser(item.userName, item.isBanned, socket)
  111. }}
  112. sx={(isTabletorMobile)
  113. ?
  114. {height: '15px',
  115. margin:'2px'} :
  116. {
  117. margin:'3px',
  118. height: '25px'}}
  119. >
  120. {item?.isBanned ? 'unban' : 'ban'}
  121. </Button>
  122. </>}
  123. </div>
  124. {
  125. userNamesOnlineSet.has(item.userName)?
  126. <span key={key} style={{color: 'green'}}>online</span>
  127. : ''
  128. }
  129. </div>)
  130. :
  131. !isTabletorMobile && usersOnline.map((item, i) =>
  132. (user.userName !== item.userName) &&
  133. <div
  134. key={i}
  135. className={isPrivatChat&&(chatId==user._id)? 'online active' :'online' }
  136. onClick={() => {
  137. console.log(item.userName)
  138. store.dispatch(privateMessage(user._id))
  139. socket.emit('private message', user )
  140. }
  141. }
  142. >
  143. <div style={{color: item.color}}>
  144. <StyledAvatar sx={{ marginRight:2}}
  145. >
  146. <Avatar
  147. key={i}
  148. src= {SERVER_URL + '/'+ item?.avatar}
  149. sx={{ alignSelf: 'flex-end'}}
  150. >
  151. {item?.userName.slice(0, 1)}
  152. </Avatar>
  153. </StyledAvatar>
  154. {item.userName}
  155. </div>
  156. <span style={{color: 'green'}}>
  157. online
  158. </span>
  159. </div>)
  160. }
  161. </>
  162. )
  163. }