UserInfo.jsx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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|| 'http://localhost:5000/';
  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 ?
  62. allUsers.map((item, key) =>
  63. <div
  64. key={item._id}
  65. className='online'>
  66. <div>
  67. {item.userName}
  68. </div>
  69. <div>
  70. {(user.userName === item.userName )?
  71. "admin"
  72. :
  73. <>
  74. <Button
  75. variant="contained"
  76. onClick={()=>{
  77. muteUser(item.userName, item?.isMutted, socket)
  78. }}
  79. sx={(isTabletorMobile)
  80. ?
  81. {height: '15px',
  82. maxWidth:'20px'}:
  83. {
  84. margin:'3px',
  85. height: '25px'}}>
  86. {item.isMutted
  87. ?
  88. 'unmute'
  89. : 'mute'}
  90. </Button>
  91. <Button
  92. variant="contained"
  93. onClick={()=>{
  94. banUser(item.userName, item.isBanned, socket)
  95. }}
  96. sx={(isTabletorMobile)
  97. ?
  98. {height: '15px',
  99. margin:'2px'} :
  100. {
  101. margin:'3px',
  102. height: '25px'}}
  103. >
  104. {item?.isBanned ? 'unban' : 'ban'}
  105. </Button>
  106. </>}
  107. </div>
  108. {
  109. userNamesOnlineSet.has(item.userName)?
  110. <span key={key} style={{color: 'green'}}>online</span>
  111. : ''
  112. }
  113. </div>)
  114. :
  115. usersOnline.map((item, i) =>
  116. <div
  117. key={i}
  118. className='online'>
  119. <div style={{color: item.color}}>
  120. {item.userName}
  121. </div>
  122. <span style={{color: 'green'}}>
  123. online
  124. </span>
  125. </div>)
  126. }
  127. </>
  128. )
  129. }