|
@@ -1,96 +1,52 @@
|
|
-import { useEffect, useState, useMemo, useRef, Fragment} from 'react';
|
|
|
|
-import { MessageForm } from './messageForm/MessageForm';
|
|
|
|
|
|
+import { useEffect, useMemo, useRef, Fragment} from 'react';
|
|
import {Button,Avatar, Box} from '@mui/material';
|
|
import {Button,Avatar, Box} from '@mui/material';
|
|
import { UserInfo } from './userInfo/UserInfo';
|
|
import { UserInfo } from './userInfo/UserInfo';
|
|
import { dateFormat } from './utils/dateFormat';
|
|
import { dateFormat } from './utils/dateFormat';
|
|
-import {io} from 'socket.io-client';
|
|
|
|
import './chatPage.scss';
|
|
import './chatPage.scss';
|
|
import { scrollToBottom } from './utils/scrollToBottom';
|
|
import { scrollToBottom } from './utils/scrollToBottom';
|
|
import { banUser } from './service/banUser';
|
|
import { banUser } from './service/banUser';
|
|
import { muteUser } from './service/muteUser';
|
|
import { muteUser } from './service/muteUser';
|
|
-import {sendMessage} from './service/sendMessage';
|
|
|
|
import { store } from '../../store';
|
|
import { store } from '../../store';
|
|
import { removeToken} from '../../reducers/userDataReducer'
|
|
import { removeToken} from '../../reducers/userDataReducer'
|
|
|
|
+import { useDispatch, useSelector } from 'react-redux';
|
|
|
|
+import {getSocket} from'../../reducers/socketReducer';
|
|
|
|
+import { useState } from 'react';
|
|
|
|
+import TextareaAutosize from '@mui/material/TextareaAutosize';
|
|
|
|
+import { sendMessage, storeMessage } from '../../reducers/messageReducer';
|
|
|
|
|
|
|
|
+export const ChatPage = () => {
|
|
|
|
|
|
-import { useDispatch } from 'react-redux';
|
|
|
|
|
|
|
|
-export const ChatPage = () => {
|
|
|
|
-
|
|
|
|
- const [socket, setSocket] = useState(null);
|
|
|
|
- const [messages, setMessages] = useState([])
|
|
|
|
- const [user, setUser] = useState({})
|
|
|
|
- const [usersOnline, setUsersOnline] = useState([])
|
|
|
|
- const [allUsers, setAllUsers] = useState([])
|
|
|
|
- const randomColor = require('randomcolor');
|
|
|
|
- const endMessages = useRef(null);
|
|
|
|
- const token = localStorage.getItem('token');
|
|
|
|
|
|
+ const SOCKET_EVENTS = process.env.REACT_APP_SERVER_URL || ['allmessages', 'usersOnline', 'allDbUsers']
|
|
|
|
+
|
|
const dispatch = useDispatch();
|
|
const dispatch = useDispatch();
|
|
|
|
+ const token = useSelector(state => localStorage.getItem('token') || state.userDataReducer.token);
|
|
|
|
|
|
|
|
+ const startMessages = useSelector(state => state.getUserSocketReducer.startMessages)
|
|
|
|
+ const user = useSelector(state => state.getUserSocketReducer.socketUserData)
|
|
|
|
+ const usersOnline = useSelector(state => state.getUserSocketReducer.usersOnline)
|
|
|
|
+ const allUsers = useSelector(state => state.getUserSocketReducer.allUsers)
|
|
|
|
+ const socket = useSelector(state => state.getUserSocketReducer.socket)
|
|
|
|
+
|
|
|
|
+ const [message, setMessage] = useState({message: ''});
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ const randomColor = require('randomcolor');
|
|
|
|
+ const endMessages = useRef(null);
|
|
|
|
+
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
if(token){
|
|
if(token){
|
|
-
|
|
|
|
- try {
|
|
|
|
- setSocket(io.connect(
|
|
|
|
- process.env.REACT_APP_SERVER_URL || 'http://localhost:5000',
|
|
|
|
- {auth: {token}})
|
|
|
|
- )
|
|
|
|
- } catch (error) {
|
|
|
|
- console.log(error)
|
|
|
|
- }
|
|
|
|
|
|
+ SOCKET_EVENTS.map(event => dispatch(getSocket(event)))
|
|
}
|
|
}
|
|
}, [token])
|
|
}, [token])
|
|
|
|
|
|
- useEffect(() => {
|
|
|
|
-
|
|
|
|
- if(socket){
|
|
|
|
- socket.on('connected', (data) => {
|
|
|
|
- setUser(data);
|
|
|
|
- }).on('error', (e) => {
|
|
|
|
- console.log('On connected', e)
|
|
|
|
- });
|
|
|
|
- socket.on('allmessages', (data) => {
|
|
|
|
- setMessages(data)
|
|
|
|
- }).on('error', (e) => {
|
|
|
|
- console.log('allmessages', e)
|
|
|
|
- });
|
|
|
|
- socket.on('usersOnline', (data) => {
|
|
|
|
- setUsersOnline(data)
|
|
|
|
- }).on('error', (e) => {
|
|
|
|
- console.log(e)
|
|
|
|
- });
|
|
|
|
- socket.on('allDbUsers', (data) => {
|
|
|
|
- setAllUsers(data);
|
|
|
|
- }).on('error', (e) => {
|
|
|
|
- console.log(e)
|
|
|
|
- });
|
|
|
|
- socket.on('disconnect', (data) => {
|
|
|
|
- if(data === 'io server disconnect') {
|
|
|
|
- socket.disconnect();
|
|
|
|
- store.dispatch(removeToken());
|
|
|
|
- }
|
|
|
|
- }).on('error', (e) => {
|
|
|
|
- console.log('error token', e)
|
|
|
|
- });
|
|
|
|
- socket.on('message', (data) => {
|
|
|
|
- setMessages((messages) => [...messages, data] )
|
|
|
|
- }).on('error', (e) => {
|
|
|
|
- console.log(e)
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // return () => {
|
|
|
|
- // socket.off('connected');
|
|
|
|
- // socket.off('allmessages');
|
|
|
|
- // }
|
|
|
|
- }, [socket])
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
|
|
+ console.log('useEffect chat page')
|
|
scrollToBottom(endMessages)
|
|
scrollToBottom(endMessages)
|
|
- }, [messages]);
|
|
|
|
|
|
+ }, [startMessages]);
|
|
|
|
|
|
- let userColor = useMemo(() => randomColor(),[]);//color for myavatar
|
|
|
|
|
|
+ const userColor = useMemo(() => randomColor(),[]);//color for myavatar
|
|
|
|
|
|
return (
|
|
return (
|
|
<div className='rootContainer'>
|
|
<div className='rootContainer'>
|
|
@@ -108,7 +64,7 @@ export const ChatPage = () => {
|
|
}}>
|
|
}}>
|
|
<Box className='messageBox'>
|
|
<Box className='messageBox'>
|
|
{
|
|
{
|
|
- messages.map((item, i) =>
|
|
|
|
|
|
+ startMessages.map((item, i) =>
|
|
<Fragment key={i} >
|
|
<Fragment key={i} >
|
|
<Avatar
|
|
<Avatar
|
|
sx={
|
|
sx={
|
|
@@ -125,7 +81,7 @@ export const ChatPage = () => {
|
|
:
|
|
:
|
|
{
|
|
{
|
|
backgroundColor: (usersOnline.map(current => {
|
|
backgroundColor: (usersOnline.map(current => {
|
|
- if(item.userName == current.userName ) {
|
|
|
|
|
|
+ if(item.userName === current.userName ) {
|
|
return current.color
|
|
return current.color
|
|
}
|
|
}
|
|
|
|
|
|
@@ -148,7 +104,7 @@ export const ChatPage = () => {
|
|
}}
|
|
}}
|
|
|
|
|
|
className={
|
|
className={
|
|
- (item.userName ==user.userName)
|
|
|
|
|
|
+ (item.userName === user.userName)
|
|
?
|
|
?
|
|
'message myMessage'
|
|
'message myMessage'
|
|
:
|
|
:
|
|
@@ -174,10 +130,58 @@ export const ChatPage = () => {
|
|
<div ref={endMessages}></div>
|
|
<div ref={endMessages}></div>
|
|
|
|
|
|
</Box>
|
|
</Box>
|
|
- <MessageForm
|
|
|
|
- data = {user}
|
|
|
|
- sendMessage = {data => sendMessage(data, socket)}>
|
|
|
|
- </MessageForm>
|
|
|
|
|
|
+ <Box
|
|
|
|
+ component="form"
|
|
|
|
+ onSubmit = {e =>
|
|
|
|
+ {
|
|
|
|
+ e.preventDefault()
|
|
|
|
+ dispatch(sendMessage({user, socket}))
|
|
|
|
+ dispatch(getSocket('allmessages'))
|
|
|
|
+ setMessage({message: ''})
|
|
|
|
+ }}
|
|
|
|
+
|
|
|
|
+ sx={{
|
|
|
|
+ display: 'flex',
|
|
|
|
+ margin: '20px 5px'
|
|
|
|
+ }}>
|
|
|
|
+
|
|
|
|
+ <TextareaAutosize
|
|
|
|
+ id="outlined-basic"
|
|
|
|
+ label="Type a message..."
|
|
|
|
+ variant="outlined"
|
|
|
|
+ value={message.message}
|
|
|
|
+ placeholder='type you message...'
|
|
|
|
+ minRows={3}
|
|
|
|
+ maxRows={4}
|
|
|
|
+ onKeyPress={(e) => {
|
|
|
|
+ if (e.key === "Enter") {
|
|
|
|
+ e.preventDefault();
|
|
|
|
+ dispatch(sendMessage({user, socket}))
|
|
|
|
+ dispatch(getSocket('allmessages'))
|
|
|
|
+ setMessage({message: ''})
|
|
|
|
+ }
|
|
|
|
+ }}
|
|
|
|
+ onChange={e => {
|
|
|
|
+ dispatch(storeMessage({message: e.target.value}))
|
|
|
|
+ setMessage({message: e.target.value})}
|
|
|
|
+ }
|
|
|
|
+ style={{
|
|
|
|
+ width: '80%',
|
|
|
|
+ resize: 'none',
|
|
|
|
+ borderRadius: '4px',
|
|
|
|
+ }}
|
|
|
|
+ />
|
|
|
|
+ <Button
|
|
|
|
+ variant="contained"
|
|
|
|
+ type='submit'
|
|
|
|
+ disabled={user?.isMutted}
|
|
|
|
+ style={{
|
|
|
|
+ width: '20%',
|
|
|
|
+ }}
|
|
|
|
+ >
|
|
|
|
+ Send
|
|
|
|
+ </Button>
|
|
|
|
+ </Box>
|
|
</Box>
|
|
</Box>
|
|
|
|
|
|
<Box
|
|
<Box
|
|
@@ -188,10 +192,10 @@ export const ChatPage = () => {
|
|
<Button
|
|
<Button
|
|
sx={{margin:'10px 5px'}}
|
|
sx={{margin:'10px 5px'}}
|
|
variant="outlined"
|
|
variant="outlined"
|
|
- onClick={(e)=> {
|
|
|
|
- socket.disconnect();
|
|
|
|
- localStorage.removeItem('token');
|
|
|
|
- dispatch(removeToken());
|
|
|
|
|
|
+ onClick={()=> {
|
|
|
|
+ localStorage.removeItem('token');
|
|
|
|
+ socket.disconnect();
|
|
|
|
+ dispatch(removeToken());
|
|
}}>
|
|
}}>
|
|
Logout
|
|
Logout
|
|
</Button>
|
|
</Button>
|
|
@@ -207,46 +211,52 @@ export const ChatPage = () => {
|
|
key={item._id}
|
|
key={item._id}
|
|
className='online'>
|
|
className='online'>
|
|
<div style={
|
|
<div style={
|
|
- {color: (usersOnline.map(current =>{
|
|
|
|
|
|
+ {color: (usersOnline.map(current => {
|
|
if(item.userName == current.userName ) {
|
|
if(item.userName == current.userName ) {
|
|
return current.color
|
|
return current.color
|
|
}
|
|
}
|
|
|
|
|
|
}))}}>{item.userName}</div>
|
|
}))}}>{item.userName}</div>
|
|
<div>
|
|
<div>
|
|
- <Button
|
|
|
|
- variant="contained"
|
|
|
|
- onClick={()=>{
|
|
|
|
- muteUser(item.userName, item.isMutted, socket)
|
|
|
|
- }}
|
|
|
|
- sx={{
|
|
|
|
- margin:'3px',
|
|
|
|
- height: '25px'
|
|
|
|
- }}>
|
|
|
|
- {item.isMutted
|
|
|
|
- ?
|
|
|
|
- 'unmute'
|
|
|
|
- : 'mute'}
|
|
|
|
- </Button>
|
|
|
|
|
|
+ { (user.userName === item.userName )?
|
|
|
|
+ 'admin'
|
|
|
|
+ :
|
|
|
|
+ <>
|
|
|
|
+ <Button
|
|
|
|
+ variant="contained"
|
|
|
|
+ onClick={()=>{
|
|
|
|
+ muteUser(item.userName, item?.isMutted, socket)
|
|
|
|
+ }}
|
|
|
|
+ sx={{
|
|
|
|
+ margin:'3px',
|
|
|
|
+ height: '25px'
|
|
|
|
+ }}>
|
|
|
|
+ {item.isMutted
|
|
|
|
+ ?
|
|
|
|
+ 'unmute'
|
|
|
|
+ : 'mute'}
|
|
|
|
+ </Button>
|
|
|
|
|
|
- <Button
|
|
|
|
- variant="contained"
|
|
|
|
- onClick={()=>{
|
|
|
|
|
|
+ <Button
|
|
|
|
+ variant="contained"
|
|
|
|
+ onClick={()=>{
|
|
banUser(item.userName, item.isBanned, socket)
|
|
banUser(item.userName, item.isBanned, socket)
|
|
- }}
|
|
|
|
- sx={{
|
|
|
|
- margin:'3px',
|
|
|
|
- height: '25px'
|
|
|
|
- }}>
|
|
|
|
- {item.isBanned
|
|
|
|
- ? 'unban'
|
|
|
|
- : 'ban'}
|
|
|
|
- </Button>
|
|
|
|
-
|
|
|
|
|
|
+ }}
|
|
|
|
+ sx={{
|
|
|
|
+ margin:'3px',
|
|
|
|
+ height: '25px'
|
|
|
|
+ }}>
|
|
|
|
+ {item?.isBanned
|
|
|
|
+ ? 'unban'
|
|
|
|
+ : 'ban'}
|
|
|
|
+ </Button>
|
|
|
|
+ </>
|
|
|
|
+ }
|
|
|
|
+
|
|
</div>
|
|
</div>
|
|
{
|
|
{
|
|
- usersOnline.map((user, i) =>{
|
|
|
|
- if(item.userName == user.userName){
|
|
|
|
|
|
+ usersOnline.map((user, i) => {
|
|
|
|
+ if(item.userName === user.userName){
|
|
return <span key={i} style={{color: 'green'}}>online</span>
|
|
return <span key={i} style={{color: 'green'}}>online</span>
|
|
}
|
|
}
|
|
})
|
|
})
|