|
@@ -1,78 +1,99 @@
|
|
-import {Avatar, Box} from '@mui/material';
|
|
|
|
|
|
+import { Avatar, Box, StyledBadge } from '@mui/material';
|
|
import { dateFormat } from '../utils/dateFormat';
|
|
import { dateFormat } from '../utils/dateFormat';
|
|
import { useSelector } from 'react-redux';
|
|
import { useSelector } from 'react-redux';
|
|
-import { Fragment, useRef, useEffect, useMemo} from 'react';
|
|
|
|
|
|
+import { useRef, useEffect, useState} from 'react';
|
|
import { scrollToBottom } from '../utils/scrollToBottom';
|
|
import { scrollToBottom } from '../utils/scrollToBottom';
|
|
import { useDispatch } from 'react-redux';
|
|
import { useDispatch } from 'react-redux';
|
|
import { editMessage } from '../../../reducers/messageReducer';
|
|
import { editMessage } from '../../../reducers/messageReducer';
|
|
-import { TimeAgoMessage } from '../TimeAgoMessage';
|
|
|
|
|
|
+import { StyledAvatar } from './StyledAvatar';
|
|
|
|
+import { MessageEditorMenu } from '../MessageEditorMenu.jsx';
|
|
|
|
|
|
export const MessageForm = () => {
|
|
export const MessageForm = () => {
|
|
|
|
|
|
- const randomColor = require('randomcolor');
|
|
|
|
const dispatch = useDispatch();
|
|
const dispatch = useDispatch();
|
|
|
|
+
|
|
const SERVER_URL = process.env.REACT_APP_SERVER_URL|| 'http://localhost:5000/';
|
|
const SERVER_URL = process.env.REACT_APP_SERVER_URL|| 'http://localhost:5000/';
|
|
|
|
|
|
const startMessages = useSelector(state => state.getUserSocketReducer.startMessages)
|
|
const startMessages = useSelector(state => state.getUserSocketReducer.startMessages)
|
|
const user = useSelector(state => state.getUserSocketReducer.socketUserData)
|
|
const user = useSelector(state => state.getUserSocketReducer.socketUserData)
|
|
const usersOnline = useSelector(state => state.getUserSocketReducer.usersOnline)
|
|
const usersOnline = useSelector(state => state.getUserSocketReducer.usersOnline)
|
|
- const userColor = useMemo(() => randomColor(),[]);
|
|
|
|
|
|
+ const userNamesOnlineSet = new Set(usersOnline.map( i => i.userName))
|
|
|
|
+ const storeMessageId = useSelector(state => state.messageReducer.messageId)
|
|
|
|
+
|
|
|
|
|
|
- const endMessages = useRef(null);
|
|
|
|
|
|
+ const endMessages =useRef(null);
|
|
|
|
+
|
|
|
|
+ const regYoutube = /http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?/; //for youtube video
|
|
|
|
|
|
-
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
useEffect(() => {
|
|
scrollToBottom(endMessages)
|
|
scrollToBottom(endMessages)
|
|
}, [startMessages, usersOnline]);
|
|
}, [startMessages, usersOnline]);
|
|
|
|
|
|
return (
|
|
return (
|
|
- <Box className='messageBox'>
|
|
|
|
|
|
+ <Box className='messageBox'>
|
|
{
|
|
{
|
|
startMessages.map((item, i) =>
|
|
startMessages.map((item, i) =>
|
|
- <div key={i} className={
|
|
|
|
- (item.userName === user.userName)? 'message myMessage' :'message'}>
|
|
|
|
- {console.log(item)}
|
|
|
|
- <Avatar
|
|
|
|
-
|
|
|
|
- src= {SERVER_URL + item?.user?.avatar}
|
|
|
|
- sx={
|
|
|
|
- (item.userName == user.userName)
|
|
|
|
- ?
|
|
|
|
- {
|
|
|
|
- alignSelf: 'flex-end',
|
|
|
|
- backgroundColor: userColor
|
|
|
|
|
|
+ <div key={i + 1} className={
|
|
|
|
+ (item.userName === user.userName)? 'message myMessage' :'message'}
|
|
|
|
+ onClick = {(e) => {
|
|
|
|
+ if(e.target.className.includes('myMessage') && (item.userName === user.userName) && (item.text === e.target.textContent)){
|
|
|
|
+ e.currentTarget.className += ' editMessage'
|
|
|
|
+ dispatch(editMessage({editMessage: e.target.textContent, messageId: item._id}))
|
|
}
|
|
}
|
|
- :
|
|
|
|
- {
|
|
|
|
- backgroundColor: (usersOnline.map(current => {
|
|
|
|
- if(item.userName === current.userName ) {
|
|
|
|
- return current.color
|
|
|
|
- }
|
|
|
|
- } )),
|
|
|
|
|
|
+ }}
|
|
|
|
+ >
|
|
|
|
+
|
|
|
|
+ {storeMessageId === item._id ? <MessageEditorMenu/> : ""}
|
|
|
|
+
|
|
|
|
+ <StyledAvatar
|
|
|
|
+
|
|
|
|
+ anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
|
|
|
|
+ variant = {userNamesOnlineSet.has(item.userName)? 'dot' : ''}
|
|
|
|
+
|
|
|
|
+ >
|
|
|
|
+ <Avatar
|
|
|
|
+ key={i}
|
|
|
|
+ src= {SERVER_URL + item?.user?.avatar}
|
|
|
|
+ sx={
|
|
|
|
+ (item.userName == user.userName)
|
|
|
|
+ ?
|
|
|
|
+ {
|
|
|
|
+ alignSelf: 'flex-end',
|
|
|
|
+ }
|
|
|
|
+ :
|
|
|
|
+ {}
|
|
}
|
|
}
|
|
- }>
|
|
|
|
- {item?.userName.slice(0, 1)}
|
|
|
|
- </Avatar>
|
|
|
|
|
|
+
|
|
|
|
+ >
|
|
|
|
+ {item?.userName.slice(0, 1)}
|
|
|
|
+ </Avatar>
|
|
|
|
|
|
|
|
+
|
|
|
|
+ </StyledAvatar>
|
|
<div
|
|
<div
|
|
- key={item._id}
|
|
|
|
- onClick = {(e) => {
|
|
|
|
- if(e.target.className.includes('myMessage')){
|
|
|
|
- e.currentTarget.className += ' editMessage'
|
|
|
|
- startMessages.map( item => {
|
|
|
|
- if((item.userName === user.userName) && (item.text === e.target.textContent)){
|
|
|
|
- console.log('edit message',e.target.textContent )
|
|
|
|
- dispatch(editMessage({editMessage: e.target.textContent}))
|
|
|
|
- }
|
|
|
|
- })}
|
|
|
|
- }}
|
|
|
|
|
|
+ key={i/10}
|
|
|
|
+
|
|
className={
|
|
className={
|
|
(item.userName === user.userName)? 'message myMessage' :'message'}>
|
|
(item.userName === user.userName)? 'message myMessage' :'message'}>
|
|
-
|
|
|
|
|
|
+
|
|
|
|
+ {
|
|
|
|
+ item.text.match(regYoutube) ?
|
|
|
|
+ <iframe
|
|
|
|
+ width="280"
|
|
|
|
+ height="160"
|
|
|
|
+ src={`https://www.youtube.com/embed/`+ (item.text.match(regYoutube)[1])}
|
|
|
|
+ title="YouTube video player"
|
|
|
|
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
|
|
+ allowFullScreen>
|
|
|
|
+
|
|
|
|
+ </iframe>
|
|
|
|
+ :
|
|
<p>{item.text}</p>
|
|
<p>{item.text}</p>
|
|
|
|
+ }
|
|
|
|
|
|
</div>
|
|
</div>
|
|
|
|
+
|
|
<div className={
|
|
<div className={
|
|
(item.userName === user.userName)? 'myDate' :'date'}>
|
|
(item.userName === user.userName)? 'myDate' :'date'}>
|
|
{dateFormat(item).time}
|
|
{dateFormat(item).time}
|