UserInfo.jsx 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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 } from '../../../reducers/userDataReducer';
  8. import { useState, useEffect } from 'react';
  9. import { store } from '../../../store';
  10. import { getSocket } from '../../../reducers/socketReducer';
  11. export const UserInfo = () => {
  12. const PC_AVATAR_STYLE = {
  13. bgcolor: 'grey',
  14. width: '100px',
  15. height: '100px',
  16. fontSize: 14,
  17. margin: '20px auto',
  18. cursor: 'pointer'
  19. };
  20. const MOBILE_AVATAR_STYLE = { margin: '5px auto'};
  21. const [displayType, setDisplayType] = useState('none');
  22. const dispatch = useDispatch();
  23. const loadAvatarHandler = () => {
  24. setDisplayType('block')
  25. setTimeout(() => {
  26. setDisplayType('none')
  27. }, 4000)
  28. }
  29. const SERVER_URL = process.env.REACT_APP_SERVER_URL
  30. const allUsers = useSelector(state => state.getUserSocketReducer.allUsers)
  31. const user = useSelector(state => state.getUserSocketReducer.socketUserData)
  32. const usersOnline = useSelector(state => state.getUserSocketReducer.usersOnline);
  33. const socket = useSelector(state => state.getUserSocketReducer.socket)
  34. const isTabletorMobile = (window.screen.width < 730);
  35. const storeUserAvatar = useSelector(state => state.userDataReducer.avatar)
  36. let userAvatarUrl = storeUserAvatar || user.avatar;
  37. const userNamesOnlineSet = new Set(usersOnline.map( i => i.userName))
  38. const inputHandler = (e) => {
  39. const file = e.target.files[0]
  40. dispatch(getUserAvatar(file))
  41. setDisplayType('none')
  42. }
  43. return (
  44. <>
  45. <h4> Hello, {user.userName} </h4>
  46. <Avatar
  47. sx={isTabletorMobile ? MOBILE_AVATAR_STYLE : PC_AVATAR_STYLE} //add deleting function after update avatar
  48. onClick={() => loadAvatarHandler()}
  49. src={userAvatarUrl ? SERVER_URL +'/'+ userAvatarUrl : ""}
  50. >
  51. </Avatar>
  52. <input
  53. type="file"
  54. accept="image/png, image/jpeg"
  55. name='file'
  56. style = {{
  57. display: displayType
  58. }}
  59. onChange = {e => inputHandler(e)}
  60. />
  61. {user.isAdmin && !isTabletorMobile ?
  62. allUsers.map((item, key) =>
  63. <div
  64. key={item._id}
  65. className='online'
  66. onClick={() => console.log(item.id)}
  67. >
  68. <div>
  69. {item.userName}
  70. </div>
  71. <div>
  72. {(user.userName === item.userName )?
  73. "admin"
  74. :
  75. <>
  76. <Button
  77. variant="contained"
  78. onClick={()=>{
  79. muteUser(item.userName, item?.isMutted, socket)
  80. }}
  81. sx={(isTabletorMobile)
  82. ?
  83. {height: '15px',
  84. maxWidth:'20px'}:
  85. {
  86. margin:'3px',
  87. height: '25px'}}>
  88. {item.isMutted
  89. ?
  90. 'unmute'
  91. : 'mute'}
  92. </Button>
  93. <Button
  94. variant="contained"
  95. onClick={()=>{
  96. banUser(item.userName, item.isBanned, socket)
  97. }}
  98. sx={(isTabletorMobile)
  99. ?
  100. {height: '15px',
  101. margin:'2px'} :
  102. {
  103. margin:'3px',
  104. height: '25px'}}
  105. >
  106. {item?.isBanned ? 'unban' : 'ban'}
  107. </Button>
  108. </>}
  109. </div>
  110. {
  111. userNamesOnlineSet.has(item.userName)?
  112. <span key={key} style={{color: 'green'}}>online</span>
  113. : ''
  114. }
  115. </div>)
  116. :
  117. !isTabletorMobile && usersOnline.map((item, i) =>
  118. <div
  119. key={i}
  120. className='online'
  121. onClick={() => console.log(item.id)}
  122. >
  123. <div style={{color: item.color}}>
  124. {item.userName}
  125. </div>
  126. <span style={{color: 'green'}}>
  127. online
  128. </span>
  129. </div>)
  130. }
  131. </>
  132. )
  133. }